VLESS и SOCKS5: настройка на роутере OpenWrt и защита от уязвимостей локального прокси

Разбираем связку VLESS и SOCKS5: как поднять клиент на OpenWrt через sing-box и tun2socks, чем опасен неаутентифицированный SOCKS5 на localhost и как защитить свой VPN от шпионских модулей.

Что такое VLESS и SOCKS5 и зачем их объединять

VLESS — это современный прокси-протокол, разработанный как облегчённая альтернатива VMess. Он не шифрует трафик самостоятельно, а полагается на внешний транспорт, например TLS или REALITY. Благодаря этому VLESS быстрее и гибче, но требует правильной настройки. SOCKS5, в свою очередь, — это универсальный прокси-протокол, который работает на уровне сеанса и умеет передавать TCP и UDP трафик. Его главное преимущество — совместимость: почти любое приложение может работать через SOCKS5 без дополнительных драйверов.

Связка VLESS и SOCKS5 возникает естественным образом: большинство VPN-клиентов, таких как v2rayNG, NekoBox или sing-box, создают локальный SOCKS5-прокси на устройстве, чтобы перенаправлять трафик от приложений в туннель VLESS. На роутере эта схема тоже работает: вы поднимаете клиент VLESS, который слушает SOCKS5-порт, а затем направляете трафик с LAN-интерфейса в этот прокси. Однако, как мы увидим позже, локальный SOCKS5 без аутентификации — это серьёзная уязвимость, которую активно эксплуатируют шпионские модули.

Почему стандартные VPN-туннели не всегда подходят

WireGuard и OpenVPN предоставляют полноценный сетевой интерфейс (tun), что упрощает маршрутизацию и управление трафиком на роутере. Но у них есть недостатки: они легко детектируются DPI-системами, требуют открытых UDP-портов и не маскируются под обычный HTTPS-трафик. В странах с агрессивной фильтрацией интернета, таких как Китай или Россия, такие туннели часто блокируются.

VLESS с REALITY и TLS имитирует соединение с легитимным сайтом, что делает его почти неотличимым от обычного HTTPS. Однако VLESS не создаёт сетевой интерфейс — он работает как прокси. Чтобы использовать его на роутере, нужно либо настроить прозрачное проксирование, либо использовать инструменты вроде tun2socks или sing-box, которые создают виртуальный интерфейс и перенаправляют трафик в прокси. Это добавляет сложности, но позволяет обходить блокировки и сохранять гибкость управления.

tun2socks: лёгкий способ поднять SOCKS5 на роутере

tun2socks — это утилита, которая создаёт TUN-интерфейс и перенаправляет весь трафик с него в указанный прокси: SOCKS5, HTTP или Shadowsocks. Она компактна (около 8.8 МБ) и поддерживает архитектуры MIPS и ARM, что делает её идеальной для старых роутеров. Установка на OpenWrt требует скачать бинарник с GitHub и вручную настроить интерфейс и firewall.

Пример настройки: создайте интерфейс tun0 с IP 172.16.250.1, добавьте зону firewall с маскарадингом и правилом форвардинга из LAN. Затем запустите tun2socks с параметрами прокси, например tun2socks -device tun0 -proxy socks5://user:pass@host:1080. Проверить работу можно через curl --interface tun0 ifconfig.me — он должен вернуть IP прокси-сервера. Важно: не используйте бесплатные публичные прокси, так как они могут перехватывать трафик.

sing-box: универсальный инструмент для VLESS и не только

sing-box — это более мощная альтернатива tun2socks. Он поддерживает VLESS, Shadowsocks, Trojan, SOCKS5 и другие протоколы, а также умеет создавать TUN-интерфейс. В OpenWrt 23.05 пакет sing-box доступен в официальном репозитории, что упрощает установку. Однако для работы с TUN требуется запуск от root, иначе будет ошибка permission denied.

Конфигурация sing-box описывается в JSON-файле. Для VLESS с REALITY пример outbound выглядит так: указываете сервер, порт, UUID, flow xtls-rprx-vision, TLS с utls fingerprint chrome и параметры REALITY. Важно: параметр auto_route должен быть false на роутерах, иначе sing-box попытается перехватить весь трафик, что конфликтует с настройками firewall. Вместо этого настройте маршрутизацию через стандартные средства OpenWrt.

Настройка firewall и маршрутизации для прокси-трафика

Чтобы трафик с LAN-устройств шёл через TUN-интерфейс, нужно правильно настроить firewall. Для tun2socks создаётся зона с forward REJECT и output ACCEPT, а для sing-box — с полным ACCEPT, иначе туннель не заработает. В обоих случаях добавляется правило форвардинга из зоны lan в зону tun.

Пример для sing-box:

config zone
    option name 'tun'
    option forward 'ACCEPT'
    option output 'ACCEPT'
    option input 'ACCEPT'
    option masq '1'
    option mtu_fix '1'
    option device 'tun0'
    option family 'ipv4'

config forwarding
    option name 'lan-tun'
    option dest 'tun'
    option src 'lan'
    option family 'ipv4'

После этого перезапустите firewall и sing-box. Для проверки используйте logread -f -e sing-box и curl через интерфейс. Если трафик не идёт, проверьте, что интерфейс tun0 поднят и IP назначен.

Критическая уязвимость: неаутентифицированный SOCKS5 на localhost

Исследователи обнаружили, что большинство популярных VPN-клиентов (v2rayNG, NekoBox, Hiddify, Karing и другие) создают SOCKS5-прокси на 127.0.0.1 без аутентификации. Это позволяет любому приложению на устройстве подключиться к этому прокси и отправлять трафик через VPN, минуя VpnService и per-app split tunneling. Шпионский модуль может сканировать порты localhost, найти открытый SOCKS5 и узнать выходной IP VPN-сервера, отправив запрос на ifconfig.me.

Особенно опасно то, что Android Private Spaces (Knox, Shelter, Island) не изолируют loopback-интерфейс, поэтому процесс из изолированного пространства видит прокси основного профиля. Смена порта не помогает — сканирование всех 65535 портов занимает секунды. Кроме того, через /proc/net/route можно узнать IP VPN-сервера даже без сканирования портов, так как host route к серверу всегда виден.

Как защитить свой VPN от шпионских модулей

Первое, что нужно сделать — включить аутентификацию на локальном SOCKS5-прокси. В xray-core это делается через параметр auth: password и список accounts. В sing-box — через поле users в inbound. Также рекомендуется отключить UDP в SOCKS5, так как UDP-пакеты не проходят повторную аутентификацию.

Второе — использовать клиенты, которые поддерживают аутентификацию. Например, Husi и SFA (sing-box for Android) позволяют настроить логин/пароль. Если ваш клиент не поддерживает, можно вручную отредактировать JSON-конфиг. Также стоит избегать клиентов с открытым gRPC API, таких как Happ, который позволяет дампить конфигурацию без пароля. И наконец, регулярно проверяйте, какие порты слушают на localhost, и используйте файрвол для ограничения доступа.

Практические рекомендации по выбору клиента и настройке

При выборе VPN-клиента для Android или iOS обращайте внимание на возможность настройки аутентификации SOCKS5. Из проверенных: Husi, SFA, ручные сборки Xray. Избегайте Happ из-за критического API. Для Windows v2rayN уязвим, но можно использовать файрвол для ограничения доступа к localhost.

На роутере OpenWrt предпочтительнее sing-box, так как он поддерживает VLESS и REALITY из коробки. Для старых роутеров с малым объёмом памяти подойдёт tun2socks, но он не умеет VLESS — только SOCKS5, HTTP и Shadowsocks. Если вам нужен VLESS, придётся использовать sing-box или отдельный прокси-клиент. Также важно регулярно обновлять прошивку и пакеты, так как уязвимости исправляются.

Ограничения и подводные камни при использовании VLESS и SOCKS5

VLESS не шифрует трафик сам по себе, поэтому без TLS или REALITY он уязвим для прослушивания. REALITY требует правильной настройки public_key и short_id, иначе соединение не установится. Также sing-box версии 1.10.0 изменил формат конфигурации: вместо inet4_address нужно использовать address. Это частая причина ошибок.

Ещё один нюанс: SOCKS5 UDP работает без аутентификации, поэтому для полной безопасности лучше отключить UDP. И помните, что даже с аутентификацией локальный прокси — это точка входа для шпиона, если он получит доступ к устройству. Поэтому не устанавливайте подозрительные приложения и следите за разрешениями.

Вопросы и ответы

Чем VLESS отличается от Shadowsocks?

VLESS — это прокси-протокол без встроенного шифрования, который полагается на внешний транспорт (TLS, REALITY). Shadowsocks — самодостаточный протокол с собственным шифрованием. VLESS обычно быстрее и лучше маскируется под HTTPS, но требует более сложной настройки. Shadowsocks проще, но легче детектируется DPI.

Можно ли использовать SOCKS5 без VLESS на роутере?

Да, tun2socks поддерживает SOCKS5 напрямую. Вы можете поднять SOCKS5-прокси на отдельном сервере и настроить роутер на его использование. Однако SOCKS5 не шифрует трафик, поэтому он уязвим для перехвата. Рекомендуется использовать SOCKS5 в сочетании с TLS-туннелем или VLESS.

Как проверить, что мой VPN-клиент создаёт небезопасный SOCKS5?

На Android можно использовать приложение типа Termux и выполнить netstat -tlnp или ss -tlnp, чтобы увидеть слушающие порты. Если вы видите порт 10808 или 2080, слушающий на 127.0.0.1, и он не требует аутентификации, то клиент уязвим. Также можно попробовать подключиться к нему через curl с опцией --socks5 127.0.0.1:10808 и запросить ifconfig.me.

Что такое REALITY и зачем он нужен в VLESS?

REALITY — это технология, которая маскирует VLESS-соединение под обычный HTTPS-трафик к легитимному сайту. Она использует TLS-рукопожатие с реальным сертификатом и fingerprint браузера, что делает трафик неотличимым от обычного веб-серфинга. Это помогает обходить DPI-блокировки.

Как защитить локальный SOCKS5 от шпионских приложений?

Включите аутентификацию (auth: password) в конфигурации xray или sing-box. Используйте сложные логин и пароль. Отключите UDP, если он не нужен. Также можно ограничить доступ к порту с помощью файрвола, разрешив только определённым приложениям. И избегайте клиентов с открытым gRPC API.

Почему per-app split tunneling не защищает от уязвимости SOCKS5?

Split tunneling работает через VpnService, который перехватывает трафик на уровне TUN-интерфейса. Но локальный SOCKS5-прокси слушает на loopback (127.0.0.1), и подключение к нему не проходит через TUN. Поэтому любое приложение может напрямую подключиться к прокси, минуя VpnService, и использовать VPN-туннель без ограничений.

Какой клиент для Android безопасен из коробки?

Husi и SFA (sing-box for Android) позволяют настроить аутентификацию SOCKS5. Также можно использовать ручные сборки Xray с JSON-конфигом. Избегайте Happ, v2rayNG, NekoBox и других, которые не поддерживают auth. Проверяйте обновления, так как разработчики постепенно исправляют уязвимости.