Files
knowledge-base/projects/niikn/openwrt-bypass.md

269 lines
9.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
date: 2026-03-31
type: project
tags: [niikn, network]
---
# 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 |
| SSH | root@192.168.1.50 (пароль: 1qaz!QAZ) |
## AWG туннель (AmneziaWG)
| Параметр | Значение |
|----------|----------|
| Сервер | 78.17.4.225:39202 (контейнер amnezia-awg2) |
| Клиентский IP | **10.8.1.16/32** (обновлено 2026-04-14) |
| Интерфейс | awg0 |
| Private key | 41XMQFlPlq6FU4EBhqjayPvcDQJU+c+WQjabqs3ILbI= |
| Public key (сервер) | cftJxWuBCyz9ZiLDi23ouMQNAky5aTAUZIRHNS6l7mc= |
| Preshared key | PiQ3bao3nSxQqJoiJugAG77ZjRXxorBS81YwoRaLzEc= |
| Persistent keepalive | 25 секунд |
### Параметры обфускации (сервер и клиент должны совпадать)
| Параметр | Значение |
|----------|----------|
| 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.
### Полная конфигурация клиента (OpenWrt)
```ini
[Interface]
Address = 10.8.1.16/32
PrivateKey = 41XMQFlPlq6FU4EBhqjayPvcDQJU+c+WQjabqs3ILbI=
Jc = 5
Jmin = 10
Jmax = 50
S1 = 148
S2 = 21
S3 = 0
S4 = 0
H1 = 1666291593
H2 = 2114876545
H3 = 2135310789
H4 = 2140829733
[Peer]
PublicKey = cftJxWuBCyz9ZiLDi23ouMQNAky5aTAUZIRHNS6l7mc=
PresharedKey = PiQ3bao3nSxQqJoiJugAG77ZjRXxorBS81YwoRaLzEc=
AllowedIPs = 0.0.0.0/0, ::/0
Endpoint = 78.17.4.225:39202
PersistentKeepalive = 25
```
## Podkop + sing-box
| Параметр | Значение |
|----------|----------|
| Версия | podkop v0.7.14 |
| Режим | VPN (connection_type=vpn) |
| Интерфейс | awg0 |
| Списки | russia_inside, telegram, meta |
| 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'
list community_lists 'meta'
```
### Что обходится
**Список "meta":**
- WhatsApp (whatsapp.com, whatsapp.net, wa.me, web.whatsapp.com)
- Instagram
- Facebook
- Threads
- Все сервисы Meta Platforms
**Список "telegram":**
- Telegram (все домены и IP)
**Список "russia_inside":**
- Российские сайты, заблокированные за рубежом
## Настройка 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.0.239`
2. Клиент открывает соединение на `198.18.0.239`
3. MikroTik смотрит таблицу маршрутов: `198.18.0.0/15 → 192.168.1.50`
4. Пакет приходит на OpenWrt → nftables ставит fwmark → tproxy → sing-box
5. sing-box знает реальный адрес (из FakeIP кэша) → подключается через awg0 → Финляндия
## Firewall конфигурация (КРИТИЧНО!)
**awg0 должен быть в WAN зоне:**
```bash
# Проверить
uci show firewall.@zone[1].network
# Если awg0 нет в списке — добавить
uci add_list firewall.@zone[1].network='awg0'
uci commit firewall
/etc/init.d/firewall reload
```
**Проверка:**
```bash
nft list chain inet fw4 output | grep awg0
# Должно быть: oifname "awg0" jump output_wan
```
## Доступные списки 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
```
## Диагностика
### Проверка туннеля на OpenWrt
```bash
# SSH доступ
ssh root@192.168.1.50 # пароль: 1qaz!QAZ
# Статус интерфейса
ip addr show awg0
# Должно быть: inet 10.8.1.16/32, state UP
# Пинг через туннель
ping -c 3 -I awg0 8.8.8.8
# Проверка podkop
podkop get_status
podkop get_sing_box_status
# Проверка FakeIP
nslookup instagram.com 127.0.0.42
# Должно вернуть: 198.18.x.x
```
### Проверка handshake на сервере
```bash
ssh root@78.17.4.225 # пароль: vb8Se9VMdwh1P692PZ
docker exec amnezia-awg2 wg show awg0 | grep -A 5 '10.8.1.16'
# latest handshake должен быть < 2 минут
```
### Проверка с клиента
```bash
# DNS запрос
nslookup instagram.com 192.168.1.50
# Должен вернуть FakeIP (198.18.x.x)
# Маршрут
traceroute -n 198.18.0.1
# Первый hop должен быть 192.168.1.50
```
## Известные проблемы / Особенности
- `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 не демон)
- **КРИТИЧНО:** awg0 ДОЛЖЕН быть в firewall WAN зоне, иначе пакеты не уходят
- **КРИТИЧНО для FakeIP-режима:** `disable_quic=1` обязателен, иначе браузеры используют HTTP/3 на UDP:443 мимо обхода (YouTube/Meta/Google)
- `podkop restart` может сбрасывать `shutdown_correctly` в 0 — проверять после рестарта
- sing-box установщик не всегда включает procd-автозапуск: проверять `/etc/init.d/sing-box enabled`
- **КРИТИЧНО при co-existence с NetBird** (Переделки): оба ставят chain на `prerouting priority mangle` (-150) и конфликтуют по fwmark. Netbird перезаписывает `0x00100000` → tproxy не срабатывает. Фикс: патч `/usr/bin/podkop:311` с `-150 → -140`. См. [decisions/2026-04-17-peredelki-podkop-stability-fix.md](../../decisions/2026-04-17-peredelki-podkop-stability-fix.md)
- Проверка что конфликта нет: `nft list chain inet PodkopTable proxy | grep packets` — счётчик tproxy должен расти при активном LAN трафике
## История изменений
### 2026-04-14 — Восстановление работы
**Проблемы:**
1. Старая конфигурация AWG (IP 10.8.1.4, устаревший приватный ключ)
2. awg0 не был добавлен в firewall WAN зону
3. Handshake не обновлялся 12+ часов
**Исправлено:**
1. Обновлен приватный ключ: `41XMQFlPlq6FU4EBhqjayPvcDQJU+c+WQjabqs3ILbI=`
2. Изменен IP на **10.8.1.16/32**
3. Добавлен awg0 в firewall WAN зону: `uci add_list firewall.@zone[1].network='awg0'`
4. Перезапущен firewall и интерфейс awg0
**Результат:**
- ✅ Handshake актуален (< 3 минут)
- ✅ Пинг через туннель: 0% loss, ~23ms RTT
- ✅ FakeIP DNS работает
- ✅ WhatsApp, Instagram, Telegram полностью функциональны
- ✅ Transfer: 6.80 KiB received, 17.16 KiB sent