// DevOps
Перенаправление всего системного трафика через SOCKS5-прокси с помощью tun2socks
Опубликовано 02.06.2026
Стандартные инструменты вроде proxychains часто подводят, когда дело доходит до многопоточных приложений, Go/Rust-бинарников, Electron-приложений и системных служб. Здесь на помощь приходит tun2socks — инструмент, который создаёт виртуальный сетевой интерфейс TUN, перехватывает абсолютно весь IP-трафик системы и прозрачно заворачивает его в SOCKS5.
Ниже представлено исчерпывающее руководство по выбору реализации, настройке на Ubuntu/Debian и решению типовых проблем.
Сравнение актуальных реализаций (на 2026 год)
За годы существования концепта появилось несколько версий утилиты. Выбор правильной сбережет вам кучу нервов.
| Реализация | Язык | Сетевой стек | Плюсы | Минусы | Рекомендация |
|---|---|---|---|---|---|
| xjasonlyu/tun2socks (v2) | Go | Google gVisor | Отличная стабильность, UDP, IPv6, зрелость, удобный CLI. | Чуть выше потребление памяти (~30-60 МБ). | Для 90% задач. Стандарт де-факто. |
| heiher/hev-socks5-tunnel | C | Модифицированный lwIP | Самый быстрый, очень низкое потребление CPU/RAM, IPv6. | Меньше фич «из коробки», конфиг через YAML. | Для максимальной производительности (роутеры). |
| badvpn-tun2socks | C | lwIP | Крайне лёгкий. | Устарел, слабый UDP, нет нормального IPv6. | Legacy. Только для старых embedded-систем. |
| wtdcode/tun2socks | C++ | Boost.Asio | Потенциально высокая скорость. | Меньше обкатан в продакшене. | Эксперименты. |
В этом гайде основной акцент сделан на xjasonlyu/tun2socks v2 как на самом стабильном и удобном решении.
Как это работает (Архитектура)
- Создаётся виртуальный сетевой интерфейс
tun0. - Вся система (или отдельные приложения) через таблицу маршрутизации отправляет трафик в
tun0. tun2socksчитает пакеты из TUN, обрабатывает их через user-space стек (gVisor) и инкапсулирует в запросы к SOCKS5-прокси.- Ответы от прокси возвращаются обратно в TUN и передаются исходным приложениям.
Главная опасность — сетевая петля (Routing Loop). Если трафик от
tun2socksк самому SOCKS5-серверу тоже уйдет в туннель, возникнет бесконечная рекурсия, которая моментально «повесит» интернет и загрузит CPU на 100%.
Базовый метод: Глобальная маршрутизация
Этот метод заворачивает в прокси вообще весь трафик операционной системы.
Шаг 1: Установка tun2socks
Скачиваем актуальный бинарник со страницы релизов GitHub:
# Скачиваем последнюю версию (архитектура 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, не пересекается с обычными локалками).
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
# 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), чтобы их трафик тоже уходил в туннель.
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: Запуск
tun2socks -device tun0 \
-proxy socks5://user:pass@93.184.216.34:1080 \
-loglevel info \
-mtu 9000Автоматизация через Systemd
Чтобы не прописывать маршруты руками после каждой перезагрузки, создадим системный сервис.
Создайте файл /etc/systemd/system/tun2socks.service:
[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Активация:
sudo systemctl daemon-reload
sudo systemctl enable --now tun2socks
sudo systemctl status tun2socksПродвинутый уровень: Policy Routing (fwmark) для выборочной маршрутизации
Изменение дефолтного шлюза подходит не всем. В сложных системах (где есть Docker или запущен свой VPN-сервер) перехват всего трафика всё сломает. Policy Routing позволяет отправлять в прокси только нужные приложения на основе группы пользователя (GID).
1. Настройка таблиц маршрутизации
Создаем tun0, но вместо глобальных маршрутов создаем отдельную таблицу (например, 100).
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 1002. Маркировка через iptables
Создадим группу tunapp. Трафик любых процессов от её имени будет улетать в прокси.
# Добавляем группу и вашего пользователя в нее
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 0x13. Использование
Запускаем tun2socks как обычно. Теперь вся система работает напрямую, без прокси. А чтобы запустить приложение через туннель, используйте утилиту sg (switch group):
# Обычный запрос (ваш реальный 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:
sudo ip -6 route add ::/1 dev tun0
sudo ip -6 route add 8000::/1 dev tun0// Contact
Нужна помощь?
Свяжись со мной и я помогу решить проблему
Написать в TelegramОтвечаю в течение рабочего дня (03:00–13:00 GMT)
Или оставьте заявку здесь:
// Related