- PVSM.RU - https://www.pvsm.ru -
Когда VPN на телефоне уже не спасает, а DPI провайдера научился резать WireGuard за секунды, приходит время переносить обфускацию на роутер. В этой статье расскажу, как я сделал полноценный аддон для Asuswrt-Merlin с веб-интерфейсом, выборочной маршрутизацией и поддержкой AmneziaWG 2.0. И почему пришлось отказаться от kernel module в пользу пользовательского пространства.
У меня ASUS GT-AX11000 с прошивкой Asuswrt-Merlin. Обычный WireGuard на роутере через встроенный клиент Merlin работает, но провайдер его видит и режет. AmneziaWG решает эту проблему за счёт обфускации, DPI не может отличить трафик от обычного UDP.
На телефоне и ПК есть клиент Amnezia VPN, и там всё работает. Но есть нюанс.
На рабочем ПК постоянно поднят корпоративный VPN. И он регулярно конфликтует с личным VPN: маршруты перебивают друг друга, DNS ломается, Split Tunneling работает через раз. В итоге: инструменты для работы, которые оказались под санкциями (GitHub Copilot, Claude, ChatGPT, Figma, Slack, список растёт каждый месяц), то работают, то нет. Переключаешь VPN, отваливается корпоративный. Поднимаешь корпоративный, отваливается доступ к заблокированным ресурсам.
Производительность падает, нервы тратятся не на код, а на маршрутизацию. И ты понимаешь, что проблему создал не ты, не твой провайдер и не твой работодатель, а люди, которые сначала блокируют, а потом думают. Блокируют инструменты, от которых зависит работа тысяч разработчиков, не предложив никакой альтернативы. Хорошо бы ведомствам, занимающимся блокировками, сначала думать о последствиях. Желательно головой, а не тем местом, которое они регулярно подставляют начальству.
Отдельная боль, YouTube. Когда его замедлили, на выручку пришёл b4 [1], инструмент, который обманывает DPI на уровне роутера без всякого VPN. Отличный продукт, спасибо автору (DanielLavrushin [2]), именно его проекты, включая xrayui [3], вдохновили меня сделать аналогичный аддон для AmneziaWG. Но b4 решает только проблему замедления, а когда блокируют целиком (AI-сервисы, мессенджеры, рабочие инструменты), нужен полноценный VPN-туннель.
Решение: перенести VPN на роутер. Корпоративный VPN на ПК остаётся как есть, а роутер сам решает куда направить трафик. Никаких конфликтов, никаких переключений.
Один туннель на весь дом, а не VPN на каждом устройстве
Выборочную маршрутизацию: YouTube и рабочие инструменты через VPN, банк напрямую
Управление через веб-интерфейс роутера, без SSH для каждого изменения
Отсутствие конфликтов с корпоративным VPN на рабочих машинах
Поддержку AmneziaWG 2.0 с новыми параметрами I1-I5 для мимикрии трафика
AmneziaWG это форк WireGuard с дополнительными параметрами обфускации. Есть kernel module [4], который компилируется, как модуль для Linux.
Проблема: роутер работает на ядре 4.1.51 (Broadcom HND). Модуль нужно кросс-компилировать с Broadcom toolchain под конкретную версию ядра. Собрал Docker-окружение, модуль скомпилировался, загрузился, handshake проходит, ping работает...
Но TCP умирал через 2 минуты. :(
Handshake свежий, ICMP работает, а TCP нет. Перезапуск помогал, но ненадолго. На десктопном клиенте с тем же сервером всё идеально. Радость длилась не долго.
После долгих разбирательств стало ясно: проблема где-то глубже, на старом ядре 4.1.51. Что-то ломается при ротации ключей. И тут моего высушенного возрастом уже недостаточно, а кого-то со стороны для продукта на коленке привлекать не хотелось.
У AmneziaWG есть amneziawg-go [6], реализация на Go, форк wireguard-go. Это то же самое, что использует десктопный клиент, статический бинарник, работает на любом ядре. Никаких проблем с совместимостью. Бинго воскликнул я и начал внедрять под уже реализованный ui.
Результат: TCP стабилен, key rotation работает, туннель не падает. Проблема со стабильностью решена полностью.
Все правила живут в отдельной цепочке AWG в таблице mangle. Очистка одной командой iptables -t mangle -F AWG. Никакого ручного удаления отдельных правил.
mangle PREROUTING → AWG chain:
1. dst-type LOCAL → RETURN # трафик к роутеру
2. dst LAN → RETURN # LAN-to-LAN
3. udp dports 67,68,123 → RETURN # DHCP, NTP
4. dst 224.0.0.0/4 → RETURN # multicast
5. dst VPN_ENDPOINT → RETURN # защита от петель
6. [direct devices → RETURN] # исключения
7. [vpn_all devices → MARK 0x100] # весь трафик через VPN
8. [vpn_geo devices + ipset → MARK] # выборочно через VPN
9. [default policy] # для остальных
Помеченный трафик (fwmark 0x100) уходит в routing table 300, где маршруты через awg0.
VPN All весь трафик через VPN
VPN Geo только трафик к IP из GeoIP/GeoSite списков
Direct устройство обходит VPN
IP-диапазоны для Telegram, Google, Netflix и других сервисов из Loyalsoldier/geoip [7]. Это CIDR-блоки, они не зависят от DNS, трафик матчится по IP назначения напрямую.
telegram,google,netflix,cloudflare
Скрипт скачивает текстовые файлы с CIDR-блоками и загружает в ipset awg_dst.
Доменные списки из v2fly/domain-list-community [8], 1400+ категорий. Работают через dnsmasq ipset: когда устройство резолвит домен, IP попадает в ipset, и последующий трафик маркируется.
youtube,google,discord,netflix,spotify
Потратил несколько часов на дебаг: правила iptables на месте, ipset наполнен, а iPhone видит прямой IP. Оказалось, iPhone использует DNS-over-HTTPS, обходя dnsmasq роутера. Домен резолвится через Apple DoH, IP не попадает в ipset.
Решение: принудительный перехват DNS + блокировка DoH/DoT:
# Перенаправить весь DNS на роутер
iptables -t nat -I PREROUTING -i br0 -p udp --dport 53 -j DNAT --to $ROUTER_IP
# Заблокировать DNS-over-TLS
iptables -I FORWARD -i br0 -p tcp --dport 853 -j REJECT
# Заблокировать DoH к известным провайдерам
for ip in 8.8.8.8 8.8.4.4 1.1.1.1 1.0.0.1 9.9.9.9; do
iptables -I FORWARD -i br0 -d $ip -p tcp --dport 443 -j REJECT
iptables -I FORWARD -i br0 -d $ip -p udp --dport 443 -j REJECT
done
Но это не помогает полностью, iPhone использует Apple DoH серверы (17.x.x.x), которых слишком много для блокировки. Финальное решение: ручной DNS на устройстве (IP роутера) для политики VPN Geo.
Для политики VPN All это не проблема, весь трафик и так идёт через VPN.
TCP SYN проходит, SYN-ACK возвращается, а данные нет. Классическая MTU/MSS проблема. Десктопный клиент делает MSS clamping автоматически, на роутере нужно явно:
iptables -t mangle -A FORWARD -o awg0 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
iptables -t mangle -A FORWARD -i awg0 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
В v2fly domain list домены могут иметь теги: cici.com [9]:@!cn. Эти теги попадали в dnsmasq конфиг и ломали его, dnsmasq не запускался. Пришлось чистить:
domain=$(echo "$domain" | sed 's/^.//;s/:@[^ ]*$//')
И уменьшить количество доменов на строку с 80 до 20, dnsmasq не переваривал слишком длинные строки ipset.
Добавил telegram в GeoSite (доменные списки), не работает. Telegram подключается напрямую по IP, минуя DNS. Нужны GeoIP CIDR-блоки, не домены. Для этого добавил отдельную секцию GeoIP Service Lists с автодополнением.
Аддон встраивается в стандартный веб-интерфейс Merlin через Addons API:
Import Config загрузка .conf файла из клиента Amnezia VPN (все поля включая I1-I5 заполняются автоматически)
Device Rules таблица устройств с выбором политики и добавлением из DHCP-списка
GeoIP Service Lists IP-диапазоны по сервисам с автодополнением
GeoSite Service Lists домены по сервисам с автодополнением из v2fly базы (1400+ категорий)
Custom Domains / IPs ручные записи
Start / Stop / Apply управление туннелем
При нажатии Apply скрипт проверяет, какие GeoIP списки отсутствуют, и скачивает только недостающие. Update Now принудительно обновляет все списки.
Одной командой по SSH:
curl -sfL https://raw.githubusercontent.com/r0otx/asuswrt-merlin-amneziawg/main/install-online.sh | sh
Скрипт сам определит архитектуру, скачает последний релиз и установит. Обновление так же, через UI появится кнопка если вышла новая версия.
Для ручной установки собирается .ipk пакет:
./build-ipk.sh
# output/amneziawg_1.0.2-1_aarch64-3.10.ipk (ARM64)
# output/amneziawg_1.0.2-1_armv7-2.6.ipk (ARM32)
Установка на роутере:
opkg install /tmp/amneziawg_1.0.2-1_aarch64-3.10.ipk
Post-install скрипт создаёт /dev/net/tun, устанавливает web UI, настраивает автозапуск.
Поддерживаются все aarch64 роутеры с Merlin (GT-AX11000, RT-AX86U, RT-AX88U и др.) и ARM32 модели (RT-AC68U). Kernel module не нужен, работает на любом ядре.
На момент публикации (март 2026) использование VPN в России не запрещено и не является правонарушением.
Федеральный закон № 281-ФЗ от 31.07.2025, вступивший в силу 1 сентября 2025 года, вводит административную ответственность за умышленный поиск и доступ к материалам из реестра экстремистских (штраф 3 000 – 5 000 руб.), а также за рекламу средств обхода блокировок (штраф до 500 000 руб.). При этом само использование VPN для обеспечения приватности, безопасности и защиты персональных данных закон не затрагивает.
Депутат Госдумы Антон Горелкин (зампред комитета по информполитике) публично подтвердил: «введение штрафов за использование VPN не планируется и даже не обсуждается».
Проект является техническим инструментом для обеспечения сетевой безопасности и приватности. Автор не несёт ответственности за использование программного обеспечения в целях, противоречащих законодательству Российской Федерации или иных юрисдикций. Пользователь самостоятельно несёт ответственность за соблюдение применимого законодательства.
Проект [10]
AmneziaWG протокол [12]
v2fly domains [8]
Место, где можно бросить в меня гнилым томатом: t.me/asusxray [13]
Автор: r00tx
Источник [14]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/vpn/448832
Ссылки в тексте:
[1] b4: https://github.com/DanielLavrushin/b4
[2] DanielLavrushin: https://github.com/DanielLavrushin
[3] xrayui: https://github.com/DanielLavrushin/asuswrt-merlin-xrayui
[4] kernel module: https://github.com/amnezia-vpn/amneziawg-linux-kernel-module
[5] мозга: http://www.braintools.ru
[6] amneziawg-go: https://github.com/amnezia-vpn/amneziawg-go
[7] Loyalsoldier/geoip: https://github.com/Loyalsoldier/geoip
[8] v2fly/domain-list-community: https://github.com/v2fly/domain-list-community
[9] cici.com: http://cici.com
[10] Проект: https://github.com/r0otx/asuswrt-merlin-amneziawg
[11] AmneziaWG 2.0 (статья): https://habr.com/ru/companies/amnezia/articles/1014636
[12] AmneziaWG протокол: https://github.com/amnezia-vpn
[13] t.me/asusxray: https://t.me/asusxray
[14] Источник: https://habr.com/ru/articles/1019440/?utm_source=habrahabr&utm_medium=rss&utm_campaign=1019440
Нажмите здесь для печати.