Зачем проксировать трафик на роутере, а не на каждом устройстве
Когда в доме больше двух-трёх устройств, установка VPN-клиента на каждое из них превращается в источник постоянных проблем. Smart TV, игровые консоли и IoT-устройства часто не поддерживают современные протоколы вроде VLESS, а на мобильных клиентах туннель может незаметно отключаться, оставляя трафик без защиты. Кроме того, постоянная работа VPN-приложения на смартфоне заметно расходует батарею.
Прокси-шлюз на роутере решает эти задачи централизованно: любое устройство, подключённое по Wi-Fi или кабелю, автоматически получает доступ через защищённый канал, даже не подозревая об этом. Настройка выполняется один раз, обновление конфигурации происходит в одном месте, а пользователям не нужно разбираться в клиентах. Цена такого подхода — более сложная первоначальная настройка, но она окупается, когда речь идёт о десятке устройств.
В этой статье мы разберём полный путь от коробочного роутера до работающей системы на базе OpenWrt, Xray и VLESS Reality. Вы узнаете, как выбрать подходящее железо, настроить прозрачное проксирование TCP-трафика, организовать сплит-роутинг по геолокации и доменам, защитить DNS-запросы и обеспечить автоматическое восстановление после сбоев.
Выбор роутера: требования к железу и подводные камни
Не каждый роутер способен выполнять функции прокси-шлюза. Xray-core написан на Go и потребляет около 100 МБ оперативной памяти, плюс geodata для маршрутизации занимает ещё примерно 85 МБ в tmpfs. Поэтому устройства с 128 МБ RAM категорически не подходят. Минимальный комфортный объём — 256 МБ, а оптимальный — 512 МБ.
Процессор также играет ключевую роль: шифрование и дешифрование трафика требует вычислительных ресурсов. Роутеры на базе MIPS с частотой около 580 МГц будут задыхаться даже при небольшом количестве подключений. Рекомендуется выбирать модели с ARM Cortex-A53 или более новыми ядрами.
Популярный выбор — Cudy TR3000 v1 на базе MediaTek Filogic MT7981B: два ядра ARM Cortex-A53, 496 МБ DDR4, 128 МБ NAND-флеша, порт WAN 2.5GbE и три порта LAN 1GbE, Wi-Fi 6. Такая конфигурация обеспечивает достаточную производительность для шифрования и оставляет запас на будущее.
Обратите внимание на ревизии железа. У Cudy TR3000 v1 роутеры с серийными номерами от 2544 и выше (примерно с ноября 2025 года) оснащаются новым чипом NAND Flash ESMT F50L1G41LC. Старые образы OpenWrt на них не загружаются, а поддержка появилась только в версии 24.10.5 и новее. Для прошивки таких устройств требуется специальная промежуточная прошивка от Cudy, иначе роутер можно превратить в «кирпич».
Прошивка OpenWrt: пошаговый процесс и важные нюансы
Процесс установки OpenWrt на Cudy TR3000 v1 состоит из двух этапов. Сначала из стоковой прошивки Cudy через веб-интерфейс загружается bin-файл из архива intermediate firmware. После перезагрузки появляется LuCI от промежуточной версии OpenWrt, через которую выполняется sysupgrade на финальную версию — например, 25.12.2.
После прошивки доступ к роутеру осуществляется по SSH: ssh root@192.168.1.1. В новых версиях OpenWrt (начиная примерно с 25.x) пакетный менеджер заменён с opkg на apk, поэтому команды установки отличаются. Например, для установки необходимых пакетов используется:
apk update
apk add xray-core kmod-nft-tproxy kmod-nf-tproxy nftables-json curlВажно убедиться, что версия OpenWrt поддерживает ваш конкретный роутер. Список совместимых устройств доступен на openwrt.org/toh. Перед прошивкой рекомендуется сохранить резервную копию заводской прошивки, чтобы иметь возможность откатиться в случае проблем.
Архитектура решения: как работает прозрачный прокси-шлюз
Система строится вокруг нескольких ключевых компонентов. Устройства в локальной сети отправляют TCP-трафик на роутер, где nftables с помощью TPROXY перехватывает пакеты и направляет их в Xray на порту 12345. Xray анализирует трафик, определяет пункт назначения и принимает решение: отправить его напрямую или через защищённый канал VLESS+Reality.
DNS-запросы обрабатываются отдельно. AdGuard Home на порту 53 принимает DNS от устройств, фильтрует рекламу и трекеры, а затем резолвит запросы через DNS-over-HTTPS (DoH). HTTPS-трафик к DNS-серверам также проходит через TPROXY и уходит через прокси. Таким образом, ни один незашифрованный DNS-запрос не покидает роутер.
Сплит-роутинг позволяет направлять только нужный трафик через VPN. Например, российские сайты (geoip:ru) и домены .ru идут напрямую, а всё остальное — через защищённый канал. Это снижает нагрузку на прокси и уменьшает задержки для локальных ресурсов.
Важно понимать ограничение: текущая схема проксирует только TCP-трафик. UDP, за исключением DNS, идёт напрямую. Это осознанное архитектурное решение, которое можно расширить в будущем.
Почему TPROXY, а не REDIRECT: технические детали
Существует два основных способа перехвата трафика на роутере: REDIRECT (DNAT) и TPROXY. REDIRECT подменяет адрес назначения на 127.0.0.1:порт, из-за чего оригинальный IP теряется. Прокси-серверу приходится восстанавливать его из заголовков протокола — HTTP Host или TLS SNI. Для трафика, который не использует эти протоколы, восстановление невозможно.
TPROXY (Transparent Proxy) передаёт пакет приложению с сохранением оригинального IP-адреса назначения. Xray видит реальный адрес, куда клиент хотел подключиться, и может корректно маршрутизировать запрос. Это критически важно для прозрачного проксирования любого TCP-трафика, включая не-HTTP и не-TLS протоколы.
TPROXY сложнее в настройке: требуются специальные модули ядра, policy routing и правила nftables. Однако он надёжнее и универсальнее. В конфигурации Xray для TPROXY используется параметр sockopt.tproxy: "tproxy", а входящее соединение настраивается через протокол dokodemo-door с followRedirect: true.
Конфигурация Xray: входящие и исходящие соединения
Конфигурация Xray состоит из нескольких секций. Входящее соединение (inbound) настраивается для приёма перенаправленного трафика:
{
"tag": "tproxy-in",
"port": 12345,
"protocol": "dokodemo-door",
"settings": {
"network": "tcp",
"followRedirect": true
},
"sniffing": {
"enabled": true,
"destOverride": ["http", "tls"],
"routeOnly": true
},
"streamSettings": {
"sockopt": {
"tproxy": "tproxy"
}
}
}Протокол dokodemo-door — это «дверь куда угодно», которая принимает прозрачно перенаправленный трафик. followRedirect: true позволяет использовать оригинальный адрес назначения, восстановленный TPROXY. Сниффинг с destOverride: ["http", "tls"] извлекает домен из SNI или Host-заголовка, что необходимо для маршрутизации по доменам. Флаг routeOnly: true гарантирует, что домен используется только для принятия решения о маршруте, а само соединение устанавливается по оригинальному IP.
Исходящие соединения (outbounds) бывают трёх типов: прокси-серверы VLESS+Reality, прямое соединение (freedom) и блокировка (blackhole). Для прокси-сервера указываются адрес, порт, UUID пользователя, flow xtls-rprx-vision, а также параметры Reality: serverName, publicKey, fingerprint и shortId.
Пример исходящего соединения:
{
"tag": "proxy-1",
"protocol": "vless",
"settings": {
"vnext": [{
"address": "your-server.example.com",
"port": 443,
"users": [{
"id": "ваш-uuid",
"flow": "xtls-rprx-vision",
"encryption": "none"
}]
}]
},
"streamSettings": {
"network": "tcp",
"security": "reality",
"realitySettings": {
"serverName": "sni-domain.example.com",
"publicKey": "ваш-publicKey",
"fingerprint": "chrome",
"shortId": "1234"
}
}
}Параметр fingerprint: "chrome" заставляет Xray имитировать TLS-отпечаток браузера Chrome, что затрудняет обнаружение DPI.
Сплит-роутинг и балансировка нагрузки
Сплит-роутинг позволяет гибко управлять тем, какой трафик идёт через прокси, а какой напрямую. В Xray это реализуется через правила маршрутизации, которые могут использовать геоданные (geoip) и списки доменов (geosite). Например, можно настроить правило: если домен заканчивается на .ru или IP принадлежит России, то использовать outbound direct, иначе — proxy-1.
Для балансировки нагрузки между несколькими серверами используется модуль Observatory. Он периодически проверяет доступность серверов, отправляя HTTP-запросы к контрольной точке (например, http://cp.cloudflare.com). На основе результатов выбирается сервер с наименьшей задержкой (leastPing).
Пример конфигурации Observatory:
{
"observatory": {
"subjectSelector": ["proxy-"],
"probeURL": "http://cp.cloudflare.com",
"probeInterval": "120s",
"enableConcurrency": true
}
}Это позволяет автоматически переключаться на резервный сервер в случае сбоя основного, обеспечивая высокую доступность.
Защита DNS: AdGuard Home и DNS-over-HTTPS
DNS-запросы — это один из самых уязвимых элементов сетевой инфраструктуры. Если они передаются в открытом виде, провайдер или злоумышленник может видеть, какие сайты вы посещаете, и подменять ответы. Для защиты DNS в рассматриваемой схеме используется AdGuard Home, который работает на роутере и принимает все DNS-запросы от устройств.
AdGuard Home не только фильтрует рекламу и трекеры, но и перенаправляет запросы через DNS-over-HTTPS к публичным резолверам, например Cloudflare (1.1.1.1) или Google (8.8.8.8). HTTPS-трафик к DNS-серверам проходит через TPROXY и уходит через защищённый канал, что гарантирует конфиденциальность.
Важно, что DNS-серверы провайдера, полученные по PPPoE, не используются. Вместо них настраиваются Cloudflare и Google. Это предотвращает утечку DNS-запросов и повышает устойчивость к блокировкам.
Настройка AdGuard Home включает установку пакета, настройку upstream DNS-серверов и включение фильтрации. После этого все устройства в сети автоматически получают защищённый DNS.
Автоматическое восстановление и мониторинг
Стабильность работы прокси-шлюза критически важна. Если Xray упадёт, весь трафик, который должен идти через прокси, может быть заблокирован или уйти напрямую. Для автоматического восстановления используются несколько механизмов.
Во-первых, procd — система инициализации OpenWrt — может автоматически перезапускать службу Xray при её падении. Для этого в init-скрипте указывается параметр procd_set_param respawn.
Во-вторых, watchdog (сторожевой таймер) может отслеживать доступность прокси и перезагружать роутер при зависании. Это грубый, но эффективный метод.
В-третьих, hotplug-скрипты позволяют реагировать на изменения сетевых интерфейсов, например, перезапускать Xray при переподключении PPPoE.
Кроме того, Xray имеет встроенный механизм Observatory, который следит за состоянием серверов и автоматически переключается на резервные. Это обеспечивает высокую доступность даже при сбоях на стороне VPN-провайдера.
В итоге система может работать неделями без перезагрузки, самостоятельно восстанавливаясь после большинства сбоев.
Ограничения и практические рекомендации
Несмотря на все преимущества, у описанной схемы есть ограничения. Главное — проксируется только TCP-трафик. UDP, например, для онлайн-игр или видеозвонков, идёт напрямую. Это может быть проблемой, если нужно проксировать UDP-приложения. В таком случае потребуется дополнительная настройка, например, использование TUN-интерфейса.
Также стоит учитывать, что Xray потребляет значительные ресурсы, поэтому выбор роутера с достаточным объёмом RAM и производительным процессором критичен. Роутеры с 128 МБ RAM не подойдут.
При использовании PPPoE важно правильно настроить MTU. Для PPPoE стандартное значение — 1480 байт (1500 минус 8 байт PPP и 12 байт PPPoE). OpenWrt автоматически настраивает MSS clamping, что предотвращает проблемы с фрагментацией.
Рекомендуется регулярно обновлять geodata (geoip и geosite), чтобы маршрутизация оставалась актуальной. Это можно автоматизировать с помощью cron-заданий.
Наконец, помните о юридических аспектах: использование VPN должно соответствовать законодательству вашей страны и условиям обслуживания используемых сервисов.
Вопросы и ответы
Какие минимальные требования к роутеру для VLESS Reality на OpenWrt?
Для работы Xray-core требуется минимум 256 МБ оперативной памяти, но комфортно — 512 МБ. Процессор должен быть ARM Cortex-A53 или мощнее, так как MIPS-роутеры с частотой около 580 МГц не справятся с шифрованием. Также необходима поддержка OpenWrt — проверяйте совместимость на openwrt.org/toh.
В чём разница между TPROXY и REDIRECT при настройке прозрачного прокси?
REDIRECT (DNAT) подменяет адрес назначения на локальный, из-за чего оригинальный IP теряется, и прокси должен восстанавливать его из заголовков HTTP или TLS. TPROXY сохраняет оригинальный IP назначения, что позволяет проксировать любой TCP-трафик, включая не-HTTP и не-TLS протоколы. TPROXY сложнее в настройке, но надёжнее.
Как защитить DNS-запросы при использовании прокси на роутере?
Используйте AdGuard Home на роутере, который принимает все DNS-запросы от устройств, фильтрует рекламу и перенаправляет запросы через DNS-over-HTTPS к публичным резолверам (например, Cloudflare 1.1.1.1). HTTPS-трафик к DNS-серверам проходит через TPROXY и уходит через защищённый канал, что исключает утечку открытых DNS-запросов.
Можно ли использовать несколько VPN-серверов с автоматическим переключением?
Да, Xray поддерживает пул серверов и балансировку нагрузки через модуль Observatory. Он периодически проверяет доступность серверов, отправляя HTTP-запросы к контрольной точке, и выбирает сервер с наименьшей задержкой. При сбое основного сервера трафик автоматически переключается на резервный.
Какие ограничения у схемы с TPROXY на OpenWrt?
Основное ограничение — проксируется только TCP-трафик. UDP (кроме DNS) идёт напрямую. Это может быть неприемлемо для онлайн-игр или видеозвонков. Также требуется роутер с достаточными ресурсами (RAM от 256 МБ, CPU ARM Cortex-A53), иначе производительность будет низкой.
Что делать, если роутер Cudy TR3000 v1 не загружает OpenWrt?
Проверьте серийный номер. Роутеры с серийниками от 2544 и выше используют новый чип NAND Flash ESMT F50L1G41LC, поддержка которого появилась только в OpenWrt 24.10.5+. Для прошивки требуется специальная промежуточная прошивка от Cudy (ZIP-архив с датой 20251118), а затем sysupgrade на нужную версию. Без промежуточной прошивки роутер может выйти из строя.
Как настроить сплит-роутинг, чтобы российские сайты шли напрямую?
В конфигурации Xray добавьте правила маршрутизации, которые используют geoip:ru и geosite с доменами .ru. Если IP или домен соответствует российским, направляйте трафик в outbound direct, иначе — в прокси. Сниффинг с destOverride: ["http", "tls"] позволяет определять домены из SNI или Host-заголовка.