// DevOps

Перенаправление всего системного трафика через SOCKS5-прокси с помощью tun2socks

Опубликовано 02.06.2026

Стандартные инструменты вроде proxychains часто подводят, когда дело доходит до многопоточных приложений, Go/Rust-бинарников, Electron-приложений и системных служб. Здесь на помощь приходит tun2socks — инструмент, который создаёт виртуальный сетевой интерфейс TUN, перехватывает абсолютно весь IP-трафик системы и прозрачно заворачивает его в SOCKS5.

Ниже представлено исчерпывающее руководство по выбору реализации, настройке на Ubuntu/Debian и решению типовых проблем.


Сравнение актуальных реализаций (на 2026 год)

За годы существования концепта появилось несколько версий утилиты. Выбор правильной сбережет вам кучу нервов.

РеализацияЯзыкСетевой стекПлюсыМинусыРекомендация
xjasonlyu/tun2socks (v2)GoGoogle gVisorОтличная стабильность, UDP, IPv6, зрелость, удобный CLI.Чуть выше потребление памяти (~30-60 МБ).Для 90% задач. Стандарт де-факто.
heiher/hev-socks5-tunnelCМодифицированный lwIPСамый быстрый, очень низкое потребление CPU/RAM, IPv6.Меньше фич «из коробки», конфиг через YAML.Для максимальной производительности (роутеры).
badvpn-tun2socksClwIPКрайне лёгкий.Устарел, слабый UDP, нет нормального IPv6.Legacy. Только для старых embedded-систем.
wtdcode/tun2socksC++Boost.AsioПотенциально высокая скорость.Меньше обкатан в продакшене.Эксперименты.

В этом гайде основной акцент сделан на xjasonlyu/tun2socks v2 как на самом стабильном и удобном решении.


Как это работает (Архитектура)

  1. Создаётся виртуальный сетевой интерфейс tun0.
  2. Вся система (или отдельные приложения) через таблицу маршрутизации отправляет трафик в tun0.
  3. tun2socks читает пакеты из TUN, обрабатывает их через user-space стек (gVisor) и инкапсулирует в запросы к SOCKS5-прокси.
  4. Ответы от прокси возвращаются обратно в TUN и передаются исходным приложениям.

Главная опасностьсетевая петля (Routing Loop). Если трафик от tun2socks к самому SOCKS5-серверу тоже уйдет в туннель, возникнет бесконечная рекурсия, которая моментально «повесит» интернет и загрузит CPU на 100%.


Базовый метод: Глобальная маршрутизация

Этот метод заворачивает в прокси вообще весь трафик операционной системы.

Шаг 1: Установка tun2socks

Скачиваем актуальный бинарник со страницы релизов GitHub:

bash
# Скачиваем последнюю версию (архитектура amd64)
wget https://github.com/xjasonlyu/tun2socks/releases/latest/download/tun2socks-linux-amd64.zip

unzip tun2socks-linux-amd64.zip
sudo mv tun2socks-linux-amd64 /usr/local/bin/tun2socks
sudo chmod +x /usr/local/bin/tun2socks

# Проверка
tun2socks --version

Шаг 2: Создание TUN-интерфейса

Создаем интерфейс в пространстве ядра и выделяем ему подсеть 198.18.0.0/15 (RFC 2544, не пересекается с обычными локалками).

bash
sudo ip tuntap add dev tun0 mode tun user $USER
sudo ip addr add 198.18.0.1/15 dev tun0
sudo ip link set dev tun0 up mtu 9000

Примечание: MTU 9000 (Jumbo Frames) рекомендуется для повышения производительности, если ваш прокси это поддерживает. В противном случае оставьте стандартные 1500.

Шаг 3: Защита от сетевой петли

Допустим, ваш прокси находится на удаленном сервере.

  • IP SOCKS5-сервера: 93.184.216.34
  • Ваш шлюз провайдера: 192.168.1.1
  • Ваш интерфейс: eth0
bash
# 1. Жестко направляем трафик до самого прокси через реальный шлюз (исключаем из туннеля)
sudo ip route add 93.184.216.34 via 192.168.1.1 dev eth0

# 2. Перенаправляем весь остальной трафик в TUN.
# Используем две маски /1 вместо удаления дефолтного шлюза (0.0.0.0/0) — это безопаснее.
sudo ip route add 0.0.0.0/1 dev tun0
sudo ip route add 128.0.0.0/1 dev tun0

(Если прокси локальный — например, Xray на 127.0.0.1 — исключать нужно IP-адрес удаленного сервера, к которому подключается Xray).

Шаг 4: Решение проблемы с DNS

tun2socks от xjasonlyu не перехватывает DNS-запросы автоматически. Самый надежный способ избежать утечек — прописать публичные DNS (например, Google или Cloudflare), чтобы их трафик тоже уходил в туннель.

bash
sudo tee /etc/resolv.conf <<EOF
nameserver 8.8.8.8
nameserver 1.1.1.1
EOF
# Защищаем файл от перезаписи системными службами (NetworkManager/systemd-resolved)
sudo chattr +i /etc/resolv.conf

Шаг 5: Запуск

bash
tun2socks -device tun0 \
          -proxy socks5://user:pass@93.184.216.34:1080 \
          -loglevel info \
          -mtu 9000

Автоматизация через Systemd

Чтобы не прописывать маршруты руками после каждой перезагрузки, создадим системный сервис.

Создайте файл /etc/systemd/system/tun2socks.service:

ini
[Unit]
Description=Tun2Socks Tunnel Service
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=root
# Настройте переменные под себя
Environment=PROXY=socks5://93.184.216.34:1080
Environment=PROXY_IP=93.184.216.34
Environment=GATEWAY=192.168.1.1
Environment=INTERFACE=eth0
Environment=MTU=9000

# Подготовка интерфейса
ExecStartPre=/bin/sh -c 'ip link set dev tun0 down 2>/dev/null || true'
ExecStartPre=/bin/sh -c 'ip tuntap del dev tun0 mode tun 2>/dev/null || true'
ExecStartPre=/bin/sh -c 'ip tuntap add dev tun0 mode tun && ip addr add 198.18.0.1/15 dev tun0 && ip link set dev tun0 up mtu $MTU'

# Маршрутизация
ExecStartPre=/bin/sh -c 'ip route add $PROXY_IP via $GATEWAY dev $INTERFACE 2>/dev/null || true'
ExecStartPre=/bin/sh -c 'ip route add 0.0.0.0/1 dev tun0 && ip route add 128.0.0.0/1 dev tun0'

# Запуск
ExecStart=/usr/local/bin/tun2socks -device tun0 -proxy ${PROXY} -loglevel info -mtu ${MTU}

# Очистка при остановке
ExecStopPost=/bin/sh -c 'ip route del 0.0.0.0/1 dev tun0 2>/dev/null || true'
ExecStopPost=/bin/sh -c 'ip route del 128.0.0.0/1 dev tun0 2>/dev/null || true'
ExecStopPost=/bin/sh -c 'ip route del $PROXY_IP via $GATEWAY dev $INTERFACE 2>/dev/null || true'
ExecStopPost=/bin/sh -c 'ip link set dev tun0 down && ip tuntap del dev tun0 mode tun'

Restart=on-failure
RestartSec=3
AmbientCapabilities=CAP_NET_ADMIN CAP_NET_RAW

[Install]
WantedBy=multi-user.target

Активация:

bash
sudo systemctl daemon-reload
sudo systemctl enable --now tun2socks
sudo systemctl status tun2socks

Продвинутый уровень: Policy Routing (fwmark) для выборочной маршрутизации

Изменение дефолтного шлюза подходит не всем. В сложных системах (где есть Docker или запущен свой VPN-сервер) перехват всего трафика всё сломает. Policy Routing позволяет отправлять в прокси только нужные приложения на основе группы пользователя (GID).

1. Настройка таблиц маршрутизации

Создаем tun0, но вместо глобальных маршрутов создаем отдельную таблицу (например, 100).

bash
sudo ip tuntap add dev tun0 mode tun user $USER
sudo ip addr add 198.18.0.1/15 dev tun0
sudo ip link set dev tun0 up mtu 9000

# Все пакеты с меткой 0x1 идут в таблицу 100
sudo ip rule add fwmark 0x1 table 100

# В таблице 100 весь трафик направляем в tun0
sudo ip route add default dev tun0 table 100

2. Маркировка через iptables

Создадим группу tunapp. Трафик любых процессов от её имени будет улетать в прокси.

bash
# Добавляем группу и вашего пользователя в нее
sudo addgroup tunapp
sudo usermod -aG tunapp $USER

# Маркируем (fwmark 0x1) исходящие пакеты этой группы
sudo iptables -t mangle -A OUTPUT -m owner --gid-owner tunapp -j MARK --set-mark 0x1

3. Использование

Запускаем tun2socks как обычно. Теперь вся система работает напрямую, без прокси. А чтобы запустить приложение через туннель, используйте утилиту sg (switch group):

bash
# Обычный запрос (ваш реальный IP)
curl ifconfig.me

# Запрос через прокси
sg tunapp -c "curl ifconfig.me"

# Запуск браузера или торрент-клиента через туннель
sg tunapp -c "google-chrome"

Плюс метода: полная гарантия отсутствия сетевых петель, так как клиент прокси (например, локальный Xray) работает от вашего обычного пользователя и его трафик не маркируется.


Дебаггинг и типичные проблемы

  • Сетевая петля (100% CPU, спам в логах, нет интернета): Убедитесь, что маршрут до IP-адреса прокси жестко прописан через физический интерфейс (ip route show).
  • Туннель поднят, но сайты не открываются: Проверьте DNS (/etc/resolv.conf). Проверьте счетчики пакетов: ip -s link show tun0. Если RX растет, а TX стоит на нуле — tun2socks не забирает пакеты из ядра (проверьте логи службы).
  • Низкая скорость: Убедитесь, что MTU совпадает на интерфейсе и в аргументах программы (-mtu 9000). Если упираетесь в CPU (слабый роутер), смените реализацию на hev-socks5-tunnel.
  • Нужен IPv6: Добавьте маршруты для IPv6-трафика аналогично IPv4:
bash
sudo ip -6 route add ::/1 dev tun0
sudo ip -6 route add 8000::/1 dev tun0

// Contact

Нужна помощь?

Свяжись со мной и я помогу решить проблему

Написать в Telegram

Отвечаю в течение рабочего дня (03:00–13:00 GMT)

Или оставьте заявку здесь:

Отправить заявку
Написать и получить быстрый ответ