
Когда VPN на телефоне уже не спасает, а DPI провайдера научился резать WireGuard за секунды, приходит время переносить обфускацию на роутер. В этой статье расскажу, как я сделал полноценный аддон для Asuswrt-Merlin с веб-интерфейсом, выборочной маршрутизацией и поддержкой AmneziaWG 2.0. И почему пришлось отказаться от kernel module в пользу пользовательского пространства.
Проблема
У меня ASUS GT-AX11000 с прошивкой Asuswrt-Merlin. Обычный WireGuard на роутере через встроенный клиент Merlin работает, но провайдер его видит и режет. AmneziaWG решает эту проблему за счёт обфускации, DPI не может отличить трафик от обычного UDP.
На телефоне и ПК есть клиент Amnezia VPN, и там всё работает. Но есть нюанс.
Корпоративный VPN и бесконечные конфликты
На рабочем ПК постоянно поднят корпоративный VPN. И он регулярно конфликтует с личным VPN: маршруты перебивают друг друга, DNS ломается, Split Tunneling работает через раз. В итоге: инструменты для работы, которые оказались под санкциями (GitHub Copilot, Claude, ChatGPT, Figma, Slack, список растёт каждый месяц), то работают, то нет. Переключаешь VPN, отваливается корпоративный. Поднимаешь корпоративный, отваливается доступ к заблокированным ресурсам.
Производительность падает, нервы тратятся не на код, а на маршрутизацию. И ты понимаешь, что проблему создал не ты, не твой провайдер и не твой работодатель, а люди, которые сначала блокируют, а потом думают. Блокируют инструменты, от которых зависит работа тысяч разработчиков, не предложив никакой альтернативы. Хорошо бы ведомствам, занимающимся блокировками, сначала думать о последствиях. Желательно головой, а не тем местом, которое они регулярно подставляют начальству.
Отдельная боль, YouTube. Когда его замедлили, на выручку пришёл b4, инструмент, который обманывает DPI на уровне роутера без всякого VPN. Отличный продукт, спасибо автору (DanielLavrushin), именно его проекты, включая xrayui, вдохновили меня сделать аналогичный аддон для AmneziaWG. Но b4 решает только проблему замедления, а когда блокируют целиком (AI-сервисы, мессенджеры, рабочие инструменты), нужен полноценный VPN-туннель.
Решение: перенести VPN на роутер. Корпоративный VPN на ПК остаётся как есть, а роутер сам решает куда направить трафик. Никаких конфликтов, никаких переключений.
Что хочется получить
Один туннель на весь дом, а не VPN на каждом устройстве
Выборочную маршрутизацию: YouTube и рабочие инструменты через VPN, банк напрямую
Управление через веб-интерфейс роутера, без SSH для каждого изменения
Отсутствие конфликтов с корпоративным VPN на рабочих машинах
Поддержку AmneziaWG 2.0 с новыми параметрами I1-I5 для мимикрии трафика
Первый подход: kernel module
AmneziaWG это форк WireGuard с дополнительными параметрами обфускации. Есть kernel module, который компилируется, как модуль для Linux.
Проблема: роутер работает на ядре 4.1.51 (Broadcom HND). Модуль нужно кросс-компилировать с Broadcom toolchain под конкретную версию ядра. Собрал Docker-окружение, модуль скомпилировался, загрузился, handshake проходит, ping работает...
Но TCP умирал через 2 минуты. :(
Handshake свежий, ICMP работает, а TCP нет. Перезапуск помогал, но ненадолго. На десктопном клиенте с тем же сервером всё идеально. Радость длилась не долго.
После долгих разбирательств стало ясно: проблема где-то глубже, на старом ядре 4.1.51. Что-то ломается при ротации ключей. И тут моего высушенного возрастом мозга уже недостаточно, а кого-то со стороны для продукта на коленке привлекать не хотелось.
Решение: userspace
У AmneziaWG есть amneziawg-go, реализация на Go, форк wireguard-go. Это то же самое, что использует десктопный клиент, статический бинарник, работает на любом ядре. Никаких проблем с совместимостью. Бинго воскликнул я и начал внедрять под уже реализованный ui.
Результат: TCP стабилен, key rotation работает, туннель не падает. Проблема со стабильностью решена полностью.
Кастомная iptables-цепочка
Все правила живут в отдельной цепочке 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
GeoIP по сервисам
IP-диапазоны для Telegram, Google, Netflix и других сервисов из Loyalsoldier/geoip. Это CIDR-блоки, они не зависят от DNS, трафик матчится по IP назначения напрямую.
telegram,google,netflix,cloudflare
Скрипт скачивает текстовые файлы с CIDR-блоками и загружает в ipset awg_dst.
GeoSite по доменам
Доменные списки из v2fly/domain-list-community, 1400+ категорий. Работают через dnsmasq ipset: когда устройство резолвит домен, IP попадает в ipset, и последующий трафик маркируется.
youtube,google,discord,netflix,spotify
Грабли на пути
1. iPhone и зашифрованный DNS
Потратил несколько часов на дебаг: правила 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.
2. MSS clamping
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
3. Теги v2fly ломали dnsmasq
В v2fly domain list домены могут иметь теги: cici.com:@!cn. Эти теги попадали в dnsmasq конфиг и ломали его, dnsmasq не запускался. Пришлось чистить:
domain=$(echo "$domain" | sed 's/^\.//;s/:@[^ ]*$//')
И уменьшить количество доменов на строку с 80 до 20, dnsmasq не переваривал слишком длинные строки ipset.
4. Telegram и прямые IP
Добавил 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 появится кнопка если вышла новая версия.
Entware .ipk пакет
Для ручной установки собирается .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 не планируется и даже не обсуждается».
Проект является техническим инструментом для обеспечения сетевой безопасности и приватности. Автор не несёт ответственности за использование программного обеспечения в целях, противоречащих законодательству Российской Федерации или иных юрисдикций. Пользователь самостоятельно несёт ответственность за соблюдение применимого законодательства.
Ссылки
Место, где можно бросить в меня гнилым томатом: t.me/asusxray
Комментарии (26)

LightRider
05.04.2026 11:23Я Вам писал на github в Issues, оставлю тут комментарий:
При попытке установки через скрипт (Быстрая установка (одна команда) пишет:
Architecture: armv7l (armv7-2.6) ERROR: Entware not installed. Install it first via amtm.Другой пользователь написал что это ошибка в проверке версии Entware . Однако если убрать эту строчку из скрипта автоустановки, то конкретно в моем случае будет такая ошибка:
Unknown package ‘amneziawg’. Collected errors:pkg_hash_fetch_best_installation_candidate: Packages for amneziawg found, but incompatible with the architectures configuredopkg_install_cmd: Cannot install package amneziawg.
Такая же ошибка возникает, если просто скачать пакет ipk, залить на роутер и попытаться установить через opkg. Сам роутер AX56U, armV7. Пробовал ставить все версии из релиза, ставил как ArmV7 так и aarch64 - результат один и тот же -
Unknown package ‘amneziawg’. Collected errors:pkg_hash_fetch_best_installation_candidate: Packages for amneziawg found, but incompatible with the architectures configuredopkg_install_cmd: Cannot install package amneziawg.
То же самое и про самостоятельной сборке скриптом build_apk, причем подсовывал ему файлы amneziawg-go-arm и awg-arm из вашего релиза, а также собирал amneziawg-go-arm самостоятельно с помощью:
CGO_ENABLED=0 GOOS=linux GOARCH=arm go build -ldflags="-s -w" -o amneziawg-goЕсли самостоятельно закинуть все файлы из ipk на роутер, прописать все команды из скрипта установки, то все равно команда
awg showвыдаетне найден awg.Что я делаю не так, и как заставить программу работать на AX56U?
Также вопрос - для сборки версии "kernel module" (не Go) нужна папка merlin-kernel, где ее взять?

r00tx Автор
05.04.2026 11:23Сделал релиз в ишью отписал, 1.1.3 по идее должно пофикситься, попробуйте, если нет, ветку пока не закрывал для обсуждений

achekalin
05.04.2026 11:23А вот правда, какой роутер нынче брать из более-менее бюджетных, чтобы на него можно было либо ставить доп. софт штатно, либо заменить прошивку на неродную, и неё уже ставить софт?
Тема не самая простая: на иных роутерах с левой прошивкой хуже начинает работать wifi (дрова потому что), на других просто так левую прошивку не поставишь. А те, что вроде бери и юзай, стоят как-то уже негуманно - либо просто не продаются легко.
Спрашиваю, сами понимаете, для мирных целей )

aborouhin
05.04.2026 11:23Разнесите функции роутера и WiFi точки доступа. Роутер можно собрать на любом клоне "малинки" (у BananaPi есть прямо интересные платы именно под роутеры, но если Вам не нужно SFP и много портов - можно дешевле), мини-ПК или даже старом ноуте. И ставьте на него привычный полноценный Linux, не надо вникать в нюансы каких-то прошивок. А точку доступа уже выбирайте не по софту, а по мощности/дальнобойности (лично предпочитаю Unifi, но они в последнее время стóят негуманно).

mikelavr
05.04.2026 11:23Keenetic/Netcraze. Там и Entware/OPKG можно рядом пристроить (не на все модели!).

Ponywka
05.04.2026 11:23Посмотрите в сторону роутеров семейства Cudy WR3000. На 4PDA есть ветка где сравниваются все роутеры из этого семейства - можно выбрать любой по душе.

igrblkv
05.04.2026 11:23мини-ПК (или обычный не сильно старый ПК для экономии) как роутер с OpenWRT/pfSense/OPNsense и отдельную Точку Доступа.

b1ora
05.04.2026 11:23Нынче MikroTik стабильно умеет в контейнеры, где можно запускать всё что угодно с поддержкой ARM
На WRT прошивках подобный подход?

aborouhin
05.04.2026 11:23Контейнеры в Микротиках (даже в тех, где их поддержка есть) тот ещё костыль. Тормозят, а главное - их никак не ограничить в использовании ресурсов, и занявший все CPU или RAM контейнер подвешивает весь роутер. В итоге у меня на трёх микротиках, теоретически умеющих в контейнеры, экзотические протоколы ходят через примотанные скотчем к роутеру "малинки" :)
А на OpenWRT всё гораздо лучше - родной софт, который ставится через пакетный менеджер.

b1ora
05.04.2026 11:23Не знаю у кого что тормозит, но у меня все прекрасно работает на MIHOMO.
Но конечно не хватает пакетного менеджера чтобы не городить лишние сущности.

aborouhin
05.04.2026 11:23Любой VPN на каком-то трафике упрётся в 100% CPU. Проблема в том, что на микротике если это случается со встроенным VPN - роутер в целом продолжает работать, просто скорость туннеля ограничивается. А если с VPN в контейнере - увы. Опыты ставил примерно 2 года назад, буду рад, если что-то изменилось.

b1ora
05.04.2026 11:23Лучше обновить свой опыт, т.к. за 2 года для изначально сырого продукта поменялось практически всё.

aborouhin
05.04.2026 11:23Ага, по документации вижу, что появилась возможность ограничивать использование RAM контейнерами и закреплять за ними конкретные ядра CPU. Этого очень не хватало. Проверять не буду, т.к. у меня переход на отдельную малинку ещё и изрядно добавил производительности, роутеры RB3011UiAS-RM, слабенькие, - но у кого железка позволяет, уже проще стало жить, да.

lked
05.04.2026 11:23Хорошо сделано, особенно GeoSite через dnsmasq ipset.
В статье серверная часть подразумевается готовой - для тех кому нужно поднять сервер с нуля можно глянуть https://github.com/bivlked/amneziawg-installer. Одна команда на Ubuntu/Debian VPS, ставит AWG 2.0 с I1-I5, генерирует .conf и QR-коды. Импортируешь в этот аддон и всё работает.
Автор — я, если что)

FIRSIK
05.04.2026 11:23Не пинайте сильно!
У меня после запуска скрипта такая фигня:Entware: OK
Architecture: aarch64-3.10
Fetching latest release…
Latest version: 1.1.6
Package: amneziawg_1.1.6-1_aarch64-3.10.ipk
sh: mktemp: not found
ERROR: Cannot create temp directory
admin@RT-AX88U-19E0:/tmp/home/root#
Куда копать?
Last26
Дружище ну ты выбрал не простой путь конечно )) я тоже через все это проходил в конечном итоге отказался от amnezia тк все эти мучения все равно упираются в шейпинг udp на удалённых ВПС и т.д...возня с ipset тоже такое себе позавчерашний день как по мне...я в итоге пришёл к такой связке openwrt + sing-box(вся маршрутизация внутри его конфига geoip+домены быстро и просто) + adguardhome + nft...и никакой возни со списками ipset и хитрыми правилами iptables ... До этого использовал ipset в итоге приходилось городить очень сложные конструкции с перехватом трафика в raw и очень жестской иерархией правил..)
acsent1
Маршрутизация на роутере - это путь в никуда, хотя удобно конечно
Last26
Почему? Если это постоянная маршрутизация ..учитывая наши реалии .. У меня домашний роутер в то же время и входной узел для впн..
aborouhin
Хм. Роутер как бы уже в силу своего названия предназначен именно для маршрутизации :) Так что мысль не вполне понятна.