Перейти к основному содержанию

TrueNAS как SOCKS5 прокси

TrueNAS

Сегодня на нашем домашнем TrueNAS развернём SOCKS5 Proxy. Идея простая: NAS будет автоматически строить SSH туннель к удалённому серверу. А все домашние устройства смогут подключаться к NAS как к SOCKS5 прокси.

Принцип действия точно такой же, как при построении туннеля с помощью PuTTY:

PuTTY — SOCKS5 прокси через SSH-туннель

Сам TrueNAS не умеет строить туннели, но ничего не мешает нам воспользоваться приложением. Использовать будем Termix.

Termix — менеджер SSH подключений и не только

Termix — это бесплатная платформа с открытым исходным кодом для централизованного управления серверами. Она объединяет в одном месте SSH-терминалы, удалённые рабочие столы (RDP, VNC, Telnet), инструменты для работы с файлами, контейнерами, мониторинг ресурсов и автоматизацию.

В нашем случае подойдёт одна полезная функция Termix — Туннели. Приложение умеет строить и поддерживать локальные, удалённые и динамические SOCKS5 SSH-туннели с автоматическим переподключением и мониторингом.

Установка Termix в TrueNAS

Установка предельно простоя.

nas

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

nas

 Install.

nas

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

nas

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

nas

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

nas

Install.

nas

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

nas

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

nas

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

nas

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

nas

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

nas

Указываем IP адрес, придумываем имя, протокол SSH.

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

nas

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

nas

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

nas

Редактируем хост. Переходим в SSH → Tunnels и добавляем туннель.

  • Tunnel Type: DYNAMIC
  • Bind Host: 0.0.0.0 — это все интерфейсы внутри контейнера
  • Source Port: 3128 — можно и другой, я для примера воспользуюсь стандартным
  • Auto-start: включаем

Update Host.

Пробуем подключиться к туннелю: Connect.

nas

Через какое-то время туннель поднимается, у нас один ACTIVE TUNNELS.

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

nas

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

nas

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

nas

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

nas

Добавляем в конфигурационный файл наш порт 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: http

Save, сохраняем конфигурацию. Перезапускаем приложение.

nas

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

nas

Порт доступен.

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

nas

Настроим прокси в FireFox. OK.

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

 

Похожие материалы