OpenWRT + Zapret на Cudy WR3000S: обход DPI-блокировок через отдельный роутер

Задача -- пустить трафик (YouTube, Discord и прочее заблокированное) через Zapret, не трогая основной роутер. Для этого используется отдельный роутер Cudy WR3000S с OpenWrt и пакетом Zapret. Основной роутер (Asus RT-N66U) раздаёт "чистый" интернет, Cudy -- интернет через Zapret. Переключение на ПК -- двумя bat-скриптами.


Топология сети

                    ISP
                     |
                   [ONT]
                     |
            [Asus RT-N66U] 192.168.1.2
            (основной роутер, чистый интернет)
                     |
               [Коммутатор]
                /         \
              ПК         [Cudy WR3000S]
         192.168.1.4      WAN: 192.168.1.100  (VLAN 1)
                          LAN: 192.168.2.1    (VLAN 2)
                           |
                     ТВ, устройства
                      192.168.2.x

Две подсети:

  • 192.168.1.0/24 -- основная, Asus. Чистый интернет. ПК, ноутбуки, телефоны.
  • 192.168.2.0/24 -- Cudy. Zapret. ТВ, устройства которым нужен YouTube.

ПК подключён к коммутатору (192.168.1.x). Переключение шлюза (Asus или Cudy) -- скриптами, без перетыкания кабелей.


Оборудование

  • Cudy WR3000S V1.0 -- MT7981B (Filogic 820), 256 MB RAM, 128 MB Flash, Wi-Fi 6 (AX3000). Порты: 1 WAN + 4 LAN (все гигабитные). Поддержка OpenWrt с 24.x.
  • Asus RT-N66U -- основной роутер, 192.168.1.2. Раздаёт интернет в 192.168.1.0/24.
  • Коммутатор -- неуправляемый, между Asus и Cudy.

Установка OpenWrt: двухэтапная прошивка

Стоковая прошивка Cudy 2.4.6 проверяет цифровую подпись -- прямая заливка OpenWrt отклоняется. Нужна двухэтапная установка.

Этап 1: промежуточная прошивка Cudy

Промежуточный образ подписан ключом Cudy -- роутер его принимает. Файл:

cudy_wr3000s-v1-sysupgrade_20251119.bin (14.25 MB)

Порядок:

  1. Зайти на роутер: http://192.168.2.1.
  2. Сделать бэкап: Система -> Резервная копия -> "Создать архив".
  3. Записать Wi-Fi пароли.
  4. Прошить: Система -> Прошивка -> Выбрать промежуточный файл -> Обновить.
  5. Ждать 5-7 минут. После перезагрузки адрес изменится на 192.168.1.1.
  6. На ПК выставить IP 192.168.1.100, маска 255.255.255.0, шлюз 192.168.1.1.
  7. Зайти: http://192.168.1.1, логин root, пароль пустой.

Этап 2: OpenWrt 25.12.0

Файл:

openwrt-25.12.0-mediatek-filogic-cudy_wr3000s-v1-squashfs-sysupgrade.bin (9.01 MB)

Порядок:

  1. В веб-интерфейсе промежуточной прошивки: System -> Backup / Flash Firmware.
  2. Flash new firmware image -> выбрать файл OpenWrt.
  3. Снять галочку "Keep settings".
  4. Flash image. Ждать 5 минут.
  5. Зайти: http://192.168.1.1, логин root, пароль пустой.
  6. Убедиться: Status -> Overview -> OpenWrt Version: 25.12.0.

Базовая настройка: сеть, WiFi, Zapret

После установки OpenWrt роутер доступен по 192.168.1.1. Нужно загрузить конфиги, настроить Wi-Fi и поставить Zapret.

Загрузка конфигов

Сначала установить пароль root через веб-интерфейс -- без этого SSH недоступен (dropbear не принимает пустой пароль по сети):

  1. Открыть http://192.168.1.1, логин root, пароль пустой.
  2. System -> Administration -> Router Password -> задать пароль -> Save & Apply.

После этого SSH работает. С ПК (из каталога с конфигами):

scp network root@192.168.1.1:/etc/config/network
scp firewall root@192.168.1.1:/etc/config/firewall
scp dhcp root@192.168.1.1:/etc/config/dhcp
scp wireless root@192.168.1.1:/etc/config/wireless

ssh root@192.168.1.1 "/etc/init.d/network restart"

После перезапуска сети роутер перейдёт в подсеть 192.168.2.x и будет доступен по http://192.168.2.1. Для подключения к нему с ПК: задать IP 192.168.2.100 или подключиться к Wi-Fi Cudy.

Wi-Fi

Конфиг загружен на предыдущем шаге. Применить:

ssh root@192.168.2.1 "wifi reload"

Сети: Cudy_Zapret_5G, Cudy_Zapret_2G. Пароль задан в /etc/config/wireless (поле option key).

Если сети не видны -- дать OpenWrt пересоздать конфиг:

ssh root@192.168.2.1 "rm /etc/config/wireless && reboot"

После перезагрузки восстановить SSID и пароль:

uci set wireless.@wifi-iface[0].ssid='Cudy_Zapret_5G'
uci set wireless.@wifi-iface[0].key='ВАШ_ПАРОЛЬ'
uci set wireless.@wifi-iface[1].ssid='Cudy_Zapret_2G'
uci set wireless.@wifi-iface[1].key='ВАШ_ПАРОЛЬ'
uci commit wireless
wifi reload

Zapret

OpenWrt 25 использует apk (не opkg). Пакеты берём из zapret-openwrt releases.

Нужны три файла:

zapret_XX-1_aarch64_cortex-a53.apk
luci-app-zapret_XX-1_all.apk
luci-i18n-zapret-ru_XX-1_all.apk

Загрузка и установка:

scp zapret_*.apk root@192.168.2.1:/tmp/
scp luci-app-zapret_*.apk root@192.168.2.1:/tmp/
scp luci-i18n-zapret-ru_*.apk root@192.168.2.1:/tmp/

ssh root@192.168.2.1 "cd /tmp && apk add --allow-untrusted zapret_*.apk luci-app-zapret_*.apk luci-i18n-zapret-ru_*.apk"

Загрузить конфиг и список доменов:

scp zapret root@192.168.2.1:/etc/config/zapret

ssh root@192.168.2.1 "mkdir -p /opt/zapret/ipset && cat > /opt/zapret/ipset/zapret-hosts-user.txt << 'EOF'
youtube.com
googlevideo.com
ytimg.com
ggpht.com
discord.com
discordapp.com
gateway.discord.gg
cdn.discordapp.com
media.discordapp.net
EOF"

Включить автозапуск и перезагрузить:

ssh root@192.168.2.1 "/etc/init.d/zapret enable && reboot"

После перезагрузки проверить: подключиться к Wi-Fi Cudy, открыть YouTube.


Два сегмента: bridge-VLAN на DSA

Задача -- разделить порты Cudy на два сегмента:

  • VLAN 1 (порты wan, lan1, lan2) -- подсеть 192.168.1.0/24, подключение к Asus.
  • VLAN 2 (порты lan3, lan4) -- подсеть 192.168.2.0/24, Zapret, ТВ.

Почему не два моста

Cudy WR3000S на DSA (Device Switching Architecture). На DSA нельзя создать два разных моста (br-wan и br-lan) на портах одного аппаратного свитча -- порт отключается, в dmesg ошибка "hw VLAN already used". Решение: один мост br-lan с vlan_filtering и bridge-VLAN.

Конфиг /etc/config/network

config device
	option name 'br-lan'
	option type 'bridge'
	option vlan_filtering '1'
	list ports 'wan'
	list ports 'lan1'
	list ports 'lan2'
	list ports 'lan3'
	list ports 'lan4'

config bridge-vlan
	option device 'br-lan'
	option vlan '1'
	list ports 'wan:u'
	list ports 'lan1:u'
	list ports 'lan2:u'

config bridge-vlan
	option device 'br-lan'
	option vlan '2'
	list ports 'lan3:u'
	list ports 'lan4:u'

config interface 'lan'
	option device 'br-lan.2'
	option proto 'static'
	option ipaddr '192.168.2.1'
	option netmask '255.255.255.0'
	option ip6assign '60'

config interface 'wan'
	option device 'br-lan.1'
	option proto 'static'
	option ipaddr '192.168.1.100'
	option netmask '255.255.255.0'
	option gateway '192.168.1.2'
	option dns '192.168.1.2 8.8.8.8'

config interface 'wan6'
	option device 'br-lan.1'
	option proto 'dhcpv6'
	option reqaddress 'try'
	option reqprefix 'auto'

Что тут происходит:

  • Один мост br-lan объединяет все пять портов, vlan_filtering '1' включает фильтрацию.
  • bridge-vlan с vlan '1' -- порты wan, lan1, lan2 (untagged). Подинтерфейс br-lan.1.
  • bridge-vlan с vlan '2' -- порты lan3, lan4 (untagged). Подинтерфейс br-lan.2.
  • Интерфейс wan привязан к br-lan.1 (VLAN 1, подсеть 192.168.1.x). Статический IP 192.168.1.100, шлюз -- Asus 192.168.1.2.
  • Интерфейс lan привязан к br-lan.2 (VLAN 2, подсеть 192.168.2.x). IP 192.168.2.1 -- адрес Cudy для клиентов.

Статический WAN IP

Cudy WAN фиксируется на 192.168.1.100 (статический, не DHCP от Asus). Это избавляет от проблем с DHCP-резервацией на Asus и гарантирует стабильный IP для скриптов переключения шлюза.

На Asus нужно убедиться, что 192.168.1.100 не входит в пул DHCP (или исключён).


Firewall: forward wan->wan для fw4 (nftables)

Ключевой момент. ПК находится в 192.168.1.x, шлюз -- 192.168.1.100 (Cudy WAN). Трафик приходит на Cudy через интерфейс wan и уходит в интернет через тот же wan. Это forward из зоны wan в зону wan. По умолчанию firewall OpenWrt запрещает forward внутри wan (forward = REJECT). Нужно явно разрешить.

UCI: /etc/config/firewall

Ключевые секции (помимо стандартных):

config forwarding
	option src 'lan'
	option dest 'wan'

config forwarding
	option src 'wan'
	option dest 'lan'

config forwarding
	option src 'wan'
	option dest 'wan'

config rule
	option name 'Allow-Forward-WAN-192-to-Internet'
	option src 'wan'
	option dest 'wan'
	option src_ip '192.168.1.0/24'
	option proto 'all'
	option target 'ACCEPT'
	option family 'ipv4'

Разберём:

  • forwarding lan->wan -- стандартное, клиенты 192.168.2.x ходят в интернет через NAT.
  • forwarding wan->lan -- доступ из 192.168.1.x к устройствам в 192.168.2.x (ТВ, LuCI).
  • forwarding wan->wan -- трафик из 192.168.1.x через Cudy в интернет. Без этого ping 8.8.8.8 с ПК (при шлюзе 192.168.1.100) не пройдёт.
  • rule Allow-Forward-WAN-192-to-Internet -- явное правило accept для source 192.168.1.0/24, direction wan->wan. Страховка на случай если forwarding wan->wan недостаточно (fw4 обрабатывает same-zone forward иначе, чем fw3).

Дополнительные правила для доступа к LuCI и SSH с 192.168.1.x:

config rule
	option name 'Allow-LuCI-from-WAN'
	option src 'wan'
	option dest_port '80'
	option proto 'tcp'
	option target 'ACCEPT'
	option family 'ipv4'

config rule
	option name 'Allow-LuCI-HTTPS-from-WAN'
	option src 'wan'
	option dest_port '443'
	option proto 'tcp'
	option target 'ACCEPT'
	option family 'ipv4'

config rule
	option name 'Allow-SSH-from-WAN'
	option src 'wan'
	option dest_port '22'
	option proto 'tcp'
	option target 'ACCEPT'
	option family 'ipv4'

Без них зайти по SSH или в LuCI на 192.168.2.1 со стороны 192.168.1.x не получится (wan zone input = REJECT).

nftables.d: прямое правило для fw4

OpenWrt 25 использует fw4 (nftables), не fw3 (iptables). Для гарантии работы forward wan->wan добавляется файл с правилом nftables напрямую.

Файл: /etc/nftables.d/chain-pre/forward/50-wan192-internet.nft

ip saddr 192.168.1.0/24 iifname "br-lan.1" oifname "br-lan.1" accept comment "wan192 to internet via Cudy"

Одна строка. Пакет с источником 192.168.1.0/24, вошедший и выходящий через br-lan.1 (wan zone), принимается. Файл подкладывается в chain-pre/forward/ -- fw4 загружает его автоматически при старте.

firewall.user

Файл /etc/firewall.user -- заглушка. В fw3 здесь были правила iptables; в fw4 iptables закомментирован, используется nftables.d:

#!/bin/sh
# fw4: use nftables.d/chain-pre/forward/50-wan192-internet.nft
# iptables -I FORWARD 1 -i br-lan.1 -o br-lan.1 -s 192.168.1.0/24 -j ACCEPT
:

Нюанс fw4

В /etc/config/firewall секция config include ссылается на firewall.user с опцией option fw4_compatible '1'. Опция option reload не поддерживается fw4 -- не добавляйте её, иначе firewall не применится.

Применение

С ПК:

scp firewall root@192.168.2.1:/etc/config/firewall
scp firewall.user root@192.168.2.1:/etc/firewall.user

ssh root@192.168.2.1 "mkdir -p /etc/nftables.d/chain-pre/forward"
scp 50-wan192-internet.nft root@192.168.2.1:/etc/nftables.d/chain-pre/forward/

ssh root@192.168.2.1 "service firewall restart"

Маршрут на Asus

Чтобы устройства из 192.168.1.x (через Asus) могли достучаться до 192.168.2.x (ТВ, LuCI Cudy), на Asus нужен статический маршрут.

Настройка в веб-интерфейсе Asus

  1. Открыть http://192.168.1.2.
  2. LAN -> вкладка Advanced (или Route / Static Route).
  3. Добавить маршрут:
ПолеЗначение
Network/Host192.168.2.0
Netmask255.255.255.0
Gateway192.168.1.100
Metric1
InterfaceLAN
  1. Сохранить.

После этого Asus будет перенаправлять пакеты для 192.168.2.0/24 на Cudy (192.168.1.100), Cudy перешлёт их в lan (192.168.2.x).

Замечание: на стоковой прошивке Asus 382 статические маршруты у некоторых пользователей работают нестабильно. Если маршрут пропадает после перезагрузки -- рассмотрите Asuswrt-Merlin.


Переключение шлюза на Windows ПК

ПК (192.168.1.4) подключён к коммутатору в подсети 192.168.1.x. Нужно переключать шлюз: Asus (чистый интернет) или Cudy (Zapret).

Проблема с кросс-подсетным шлюзом

Первая мысль -- поставить шлюз 192.168.2.1 (LAN Cudy). Не работает: Windows не создаёт on-link маршрут для шлюза в другой подсети, ping 8.8.8.8 выдаёт "General failure".

Решение: шлюз = 192.168.1.100 (Cudy WAN). Это та же подсеть, что и ПК. Трафик идёт: ПК -> Cudy WAN (192.168.1.100) -> forward wan->wan -> NAT -> интернет. На Cudy должен быть включён forward wan->wan (настроен выше).

gateway-zapret.bat

Переключает шлюз на Cudy (Zapret). Запускать от администратора (скрипт запросит UAC сам):

@echo off
chcp 65001 >nul
REM Gateway via Cudy Zapret - gateway = Cudy WAN IP in 192.168.1.x (default 192.168.1.100)

net session >nul 2>&1
if %errorlevel% neq 0 (
    powershell -Command "Start-Process '%~f0' -Verb RunAs"
    exit /b
)

echo.
echo Switching gateway to Cudy WAN (Zapret) 192.168.1.100 ...
echo.

set "ADAPTER=Ethernet"
set "CUDY_WAN_IP=192.168.1.100"

route delete 0.0.0.0 192.168.2.1 >nul 2>&1
route delete 192.168.2.0 192.168.1.2 >nul 2>&1

netsh interface ip set address name="%ADAPTER%" static 192.168.1.4 255.255.255.0 %CUDY_WAN_IP%
set "NETSHEXIT=%errorlevel%"

route add 192.168.2.0 mask 255.255.255.0 %CUDY_WAN_IP% -p >nul 2>&1

if %NETSHEXIT% equ 0 (echo Done. Traffic via Zapret.) else (echo Error. Check adapter name: %ADAPTER%)
echo.
echo Waiting 10 seconds for network to settle...
timeout /t 10 /nobreak >nul
echo.
echo --- ipconfig ---
ipconfig
echo.
echo --- route to 192.168.2.0 (must be via %CUDY_WAN_IP%) ---
route print | findstr "192.168"
echo.
echo --- ping Cudy WAN %CUDY_WAN_IP% (should reply) ---
ping -n 1 %CUDY_WAN_IP%
echo.
echo --- ping 8.8.8.8 (if timeout, routing or Zapret issue) ---
ping -n 1 8.8.8.8
echo.
pause

Что делает: ставит шлюз 192.168.1.100 (Cudy WAN), добавляет маршрут 192.168.2.0/24 через Cudy (чтобы не потерять доступ к LuCI и ТВ), делает проверочные пинги.

gateway-asus.bat

Возвращает шлюз на Asus (чистый интернет):

@echo off
chcp 65001 >nul
REM Gateway via Asus clean - one gateway 192.168.1.2 in ipconfig

net session >nul 2>&1
if %errorlevel% neq 0 (
    powershell -Command "Start-Process '%~f0' -Verb RunAs"
    exit /b
)

echo.
echo Switching gateway to Asus (clean) 192.168.1.2 ...
echo.

set "ADAPTER=Ethernet"

route delete 0.0.0.0 192.168.2.1 >nul 2>&1
route delete 0.0.0.0 192.168.1.100 >nul 2>&1

netsh interface ip set address name="%ADAPTER%" static 192.168.1.4 255.255.255.0 192.168.1.2

route delete 192.168.2.0 192.168.1.69 >nul 2>&1
route delete 192.168.2.0 192.168.1.100 >nul 2>&1

route add 192.168.2.0 mask 255.255.255.0 192.168.1.2 -p >nul 2>&1

if %errorlevel% equ 0 (echo Done. Traffic via Asus.) else (echo Error. Check adapter name: %ADAPTER%)
echo.
echo Waiting 10 seconds for network to settle...
timeout /t 10 /nobreak >nul
echo.
echo --- ipconfig ---
ipconfig
echo.
echo --- route to 192.168.2.0 (must be via 192.168.1.2 Asus) ---
route print | findstr "192.168"
echo.
echo --- ping 192.168.2.1 (if timeout, check Asus: LAN - Route - 192.168.2.0 via Cudy IP) ---
ping -n 2 192.168.2.1
echo.
pause

Что делает: ставит шлюз 192.168.1.2 (Asus), убирает маршруты через Cudy, добавляет маршрут 192.168.2.0/24 через Asus (чтобы доступ к Cudy и ТВ шёл через статический маршрут на Asus).

Ручные команды

Если не хочется использовать скрипты:

Переключить на Cudy (Zapret):

netsh interface ip set address name="Ethernet" static 192.168.1.4 255.255.255.0 192.168.1.100
route add 192.168.2.0 mask 255.255.255.0 192.168.1.100 -p

Переключить на Asus (чистый):

netsh interface ip set address name="Ethernet" static 192.168.1.4 255.255.255.0 192.168.1.2
route delete 192.168.2.0 192.168.1.100
route add 192.168.2.0 mask 255.255.255.0 192.168.1.2 -p

Имя адаптера Ethernet -- проверить в ipconfig. Если другое -- подставить своё.


Проверка и troubleshooting

Чеклист

При шлюзе Cudy (после gateway-zapret.bat):

1. ipconfig                     -- шлюз 192.168.1.100
2. ping 192.168.1.100           -- Cudy WAN отвечает
3. ping 8.8.8.8                 -- интернет через Cudy
4. route print | findstr 192.168 -- маршрут 192.168.2.0 через 192.168.1.100
5. Открыть YouTube              -- видео играет (Zapret работает)

При шлюзе Asus (после gateway-asus.bat):

1. ipconfig                     -- шлюз 192.168.1.2
2. ping 192.168.1.2             -- Asus отвечает
3. ping 8.8.8.8                 -- интернет через Asus
4. ping 192.168.2.1             -- Cudy LAN отвечает (маршрут через Asus)
5. route print | findstr 192.168 -- маршрут 192.168.2.0 через 192.168.1.2

Типичные проблемы

Ping 192.168.1.100 не отвечает

ПК не в одном L2-сегменте с Cudy WAN. Проверить: ПК и Cudy WAN подключены к одному коммутатору. Порт Cudy -- WAN, LAN1 или LAN2 (VLAN 1). Не LAN3/LAN4 (это VLAN 2).

Ping 8.8.8.8 таймаут при шлюзе 192.168.1.100

На Cudy не включён forward wan->wan. Проверить:

ssh root@192.168.2.1 "nft list chain inet fw4 forward" | grep wan192

Должна быть строка с accept. Если нет -- применить firewall и nftables.d (см. раздел "Firewall" выше).

YouTube не открывается, но ping 8.8.8.8 есть

Zapret не запущен или не настроен. Проверить:

ssh root@192.168.2.1 "/etc/init.d/zapret status"
ssh root@192.168.2.1 "/etc/init.d/zapret restart"
ssh root@192.168.2.1 "/etc/init.d/zapret enable"

Нет доступа к 192.168.2.x при шлюзе Asus

На Asus не настроен статический маршрут 192.168.2.0/24 -> 192.168.1.100. Добавить в LAN -> Route. Или маршрут пропал после перезагрузки Asus (проблема прошивки 382).

DNS не резолвит при шлюзе Cudy

Проверить DNS в настройках адаптера или маршрутах. Cudy WAN использует DNS 192.168.1.2 и 8.8.8.8. При необходимости на ПК вручную:

netsh interface ip set dns name="Ethernet" static 8.8.8.8
netsh interface ip add dns name="Ethernet" 1.1.1.1 index=2

Итог

Что получилось:

  • Две подсети: 192.168.1.0/24 (Asus, чистый интернет) и 192.168.2.0/24 (Cudy, Zapret).
  • Bridge-VLAN на DSA: VLAN 1 (wan+lan1+lan2) и VLAN 2 (lan3+lan4) в одном мосте.
  • Forward wan->wan на Cudy: ПК из 192.168.1.x может ходить в интернет через Cudy.
  • Статический WAN IP 192.168.1.100 на Cudy -- стабильный адрес для скриптов.
  • Переключение шлюза на ПК двумя bat-скриптами, без перетыкания кабелей.
  • Zapret обрабатывает DPI и разблокирует YouTube, Discord.
  • ТВ и другие устройства на Wi-Fi Cudy получают 192.168.2.x автоматически (DHCP) и работают через Zapret постоянно.

Комментарии

Популярные сообщения