Перенаправляем весь трафик контейнера через SOCKS-прокси с помощью tun2socks
Опубликовано 17.06.2025
Иногда возникает необходимость направлять весь исходящий трафик определённого контейнера через прокси-сервер. Это может быть полезно для обеспечения анонимности, обхода геоблокировок или для тестирования сетевых конфигураций. В этой статье мы рассмотрим, как настроить такую систему, используя утилиту tun2socks и правила iptables, а также как управлять этим процессом с помощью systemd.
Что такое tun2socks?
tun2socks – это мощный инструмент, который позволяет перенаправлять сетевой трафик, предназначенный для TUN-устройства, через SOCKS-прокси. Он создаёт виртуальный сетевой интерфейс (TUN-устройство), весь трафик которого заворачивается в SOCKS-соединение. Это особенно удобно, когда прямое проксирование на уровне приложения невозможно или нежелательно.
Установка tun2socks
Для начала нам нужно установить tun2socks. Мы будем использовать предварительно скомпилированные бинарные файлы с GitHub.
Перейдите на страницу релизов tun2socks: https://github.com/xjasonlyu/tun2socks/releases
Выберите последнюю стабильную версию и загрузите подходящий архив для вашей архитектуры (например,
tun2socks-linux-amd64.tar.gzдля 64-битных систем Linux).Распакуйте архив и переместите исполняемый файл в системный путь, например,
/usr/local/bin/:# Пример для linux-amd64, замените версию на актуальную wget https://github.com/xjasonlyu/tun2socks/releases/download/v2.5.1/tun2socks-linux-amd64.tar.gz tar -xvf tun2socks-linux-amd64.tar.gz sudo mv tun2socks-linux-amd64/tun2socks /usr/local/bin/tun2socks sudo chmod +x /usr/local/bin/tun2socksУбедитесь, что путь к бинарнику в вашем скрипте совпадает с фактическим. В нашем примере это
/usr/local/bin/tun2socks.
Скрипт перенаправления трафика
Теперь давайте рассмотрим скрипт, который автоматизирует процесс настройки TUN-устройства, iptables и запуска tun2socks.
Важное замечание: Для корректной работы с systemd, мы немного изменим скрипт, чтобы tun2socks запускался в фоновом режиме, и скрипт мог завершиться, а systemd уже управлял процессом tun2socks.
#!/bin/bash
set -euo pipefail
# Конфигурация
TUN_DEV="tun0" # Название TUN-устройства
TUN_ADDR="10.0.0.2/24" # IP-адрес для TUN-устройства
FWMARK="100" # Метка для трафика
ROUTE_TABLE="100" # Номер таблицы маршрутизации
CONTAINER_IP="172.29.172.2" # IP-адрес вашего контейнера, трафик которого нужно перенаправлять
SOCKS_PROXY="socks5://username:password@xxx.xxx.xxx.xx:yyyyy" # Адрес SOCKS5-прокси (с аутентификацией)
TUN2SOCKS_BIN="/usr/local/bin/tun2socks" # Путь к исполняемому файлу tun2socks
# Путь к PID-файлу, который будет использоваться systemd
PID_FILE="/var/run/tun2socks.pid"
# Функция для очистки правил
cleanup() {
echo "[INFO] Очистка старых маршрутов и iptables..."
# Удаляем правила в обратном порядке создания
iptables -t nat -D POSTROUTING -o "$TUN_DEV" -j MASQUERADE 2>/dev/null || true
iptables -t mangle -D PREROUTING -s "$CONTAINER_IP" -p tcp -j MARK --set-mark "$FWMARK" 2>/dev/null || true
ip route flush table "$ROUTE_TABLE" 2>/dev/null || true
ip rule del fwmark "$FWMARK" table "$ROUTE_TABLE" priority "$FWMARK" 2>/dev/null || true
ip link set "$TUN_DEV" down 2>/dev/null || true
ip tuntap del dev "$TUN_DEV" mode tun 2>/dev/null || true
# Удаляем PID-файл
rm -f "$PID_FILE" 2>/dev/null || true
}
# Проверяем аргументы командной строки
if [ "$#" -eq 1 ] && [ "$1" == "cleanup_only" ]; then
cleanup
echo "[INFO] Очистка завершена."
exit 0
fi
# Вызываем cleanup при старте для гарантии чистоты, если не режим cleanup_only
cleanup
echo "[INFO] Создание $TUN_DEV..."
ip tuntap add dev "$TUN_DEV" mode tun
ip addr add "$TUN_ADDR" dev "$TUN_DEV"
ip link set "$TUN_DEV" up
echo "[INFO] Настройка ip rule и iptables..."
ip rule add fwmark "$FWMARK" table "$ROUTE_TABLE" priority "$FWMARK"
ip route replace default dev "$TUN_DEV" table "$ROUTE_TABLE"
iptables -t mangle -A PREROUTING -s "$CONTAINER_IP" -p tcp -j MARK --set-mark "$FWMARK"
iptables -t nat -A POSTROUTING -o "$TUN_DEV" -j MASQUERADE
echo "[INFO] Запуск tun2socks..."
"$TUN2SOCKS_BIN" \
--device "$TUN_DEV" \
--proxy "$SOCKS_PROXY" \
--nohup \
--log-level info &
# Сохраняем PID tun2socks для systemd
echo $! > "$PID_FILE"
echo "[INFO] Настройка завершена. tun2socks запущен."
Разбор скрипта
Давайте подробнее разберем, что делает каждая часть скрипта:
Конфигурация
В начале скрипта определяются ключевые переменные:
- TUN_DEV: Имя виртуального сетевого интерфейса (например,
tun0). - TUN_ADDR: IP-адрес и маска подсети, которые будут назначены
TUN_DEV. Этот адрес будет использоваться как шлюз для контейнера. - FWMARK: Произвольная числовая метка, которая будет использоваться для маркировки пакетов, предназначенных для перенаправления.
- ROUTE_TABLE: Номер пользовательской таблицы маршрутизации, куда будет направлен помеченный трафик.
- CONTAINER_IP: Критически важный параметр! Это IP-адрес вашего контейнера, трафик которого вы хотите перенаправлять. Вам нужно будет узнать его.
- SOCKS_PROXY: Полный адрес вашего SOCKS5-прокси, включая протокол, имя пользователя, пароль и порт.
- PID_FILE: Путь к файлу, куда будет записан PID процесса tun2socks для отслеживания systemd.
Функция cleanup
Функция cleanup() отвечает за удаление всех ранее созданных правил iptables, маршрутов и самого TUN-устройства. Это важно для обеспечения “чистого” состояния перед каждой новой настройкой и при остановке сервиса. Она также удаляет PID-файл.
Логика запуска и очистки
Скрипт проверяет аргументы командной строки. Если он запущен с аргументом cleanup_only, то выполняет только функцию cleanup и завершает работу. В противном случае, он сначала очищает предыдущие настройки, а затем приступает к созданию новых.
Создание TUN-устройства
ip tuntap add dev "$TUN_DEV" mode tun: Создает новый TUN-интерфейс с указанным именем.ip addr add "$TUN_ADDR" dev "$TUN_DEV": Назначает IP-адрес созданному TUN-интерфейсу.ip link set "$TUN_DEV" up: Активирует TUN-интерфейс.
Настройка ip rule и iptables
Это сердце механизма перенаправления трафика:
ip rule add fwmark "$FWMARK" table "$ROUTE_TABLE" priority "$FWMARK": Создает правило маршрутизации, которое гласит: “любой пакет с меткойFWMARKдолжен быть обработан с использованием таблицы маршрутизацииROUTE_TABLE”. ПриоритетFWMARKгарантирует, что это правило будет рассмотрено раньше других.ip route replace default dev "$TUN_DEV" table "$ROUTE_TABLE": Внутри нашей специальной таблицыROUTE_TABLEмы устанавливаем маршрут по умолчанию, который указывает на наше TUN-устройство. Это означает, что весь трафик, попадающий в эту таблицу, будет направлен черезTUN_DEV.iptables -t mangle -A PREROUTING -s "$CONTAINER_IP" -p tcp -j MARK --set-mark "$FWMARK": Это правилоiptablesв цепочкеPREROUTING(которая обрабатывает пакеты до того, как они пройдут через маршрутизацию) в таблицеmangle(которая используется для изменения пакетов). Оно говорит: “если TCP-пакет исходит отCONTAINER_IP, пометь его меткойFWMARK”. Это то, как мы идентифицируем трафик, который нужно перенаправить.iptables -t nat -A POSTROUTING -o "$TUN_DEV" -j MASQUERADE: Это правило в таблицеnatв цепочкеPOSTROUTING(которая обрабатывает пакеты непосредственно перед их отправкой). Оно выполняет маскарадинг (SNAT), то есть изменяет исходный IP-адрес исходящих пакетов, проходящих черезTUN_DEV, на IP-адрес, ассоциированный сTUN_DEV. Это необходимо для корректной работы прокси.
Запуск tun2socks
"$TUN2SOCKS_BIN" --device "$TUN_DEV" --proxy "$SOCKS_PROXY" --nohup --log-level info &: Запускает самtun2socks. Он привязывается к созданномуTUN_DEVи использует указанныйSOCKS_PROXYдля перенаправления всего трафика, который поступает наTUN_DEV. Флаг--nohupпозволяетtun2socksпродолжать работать даже после завершения родительского процесса (скрипта), а&запускает его в фоновом режиме.--log-level infoполезен для отладки.echo $! > "$PID_FILE": Сохраняет PID только что запущенного в фонеtun2socksв файл, чтобы systemd мог его отслеживать.
Как использовать (с systemd)
Теперь, когда скрипт готов, мы можем интегрировать его с systemd для удобного управления.
Сохраните скрипт: Создайте файл, например,
/usr/local/bin/tun2socks_redirect.sh, и вставьте в него содержимое измененного скрипта.sudo nano /usr/local/bin/tun2socks_redirect.shСделайте его исполняемым:
sudo chmod +x /usr/local/bin/tun2socks_redirect.shОпределите IP-адрес контейнера: Если вы используете Docker, вы можете узнать IP-адрес контейнера, выполнив
docker inspect <имя_контейнера> | grep "IPAddress".Обновите CONTAINER_IP и SOCKS_PROXY: Обязательно измените значения
CONTAINER_IPиSOCKS_PROXYв скрипте/usr/local/bin/tun2socks_redirect.shна ваши собственные.
Создание Systemd Unit-файла
Создадим файл unit-а systemd для нашего сервиса.
Создайте файл
/etc/systemd/system/tun2socks-redirect.service:sudo nano /etc/systemd/system/tun2socks-redirect.serviceВставьте следующее содержимое:
[Unit] Description=Tun2socks Traffic Redirection Service After=network-online.target Wants=network-online.target [Service] Type=forking # Используем Type=forking, так как наш скрипт запускает tun2socks в фоне # и завершается сам. tun2socks сам демонизируется (благодаря --nohup). # PIDFile используется для отслеживания PID tun2socks. PIDFile=/var/run/tun2socks.pid ExecStartPre=/usr/local/bin/tun2socks_redirect.sh # ExecStart - это команда, которую systemd будет отслеживать. # Так как наш скрипт запускает tun2socks в фоне, systemd сам будет следить за tun2socks по PIDFile. ExecStart=/bin/true # ExecStopPost выполняется после завершения сервиса, для очистки ExecStopPost=/usr/local/bin/tun2socks_redirect.sh cleanup_only # User=root - поскольку скрипт требует root-прав User=root Restart=on-failure RestartSec=5s [Install] WantedBy=multi-user.target
Пояснения к Unit-файлу:
- [Unit]:
Description: Краткое описание сервиса.After=network-online.target: Сервис будет запущен после того, как сеть будет полностью настроена.Wants=network-online.target: Указывает на желаемую зависимость от сети.
- [Service]:
Type=forking: Указывает systemd, что основной процесс сервиса будет “форкать” дочерний процесс (наш tun2socks), и родительский процесс (скрипт) завершится. systemd будет использоватьPIDFileдля отслеживания истинного процесса сервиса.PIDFile=/var/run/tun2socks.pid: Путь к файлу, в котором наш скрипт сохраняет PID запущенного tun2socks. Это критично дляType=forking.ExecStartPre=/usr/local/bin/tun2socks_redirect.sh: Команда, которая выполняется перед основным запуском сервиса. Здесь наш скрипт настраивает TUN-устройство и правила iptables, а также запускает tun2socks в фоновом режиме.ExecStart=/bin/true: Поскольку tun2socks уже запущен нашимExecStartPreскриптом и systemd отслеживает его поPIDFile, нам не нужно запускать что-либо ещё вExecStart./bin/trueпросто возвращает успешный код выхода.ExecStopPost=/usr/local/bin/tun2socks_redirect.sh cleanup_only: Команда, которая выполняется после остановки сервиса. При вызове с аргументомcleanup_onlyскрипт только очищает правила.User=root: Сервис должен запускаться от имени root, так как он изменяет сетевые настройки и правила iptables.Restart=on-failure: Если сервис завершится с ошибкой, systemd попытается перезапустить его.RestartSec=5s: Задержка перед попыткой перезапуска.
- [Install]:
WantedBy=multi-user.target: Сервис будет запущен при загрузке системы в многопользовательском режиме.
Включение и запуск сервиса Systemd
После создания Unit-файла и доработки скрипта:
Перезагрузите systemd daemon:
sudo systemctl daemon-reloadВключите сервис для автоматического запуска при загрузке:
sudo systemctl enable tun2socks-redirect.serviceЗапустите сервис:
sudo systemctl start tun2socks-redirect.serviceПроверьте статус сервиса:
sudo systemctl status tun2socks-redirect.serviceВы должны увидеть, что сервис активен (
active (running)).Проверьте логи:
journalctl -u tun2socks-redirect.service -fЭто поможет вам отслеживать вывод скрипта и tun2socks.
Теперь ваш сервис будет автоматически запускаться при загрузке системы и пытаться поддерживать работу tun2socks и правил маршрутизации. Для остановки сервиса используйте sudo systemctl stop tun2socks-redirect.service, и он автоматически очистит правила. Для перезапуска - sudo systemctl restart tun2socks-redirect.service.
Заключение
Таким образом, мы настроили систему, которая перенаправляет весь TCP-трафик от указанного контейнера через SOCKS-прокси-сервер. Этот метод обеспечивает гибкость и контроль над сетевым трафиком, позволяя вам легко управлять его маршрутизацией через внешние прокси-сервисы, а интеграция с systemd значительно повышает надёжность и удобство управления.
Надеюсь, эта статья была полезной! Если у вас есть вопросы или предложения, не стесняйтесь оставлять комментарии.
Отзывы по теме
Была задача наладить работу n8n, redis и базы данных. Заказывал раньше у другого исполнителя, постоянно все ломалось. Заказал у Михаила, на следующий же день все стало работать быстро, как часы!
christ_media · N8n установка на ваш vps сервер. Настройка n8n, docker, ai, telegram
Опытный покупатель24.09.2025 · ⭐ 5/5
Была задача наладить работу n8n, redis и базы данных. Заказывал раньше у другого исполнителя, постоянно все ломалось. Заказал у Михаила, на следующий же день все стало работать быстро, как часы!
Спасибо за быструю и хорошую работу. Все сделали оперативно и так как нужно!
Dr-zelenin · N8n установка на ваш vps сервер. Настройка n8n, docker, ai, telegram
06.09.2025 · ⭐ 5/5
Спасибо за быструю и хорошую работу. Все сделали оперативно и так как нужно!
Быстрое решение проблемы, всем рекомендую Михаила в качестве исполнителя! Пробовал собрать аналогичную конфигурацию самостоятельно и через советы нейросетей, в результате куча потраченных сил и средств (из-за простоя сервера). Так что мой совет в итоге - обращайтесь к профессионалам, это выйдет дешевле =) Спасибо Михаилу за профессионализм.
ladohinpy · N8n установка на ваш vps сервер. Настройка n8n, docker, ai, telegram
25.08.2025 · ⭐ 5/5
Быстрое решение проблемы, всем рекомендую Михаила в качестве исполнителя! Пробовал собрать аналогичную конфигурацию самостоятельно и через советы нейросетей, в результате куча потраченных сил и средств (из-за простоя сервера). Так что мой совет в итоге - обращайтесь к профессионалам, это выйдет дешевле =) Спасибо Михаилу за профессионализм.
Михаил выполнил настройку очередного VPS. Быстро, профессионально обходя определенные ограничение хостинг провайдеров.
NadoBy · N8n установка на ваш vps сервер. Настройка n8n, docker, ai, telegram
Освоившийся покупатель12.08.2025 · ⭐ 5/5
Михаил выполнил настройку очередного VPS. Быстро, профессионально обходя определенные ограничение хостинг провайдеров.
Отличная работа, спасибо! Михаил профессионал своего дела, рекомендую!
Dina_Perova · N8n установка на ваш vps сервер. Настройка n8n, docker, ai, telegram
Освоившийся покупатель03.07.2025 · ⭐ 5/5
Отличная работа, спасибо! Михаил профессионал своего дела, рекомендую!
Спасибо Михаилу за отзывчивость. Созвонились, объяснил как сделать самому. Обращаюсь уже второй раз, все супер и оперативно.
kireevk · Консультация по nginx proxy manager и portainer
Освоившийся покупатель25.02.2025 · ⭐ 5/5
Спасибо Михаилу за отзывчивость. Созвонились, объяснил как сделать самому. Обращаюсь уже второй раз, все супер и оперативно.