// DevOps
Перенаправляем весь трафик контейнера через SOCKS-прокси с помощью tun2socks
Опубликовано 22.09.2026
Иногда возникает необходимость направлять весь исходящий трафик определённого контейнера через прокси-сервер. Это может быть полезно для обеспечения анонимности, обхода геоблокировок или для тестирования сетевых конфигураций. В этой статье мы рассмотрим, как настроить такую систему, используя утилиту tun2socks и правила iptables, а также как управлять этим процессом с помощью systemd.
Что такое tun2socks?
tun2socks – это мощный инструмент, который позволяет перенаправлять сетевой трафик, предназначенный для TUN-устройства, через SOCKS-прокси. Он создаёт виртуальный сетевой интерфейс (TUN-устройство), весь трафик которого заворачивается в SOCKS-соединение. Это особенно удобно, когда прямое проксирование на уровне приложения невозможно или нежелательно.
Установка tun2socks
Для начала нам нужно установить tun2socks. Мы будем использовать предварительно скомпилированные бинарные файлы с GitHub.
Перейдите на страницу релизов tun2socks: https://github.com/xjasonlyu/tun2socks/releases
Выберите последнюю стабильную версию (на сентябрь 2026 года — v2.7.0 от 12.07.2026) и загрузите архив для вашей архитектуры. Архивы выкладываются в формате
.zip, напримерtun2socks-linux-amd64.zipдля 64-битных систем Linux; внутри один исполняемый файл.Распакуйте архив и переместите исполняемый файл в системный путь, например,
/usr/local/bin/:bash# Пример для linux-amd64; при выходе новой версии замените v2.7.0 wget https://github.com/xjasonlyu/tun2socks/releases/download/v2.7.0/tun2socks-linux-amd64.zip unzip tun2socks-linux-amd64.zip sudo install -m 0755 tun2socks-linux-amd64 /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" \
--loglevel 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”. Это то, как мы идентифицируем трафик, который нужно перенаправить.
Важно: в этой схеме через прокси идёт только TCP. Правило помечает пакеты с -p tcp, поэтому UDP-трафик контейнера, в том числе DNS-запросы, уходит напрямую через основной шлюз. Сам tun2socks умеет передавать и UDP, но для этого SOCKS5-сервер должен поддерживать UDP ASSOCIATE, а в правило нужно добавить UDP. Если важно, чтобы DNS не уходил мимо прокси, либо пометьте и UDP, либо настройте в контейнере DNS-сервер, доступный через прокси по TCP.
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" --loglevel info &: Запускает самtun2socks. Он привязывается к созданномуTUN_DEVи использует указанныйSOCKS_PROXYдля перенаправления всего трафика, который поступает наTUN_DEV.&запускает его в фоновом режиме,--loglevel infoзадаёт подробность журнала (debugполезен для отладки). Флагов--nohupи--log-levelу tun2socks нет — с ними программа не запустится.echo $! > "$PID_FILE": Сохраняет PID только что запущенного в фонеtun2socksв файл, чтобы systemd мог его отслеживать.
Как использовать (с systemd)
Теперь, когда скрипт готов, мы можем интегрировать его с systemd для удобного управления.
Сохраните скрипт: Создайте файл, например,
/usr/local/bin/tun2socks_redirect.sh, и вставьте в него содержимое измененного скрипта.bashsudo nano /usr/local/bin/tun2socks_redirect.shСделайте его исполняемым:
bashsudo 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:bashsudo nano /etc/systemd/system/tun2socks-redirect.serviceВставьте следующее содержимое:
ini[Unit] Description=Tun2socks Traffic Redirection Service After=network-online.target Wants=network-online.target [Service] Type=forking # Используем Type=forking, так как наш скрипт запускает tun2socks в фоне # и завершается сам; процесс tun2socks остаётся работать в группе сервиса. # 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:
bashsudo systemctl daemon-reloadВключите сервис для автоматического запуска при загрузке:
bashsudo systemctl enable tun2socks-redirect.serviceЗапустите сервис:
bashsudo systemctl start tun2socks-redirect.serviceПроверьте статус сервиса:
bashsudo systemctl status tun2socks-redirect.serviceВы должны увидеть, что сервис активен (
active (running)).Проверьте логи:
bashjournalctl -u tun2socks-redirect.service -fЭто поможет вам отслеживать вывод скрипта и tun2socks.
Теперь ваш сервис будет автоматически запускаться при загрузке системы и пытаться поддерживать работу tun2socks и правил маршрутизации. Для остановки сервиса используйте sudo systemctl stop tun2socks-redirect.service, и он автоматически очистит правила. Для перезапуска - sudo systemctl restart tun2socks-redirect.service.
Заключение
Таким образом, мы настроили систему, которая перенаправляет весь TCP-трафик от указанного контейнера через SOCKS-прокси-сервер. Если нужно направить через прокси весь трафик системы, а не одного контейнера, — см. статью «Перенаправление всего системного трафика через SOCKS5-прокси с помощью tun2socks». Этот метод обеспечивает гибкость и контроль над сетевым трафиком, позволяя вам легко управлять его маршрутизацией через внешние прокси-сервисы, а интеграция с systemd значительно повышает надёжность и удобство управления.
Надеюсь, эта статья была полезной! Если у вас есть вопросы или предложения, не стесняйтесь оставлять комментарии.
// Reviews
Отзывы по теме
Опыт сотрудничества оставил максимально позитивное впечатление, в первую очередь профессионализмом и подходом к решению возникающих проблем.
Опыт сотрудничества оставил максимально позитивное впечатление, в первую очередь профессионализмом и подходом к решению возникающих проблем.
Jitsi meet: персональный zoom, настройка jitsi meet в docker и на VPS
11.11.2025 · ★ 5/5
Была задача наладить работу n8n, redis и базы данных. Заказывал раньше у другого исполнителя, постоянно все ломалось. Заказал у Михаила, на следующий же день все стало работать быстро, как часы!
Была задача наладить работу n8n, redis и базы данных. Заказывал раньше у другого исполнителя, постоянно все ломалось. Заказал у Михаила, на следующий же день все стало работать быстро, как часы!
N8n установка на ваш vps сервер. Настройка n8n, docker, ai, telegram
24.09.2025 · ★ 5/5
Спасибо за быструю и хорошую работу. Все сделали оперативно и так как нужно!
Спасибо за быструю и хорошую работу. Все сделали оперативно и так как нужно!
N8n установка на ваш vps сервер. Настройка n8n, docker, ai, telegram
06.09.2025 · ★ 5/5
Быстрое решение проблемы, всем рекомендую Михаила в качестве исполнителя! Пробовал собрать аналогичную конфигурацию самостоятельно и через советы нейросетей, в результате куча потраченных сил и средств (из-за простоя сервера). Так что мой совет в итоге - обращайтесь к профессионалам, это выйдет дешевле =) Спасибо Михаилу за профессионализм.
Быстрое решение проблемы, всем рекомендую Михаила в качестве исполнителя! Пробовал собрать аналогичную конфигурацию самостоятельно и через советы нейросетей, в результате куча потраченных сил и средств (из-за простоя …
N8n установка на ваш vps сервер. Настройка n8n, docker, ai, telegram
25.08.2025 · ★ 5/5
Михаил выполнил настройку очередного VPS. Быстро, профессионально обходя определенные ограничение хостинг провайдеров.
Михаил выполнил настройку очередного VPS. Быстро, профессионально обходя определенные ограничение хостинг провайдеров.
N8n установка на ваш vps сервер. Настройка n8n, docker, ai, telegram
12.08.2025 · ★ 5/5
Отличная работа, спасибо! Михаил профессионал своего дела, рекомендую!
Отличная работа, спасибо! Михаил профессионал своего дела, рекомендую!
N8n установка на ваш vps сервер. Настройка n8n, docker, ai, telegram
03.07.2025 · ★ 5/5
// Contact
Нужна помощь?
Свяжись со мной и я помогу решить проблему
Написать в TelegramОтвечаю в течение рабочего дня (03:00–13:00 GMT)
Или оставьте заявку здесь:
// Related