diff --git a/projects/niikn/openwrt-bypass.md b/projects/niikn/openwrt-bypass.md new file mode 100644 index 0000000..72d491a --- /dev/null +++ b/projects/niikn/openwrt-bypass.md @@ -0,0 +1,126 @@ +# OpenWrt + Podkop — Обход блокировок НИИКН + +## Схема работы + +``` +Клиент → MikroTik (192.168.1.1) + ├── обычные сайты → интернет напрямую + └── заблокированные → 192.168.1.50 (OpenWrt) → AWG туннель → 78.17.4.225 (Финляндия) +``` + +**Если OpenWrt упадёт:** заблокированные сайты недоступны, остальной интернет и RDP работают штатно. + +## OpenWrt VM (Proxmox НИИКН) + +| Параметр | Значение | +|----------|----------| +| VMID | 101 | +| IP | 192.168.1.50 | +| Версия | OpenWrt 24.10.0 | +| Serial console | /var/run/qemu-server/101.serial0 на pve-niikn (192.168.1.201) | +| Root пароль | 1qaz!QAZ | + +## AWG туннель (AmneziaWG) + +| Параметр | Значение | +|----------|----------| +| Сервер | 78.17.4.225:39202 (контейнер amnezia-awg2) | +| Клиентский IP | 10.8.1.4/32 | +| Интерфейс | awg0 | +| Private key | jfqknYLvJKYp++cjJPxV/dn8IQNPyaPhR/2bc4PK5+4= | +| Public key (сервер) | cftJxWuBCyz9ZiLDi23ouMQNAky5aTAUZIRHNS6l7mc= | +| Preshared key | PiQ3bao3nSxQqJoiJugAG77ZjRXxorBS81YwoRaLzEc= | + +### Параметры обфускации (сервер и клиент должны совпадать) + +| Параметр | Значение | +|----------|----------| +| Jc | 5 | +| Jmin | 10 | +| Jmax | 50 | +| S1 | 148 | +| S2 | 21 | +| S3 | 0 (клиент не поддерживает S3/S4, сервер тоже выставлен в 0) | +| S4 | 0 | +| H1 | 1666291593 | +| H2 | 2114876545 | +| H3 | 2135310789 | +| H4 | 2140829733 | + +> **Важно:** H-значения на сервере должны быть фиксированными числами (не диапазонами). +> Файл конфига сервера: `/opt/amnezia/awg/awg0.conf` внутри контейнера `amnezia-awg2` на 78.17.4.225. + +## Podkop + sing-box + +| Параметр | Значение | +|----------|----------| +| Версия | podkop v0.7.14 | +| Режим | VPN (connection_type=vpn) | +| Интерфейс | awg0 | +| Списки | russia_inside, telegram | +| disable_quic | 1 (блокировка QUIC — браузеры используют TCP) | +| LuCI плагин | luci-app-podkop | +| DNS (sing-box) | 127.0.0.42:53 (FakeIP 198.18.0.0/15) | +| DNS (dnsmasq) | 192.168.1.50:53 → форвардит в 127.0.0.42 | + +### UCI конфигурация (/etc/config/podkop) + +``` +config settings 'settings' + option dns_type 'udp' + option dns_server '8.8.8.8' + option disable_quic '1' + list source_network_interfaces 'br-lan' + +config section 'main' + option connection_type 'vpn' + option interface 'awg0' + list community_lists 'russia_inside' + list community_lists 'telegram' +``` + +## Настройка MikroTik (192.168.1.1) + +### Добавленные маршруты + +``` +/ip route add dst-address=198.18.0.0/15 gateway=192.168.1.50 comment=podkop-fakeip +``` + +FakeIP диапазон (198.18.0.0/15) направляется через OpenWrt → sing-box перехватывает и пускает через AWG. + +### DHCP — DNS для клиентов + +``` +/ip dhcp-server network set 0 dns-server=192.168.1.50 +``` + +Клиенты получают DNS 192.168.1.50 (dnsmasq → sing-box FakeIP). + +## Как работает FakeIP схема + +1. Клиент запрашивает DNS для `instagram.com` → получает FakeIP `198.18.x.x` +2. Клиент открывает соединение на `198.18.x.x` +3. MikroTik смотрит таблицу маршрутов: `198.18.0.0/15 → 192.168.1.50` +4. Пакет приходит на OpenWrt → nftables ставит fwmark → tproxy → sing-box +5. sing-box знает реальный адрес (из FakeIP кэша) → подключается через awg0 → Финляндия + +## Доступные списки podkop + +Все списки из https://github.com/itdoginfo/allow-domains: +`russia_inside`, `russia_outside`, `telegram`, `youtube`, `meta`, `twitter`, `discord`, `tiktok`, `hdrezka`, `news`, `anime` и др. + +Добавить список: +```sh +uci add_list podkop.main.community_lists=youtube +uci commit podkop +podkop restart +``` + +## Известные проблемы / Особенности + +- `proto_amneziawg_check_installed: not found` — баг в `/lib/netifd/proto/amneziawg.sh:298`, нефатальный, интерфейс поднимается +- `amneziawg-tools 1.0.20240213-r1` не поддерживает S3/S4 → выставить в 0 на сервере +- H-значения сервера должны быть фиксированными (не диапазонами `H1=x-y`) +- После перезагрузки: sing-box running, awg0 UP — `podkop status` = "not running" это нормально (podkop не демон) +- Битый feed убран из `/etc/opkg/customfeeds.conf`