Сегодня на нашем домашнем TrueNAS развернём SOCKS5 Proxy. Идея простая: NAS будет автоматически строить SSH туннель к удалённому серверу. А все домашние устройства смогут подключаться к NAS как к SOCKS5 прокси.
Принцип действия точно такой же, как при построении туннеля с помощью PuTTY:
PuTTY — SOCKS5 прокси через SSH-туннель
Сам TrueNAS не умеет строить туннели, но ничего не мешает нам воспользоваться приложением. Использовать будем Termix.
Termix — менеджер SSH подключений и не только
В нашем случае подойдёт одна полезная функция Termix — Туннели. Приложение умеет строить и поддерживать локальные, удалённые и динамические SOCKS5 SSH-туннели с автоматическим переподключением и мониторингом.
Установка Termix в TrueNAS
Установка предельно простоя.

Apps → Discover Apps. Находим приложение Termix.

Install.

Все настройки оставляем по умолчанию.

HTTP порт 30351. HTTPS порт 30395.

Ресурсов выделяем по минимуму, Termix не требовательный.

Install.

Приложение устанавливается.

И запускается. Я уже второй экземпляр ставлю, порты у меня отличаются от тех, что идут по умолчанию.

Тыкаем в кнопку HTTP или переходим по адресу NAS и порту, указанному нами для HTTP протокола в Termix. Регистрируем аккаунт, Sign Up.

Зарегистрировались, выполнили вход. Скипаем (или читаем) туториал.

Добавляем хост, к которому будем строить туннель. Add host.

Указываем IP адрес, придумываем имя, протокол SSH.
На вкладке SSH указываем порт, логин и пароль. Или настраиваем аутентификацию по ключу. Add Host.

Хост добавлен, убеждаемся что можем подключиться к нему.

Когда подключиться удалось, то пол дела сделано.

Редактируем хост. Переходим в SSH → Tunnels и добавляем туннель.
- Tunnel Type: DYNAMIC
- Bind Host: 0.0.0.0 — это все интерфейсы внутри контейнера
- Source Port: 3128 — можно и другой, я для примера воспользуюсь стандартным
- Auto-start: включаем
Update Host.
Пробуем подключиться к туннелю: Connect.

Через какое-то время туннель поднимается, у нас один ACTIVE TUNNELS.
И всё было бы хорошо, однако, разработчики не предусмотрели такого варианта использования Termix в TrueNAS. И не добавили возможность проброса дополнительных портов в контейнер. Не беда.

Выбираем наше приложение, три точки, Convert to custom app.

Подтверждаем, конвертируем.

Теперь при редактировании приложения у нас доступен YAML файл конфигурации.

Добавляем в конфигурационный файл наш порт 3128.
- mode: ingress
protocol: tcp
published: 3128
target: 3128Полный вариант моего YAML такой:
configs:
permissions_actions_data:
content: >-
[{"read_only": false, "mount_path": "/mnt/permission/data",
"is_temporary": false, "identifier": "data", "recursive": false, "mode":
"check", "uid": 1000, "gid": 1000, "chmod": null}]
networks:
ix-internal-termix-termix-net:
enable_ipv6: False
external: False
labels:
tn.network.internal: 'true'
name: ix-internal-termix-termix-net
services:
guacd:
cap_drop:
- ALL
command:
- '-l'
- '30395'
deploy:
resources:
limits:
cpus: '2'
memory: 4096M
environment:
HOME: /tmp
NVIDIA_VISIBLE_DEVICES: void
TZ: Europe/Moscow
UMASK: '002'
UMASK_SET: '002'
group_add:
- 568
healthcheck:
interval: 30s
retries: 5
start_interval: 2s
start_period: 15s
test:
- CMD
- nc
- '-z'
- '-w'
- '1'
- 127.0.0.1
- '30395'
timeout: 5s
image: guacamole/guacd:1.6.0
networks:
ix-internal-termix-termix-net: {}
platform: linux/amd64
ports:
- mode: ingress
protocol: tcp
published: 30395
target: 30395
privileged: False
restart: unless-stopped
security_opt:
- no-new-privileges=true
stdin_open: False
stop_grace_period: 60s
tty: False
user: '568:568'
permissions:
cap_add:
- CHOWN
- DAC_OVERRIDE
- FOWNER
cap_drop:
- ALL
configs:
- mode: 320
source: permissions_actions_data
target: /script/actions.json
deploy:
resources:
limits:
cpus: '2'
memory: 1024M
entrypoint:
- python3
- /script/permissions.py
environment:
NVIDIA_VISIBLE_DEVICES: void
TZ: Europe/Moscow
UMASK: '002'
UMASK_SET: '002'
group_add:
- 568
healthcheck:
disable: True
image: ixsystems/container-utils:1.0.2
network_mode: none
platform: linux/amd64
privileged: False
restart: on-failure:1
security_opt:
- no-new-privileges=true
stdin_open: False
tty: False
user: '0:0'
volumes:
- bind:
create_host_path: False
propagation: rprivate
read_only: False
source: /mnt/.ix-apps/app_mounts/termix/data
target: /mnt/permission/data
type: bind
termix:
cap_drop:
- ALL
depends_on:
guacd:
condition: service_healthy
permissions:
condition: service_completed_successfully
deploy:
resources:
limits:
cpus: '2'
memory: 4096M
environment:
ENABLE_GUACAMOLE: 'true'
GUACD_HOST: guacd
GUACD_PORT: '30395'
NVIDIA_VISIBLE_DEVICES: void
PORT: '30351'
TZ: Europe/Moscow
UMASK: '002'
UMASK_SET: '002'
group_add:
- 568
healthcheck:
interval: 30s
retries: 5
start_interval: 2s
start_period: 15s
test:
- CMD
- wget
- '--quiet'
- '--spider'
- http://127.0.0.1:30001/health
timeout: 5s
image: ghcr.io/lukegus/termix:release-2.8.0
networks:
ix-internal-termix-termix-net: {}
platform: linux/amd64
ports:
- mode: ingress
protocol: tcp
published: 30351
target: 30351
- mode: ingress
protocol: tcp
published: 3128
target: 3128
privileged: False
restart: unless-stopped
security_opt:
- no-new-privileges=true
stdin_open: False
tty: False
user: '1000:1000'
volumes:
- bind:
create_host_path: False
propagation: rprivate
read_only: False
source: /mnt/.ix-apps/app_mounts/termix/data
target: /app/data
type: bind
volumes: {}
x-action-required: False
x-notes: >
# Termix
## Security
**Read the following security precautions to ensure that you wish to continue
using this application.**
---
### Container: [guacd]
#### Joined networks
- ix-internal-termix-termix-net
#### Running user/group(s)
- User: 568
- Group: 568
- Supplementary Groups: apps
---
### Container: [termix]
#### Joined networks
- ix-internal-termix-termix-net
#### Running user/group(s)
- User: 1000
- Group: 1000
- Supplementary Groups: apps
---
### Container: [permissions]
**This container is short-lived.**
#### Running user/group(s)
- User: root
- Group: root
- Supplementary Groups: apps
---
## Bug Reports and Feature Requests
If you find a bug in this app or have an idea for a new feature, please file
an issue at
https://github.com/truenas/apps
x-portals:
- host: 0.0.0.0
name: HTTP
path: /
port: 30351
scheme: httpSave, сохраняем конфигурацию. Перезапускаем приложение.

Приложение запущено. Видим, что добавился проброс порта 3128.

Порт доступен.
Попробуем с ноутбука в домашней сети проверить работу нашего SOCKS5 Proxy.

Настроим прокси в FireFox. OK.
Теперь наш браузер ходит в Интернет под IP адресом выбранного хоста через SSH-туннель.