Tun2Socks: прокси-сервер как шлюз или VPN через прокси

Merkel

Carder
Messages
39
Reputation
0
Reaction score
36
Points
18
В повседневной жизни шлюз по умолчанию указывается в сетевых настройках вашего компьютера. Чаще всего устройство шлюза называют «маршрутизатором» или «маршрутизатором» - все запросы на IP-адреса, не входящие в вашу локальную сеть, проходят через него. Прокси-сервер (от английского «авторизованный» или «доверенный») также действует как посредник между вами и целевым сетевым ресурсом, но он не является шлюзом по умолчанию, то есть для использования его в приложении необходимо явно указать соответствующие параметры. Самый простой пример - доступ к сети I2P или Tor. Вся внутренняя логика этих сетей обеспечивается отдельным приложением, которое предоставляет пользователю интерфейс прокси для подключения. Указав необходимый прокси в настройках веб-браузера, мы можем посещать сайты с доменными именами «.i2p» и «.onion», о которых обычный маршрутизатор даже не знает. Также набирают популярность прокси-сервисы для обхода блокировок: вы прописали какой-то прокси из либеральной страны в настройках браузера и открываете любые сайты, не осознавая духовно безумного безумия.

Современные прокси-серверы обладают комплексной функциональностью для контроля и мониторинга трафика - хорошее решение для офисов и государственных учреждений, в которых нужно оградить сотрудников от нежелательных ресурсов, а также предоставить доступ в Интернет с дополнительной авторизацией и разной пропускной способностью для разных пользователей.
Независимо от варианта использования прокси-сервера в большинстве случаев удобнее использовать шлюз по умолчанию. Хотя бы потому, что некоторые приложения не умеют работать через прокси.
1636554934288.png


Tun2Socks
Tun2Socks - это свободный кроссплатформенный проект (GPL-3.0), написанный на языке Golang. Приложение не имеет графической оболочки и настраивается с помощью простых параметров при запуске. Название Tun2Socks (Tunnel to SOCKS) интерпретируется как "туннель через SOCKS-прокси". Зачем нужен SOCKS, если есть HTTP-прокси? Ответ прост: Tun2Socks может работать и через HTTP-прокси, но протокол HTTP не поддерживает передачу UDP-трафика. Через UDP проходит большая часть информации, доставка которой требует максимальной скорости (аудио- и видеозвонки, онлайн-игры, а также DNS-запросы, преобразующие человекочитаемые имена сетевых ресурсов в IP-адреса). Поэтому поддержку UDP не стоит недооценивать.

Суть работы Tun2Socks заключается в создании виртуального сетевого адаптера, который операционная система будет воспринимать как обычный сетевой интерфейс. Вся информация, поступающая на такой виртуальный адаптер, будет фактически передаваться внутри Tun2Socks, который обеспечит необходимую логику для дальнейшей передачи информации на прокси-сервер.
Информация об использовании утилиты при запуске с параметром --help:

Код:
Usage of tun2socks:
-device string
Use this device [driver://]name
-fwmark int
Set firewall MARK (Linux only)
-interface string
Use network INTERFACE (Linux/MacOS only)
-loglevel string
Log level [debug|info|warn|error|silent] (default "info")
-mtu int
Set device maximum transmission unit (MTU)
-proxy string
Use this proxy [protocol://]host[:port]
-stats string
HTTP statistic server listen address
-token string
HTTP statistic server auth token
-udp-timeout int
Set timeout for each UDP session
-version
Show version information and quit

Все может показаться понятным на первый взгляд только опытному администратору или тому, кто действительно ничего не понимает. При практическом знакомстве с Tun2Socks возникает вопрос: если в системе создан виртуальный сетевой адаптер, то как он станет шлюзом по умолчанию и нужно ли вручную задавать для него адрес. На помощь приходит документация.
Нет смысла дублировать здесь официальное описание проекта и всю документацию, поэтому перейдем к сути - к практической настройке шлюза с объяснением каждого шага.

Windows
Сначала необходимо скачать последнюю версию Tun2Socks. Бинарные файлы распространяются на странице релизов в официальном git-репозитории проекта. Выберите один из пакетов, начинающихся с tun2socks-windows. Если у вас 64-битная Windows на старом оборудовании, то, скорее всего, вам подойдет tun2socks-windows-amd64.zip (поскольку я никогда не встречал архитектуру ARM на старых машинах с Windows).

1636555210911.png


После загрузки распакуйте архив в любое удобное место.
Tun2Socks создает виртуальный сетевой адаптер, но драйвер для него (Wintun) нужно скачивать отдельно. Здесь находится прямая ссылка для скачивания Wintun версии 0.11. Я рекомендую именно эту версию, так как Tun2Socks v2.3.1 в моем случае отказался работать с более новыми версиями. При желании, последний релиз драйвера можно найти на официальной странице. Из всего архива нужен только один файл wintun.dll, который необходимо взять из нужной директории, в зависимости от вашей операционной системы. В случае архитектуры amd64 путь к нужной библиотеке выглядит так: wintun/bin/amd64/wintun.dll. Поместите подходящий файл wintun.dll в каталог, где находится исполняемый файл Tun2Socks.

Tun2Socks запускается с переданными значениями через командную строку (приведенные ниже команды должны выполняться с правами администратора). Команда для простого запуска выглядит следующим образом:
Код:
tun2socks-windows-amd64.exe -device tun: // gatewaytun -proxy socks5: //10.10.100.1: 1080
-tun2socks-windows-amd64.exe - это имя исполняемого файла Tun2Socks;
-device tun://gatewaytun определяет имя нового виртуального сетевого интерфейса (gatewaytun);
-proxy socks5://10.10.100.1:1080 сообщает протокол (в моем случае это SOCKS5) и адрес прокси-сервера.

Этого достаточно для создания нового сетевого интерфейса в системе, но он еще не будет работать так, как мы хотим. Для этого нужно вручную назначить IP-адрес новому сетевому интерфейсу и объяснить операционной системе, что это шлюз.

Вы можете назначить IP-адрес интерфейсу и указать маску подсети через стандартный графический интерфейс Windows, но мы воспользуемся преимуществами командной строки:
Код: netsh interface ip set address name = "gatewaytun" static 127.254.254.1 255.255.255.255
В примере виртуальному интерфейсу присвоен адрес 127.254.254.1, но на самом деле это может быть любой частный адрес из подсети, который, во-первых, не используется другими сетевыми адаптерами вашей операционной системы, а во-вторых, не используется в локальной сети вашего предприятия или дома (иначе локальная маршрутизация). В большинстве случаев адрес примера будет правильным значением (так как диапазон 127.0.0.1/8). Поэтому мы будем считать, что адрес назначен виртуальному сетевому интерфейсу.
Теперь нам нужно указать операционной системе новый интерфейс в качестве шлюза:
Код: route add 0.0.0.0 mask 0.0.0.0 127.254.254.1
Внимание! Если прокси-сервер находится не в локальной сети с той же подсетью, что и один из сетевых интерфейсов вашего компьютера, то есть доступ к прокси-серверу осуществляется через существующий шлюз, необходимо оставить доступ к прокси-серверу как есть, иначе описанная выше конфигурация работать не будет - согласитесь, что попытка подключения к прокси-серверу через сам прокси-сервер является абсурдной. На практике это означает, что для подключения к прокси-серверу необходимо добавить еще один маршрут:
route add 10.10.100.0 mask 255.255.255.0 10.10.5.25

В примере задано правило маршрутизации в подсеть 10.10.100.0/24, которое должно проходить не через общий шлюз (gatewaytun), а через сетевой интерфейс, имеющий доступ к устройству с адресом 10.10.5.25 (которое является шлюзом в нужную подсеть). Это правило справедливо, во-первых, если необходимо сохранить доступ к подсети локальной сети, недоступной напрямую, а во-вторых, что более важно, если в данной подсети расположен сам прокси-сервер, через который в дальнейшем будет проходить весь наш трафик.
Для домашнего использования, когда нет локальных подсетей и требуется лишь подключение к прокси-серверу через провайдера, приведенная выше команда заменяется на эту:

Код:
route add 11.11.11.11 mask 255.255.255.255 10.10.5.25

11.11.11.11 - адрес прокси-сервера в Интернете;
255.255.255.255 - маска, означающая, что правило включает только адрес прокси-сервера;
10.10.5.25 - адрес шлюза в локальной сети, который предоставлен вам вашим интернет-провайдером.

Если вы используете не HTTP, а SOCKS-прокси (который поддерживает UDP), то в настройках виртуального сетевого интерфейса можно указать адрес DNS-сервера, через который мы хотим разрешать доменные имена. Это можно сделать как через графический интерфейс Windows, так и через командную строку:

Код:
netsh interface ip set dns "gatewaytun" static 1.1.1.1

В примере адрес 1.1.1.1 - это адрес DNS-сервера.

В результате вы получите следующий набор команд:
Код:

tun2socks-windows-amd64.exe -device tun: // gatewaytun -proxy PROXY_PROXY: // PROXY_SERVER_ADDRESS: PORT
netsh interface ip set address name = "gatewaytun" static 127.254.254.1 255.255.255.255
route add 0.0.0.0 mask 0.0.0.0 127.254.254.1

# Optional. For the local network of the enterprise.
route add LOCAL_NET_SEGMENT mask SEGMENT_MASK OF GATEWAY_ADDRESS_TO_SEGMENT

# Optional. When using a proxy server on the Internet.
route add PROXY_SERVER_ADDRESS mask 255.255.255.255 PROVIDER_GATEWAY_ADDRESS

# Optional. DNS server, if the proxy server can handle UDP.
netsh interface ip set dns "gatewaytun" static DNS_SERVER_ADDRESS

Для большинства пользователей ручное выполнение всех команд может быть неудобным. Такие люди могут поэкспериментировать с автоматизированными сценариями (пакетными файлами). Например, ввести все необходимые команды в какой-то один start.bat и добавить его в запуск. Я не силен в нательных рубашках и правах доступа Windows. В качестве напутственного слова отмечу лишь, что все команды должны выполняться с правами администратора. Возможно, кто-то поделится в комментариях хорошим скриптом.

Linux
Пользователи GNU / Linux (и других * nix-систем) в основном более компетентны в командной строке и настройках системы, поэтому объяснений местами будет меньше (тем более, что суть происходящего уже подробно описана чуть выше)... Практические инструкции даются на примере Debian.
Бинарные файлы Linux находятся, в том числе, на странице релиза. Например, для Debian amd64 - tun2socks-linux-amd64.zip. Внутри архива находится один файл. После извлечения присвойте ему флаг исполняемого ( chmod +x tun2socks-linux-amd64) и поместите его в удобное место, например /usr/sbin/. Для создания туннеля WireGuard в Linux не требуются дополнительные драйверы - современные дистрибутивы поддерживают эту технологию на уровне ядра.
Все приведенные ниже команды должны быть запущены с правами суперпользователя.

Команда run выглядит следующим образом:

Код:
/ usr / sbin / tun2socks-linux-amd64 -device tun: // gatewaytun -proxy socks5: //10.10.100.1: 1080

-device tun://gatewaytun определяет имя нового виртуального сетевого интерфейса (gatewaytun);
-proxy socks5://10.10.100.1:1080 сообщает протокол (в моем случае это SOCKS5) и адрес прокси-сервера.

После запуска Tun2Socks в системе создается новый сетевой интерфейс с указанным именем. Теперь необходимо настроить правила маршрутизации:

Код:
# Assign an address to the new interface
ip addr add 127.254.254.1/32 dev gatewaytun

# Turn on the interface
ip link set gatewaytun up

# Remove the old default gateway (if any)
ip route del default

# Add a default route via the new interface
ip route add default dev gatewaytun

# Optional. Add a route to the proxy server on the local network
ip route add NETWORK_ADDRESS / PREFIX dev INTERFACE_NAME IN_LOCAL_NETWORK

# Optional. Route to a proxy server on the Internet (most likely for home)
ip route add PROXY_ADDRESS / 32 dev INTERFACE_NAME_IN_PROXY_NETWORK

Настройки DNS в * nix системах обычно глобальные, поэтому нет необходимости указывать их явно для каждого интерфейса. Однако тот, кому это необходимо, знает не только о /etc/resolv.conf, но и о возможности явного указания DNS-сервера в конфиге сетевых подключений. Мы не будем подробно останавливаться на этом.
Автоматизация - второе имя любого администратора. Для Debian я напишу службу systemd, которая будет запускать Tun2Socks и вызывать интерфейс gatewaytun, а в конфигурации этого сетевого интерфейса укажу команды, которые должны выполняться при его включении. При необходимости вы можете адаптировать этот подход для других операционных систем, учитывая их специфику.

Сервисный файл, который будет лежать в /etc/systemd/system/tun2socks.service:
Код:
[Unit]
Description=Tun2Socks gateway
After=network.target

[Service]
User=root
Type=idle
ExecStart=/usr/sbin/tun2socks-linux-amd64 -device tun://gatewaytun -proxy socks5://10.10.100.1:1080 & sleep 3; ip link set gatewaytun up
Restart=on-failure

[Install]
WantedBy=multi-user.target


Обратите внимание на путь к Tun2Socks и адрес прокси-сервера в строке ExecStart. Измените эти параметры по своему усмотрению. После амперсанда следует пауза в три секунды, после чего активируется новый сетевой интерфейс. Пауза устанавливается в случае высокой нагрузки на систему, чтобы дать время на создание интерфейса перед попыткой его включения.
Указываем в /etc/network/interfaces параметры интерфейса и дополнительные инструкции для выполнения после его включения. Строки добавляются в конец файла:

allow-hotplug gatewaytun
iface gatewaytun inet static
address 127.254.254.0
netmask 255.255.255.255
post-up ip route del default
post-up ip route add default dev gatewaytun

# Optional. Add a route to the proxy server on the local network
# post-up ip route add NETWORK_ADDRESS / PREFIX dev_INTERFACE_NAME IN_LOCAL_NETWORK

# Optional. Route to a proxy server on the Internet (most likely for home)
# post-up ip route add PROXY_ADDRESS / 32 dev INTERFACE_NAME_IN_PROXY_NETWORK

# post-up <other rules executed when the interface is turned on (if necessary)>

Теперь, когда все готово, вы можете запускать и отключать шлюз с помощью двух простых команд:
Код:
systemctl start tun2socks # START
systemctl stop tun2socks # STOP

Если Tun2Socks нужен на постоянной основе, созданную службу можно добавить в startup:

Код:
systemctl enable tun2socks

Послесловие
Мотивом для написания статьи послужило отсутствие адекватных результатов поиска по запросам типа "шлюз через прокси", "как отправить весь трафик через прокси" и тому подобным. Думаю, материал будет полезен самой широкой аудитории.
Честно говоря, я долгое время не понимал, что такое автоматизация в Windows. Не запустилось из коробки и - пусть отдыхает. Не люблю я Windows, извините. Да и как его любить, если для того, чтобы выполнить команду из bat-файла с правами администратора, нужно создать ярлык этого пакетного файла и поставить в нем галочку "Запуск с правами администратора". Ярлык и галочка, Карл! Более того, команда добавления маршрута все равно не захотела отрабатывать.
 
Top