---
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 |
| Списки | meta, youtube, telegram (⛔ `russia_outside` убран 2026-05-29 — ломал РФ-сайты, см. ниже) |
| 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 'meta'
    list community_lists 'youtube'
    list community_lists 'telegram'
    # ⛔ russia_outside УБРАН 2026-05-29 — НЕ возвращать!
    # Это список «РФ-сайты для тех, кто ЗА ГРАНИЦЕЙ». Для офиса в РФ он подменял
    # gosuslugi/ozon/ЕИС/nspd на FakeIP и гнал в финский выход → гео-блок «Доступ ограничен».
    # Сторож: niikn-podkop-watchdog.sh на pve-niikn (cron */15) вернёт удаление + алерт.
    # См. decisions/2026-05-29-niikn-diadoc-ozon-fix.md
    list user_domains 'notebooklm.google.com'
    list user_domains 'notebooklm.google'
    list user_domains 'generativelanguage.googleapis.com'
    list user_domains 'aistudio.google.com'
    list user_domains 'labs.google'
    list user_domains 'grok.com'
    list user_domains 'x.ai'
```

Добавить новый домен в обход:
```sh
uci add_list podkop.main.user_domains='example.com'
uci commit podkop
podkop restart
```

### Что обходится

**Список "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
```

## Включение отдельных доменов в проксирование (user_domains)

Когда нужно прогнать через AWG конкретный сайт, которого нет в community-листах (например, Google AI-сервисы — они блокируются Google по российскому IP, не РКН).

Podkop поддерживает `user_domain_list_type='dynamic'` + UCI list `user_domains`. Добавление:

```bash
ssh root@192.168.1.50

uci set podkop.main.user_domain_list_type='dynamic'
uci add_list podkop.main.user_domains='notebooklm.google.com'
uci add_list podkop.main.user_domains='generativelanguage.googleapis.com'
uci commit podkop
podkop restart

# Проверка: dnsmasq должен отдавать FakeIP
nslookup notebooklm.google.com 192.168.1.50
# Address: 198.18.x.x  ← ок
```

### NotebookLM / Google AI (добавлено 2026-04-30)

Для Оксаны Павловны (НИИКН) — чтобы `notebooklm.google` открывался со всех ПК офиса. Список:

- `notebooklm.google.com`
- `notebooklm.google`
- `generativelanguage.googleapis.com` — Gemini API, NotebookLM ходит через него
- `aistudio.google.com`
- `labs.google`

> ⚠️ Google смотрит и на IP, и на регион аккаунта. Если Google-аккаунт привязан к РФ (телефон/билинг), сервис может всё равно сказать «not available» — нужен отдельный аккаунт без российской привязки.

## Исключение доменов из проксирования

В podkop v0.7.14 нет UCI-параметра для исключения доменов из проксирования (`exclude_user_domains` отсутствует). Решение — DNS override в dnsmasq: запросы для конкретного домена идут в bypass-DNS, минуя sing-box, → клиент получает реальный IP → MikroTik роутит напрямую.

```bash
ssh root@192.168.1.50

# Добавить домен в обход проксирования
uci add_list dhcp.@dnsmasq[0].server='/nspd.gov.ru/77.88.8.8'
uci add_list dhcp.@dnsmasq[0].server='/nspd.gov.ru/8.8.8.8'
uci commit dhcp
/etc/init.d/dnsmasq restart

# Очистить кэш sing-box (старые FakeIP записи)
rm -f /tmp/sing-box/cache.db
/etc/init.d/sing-box restart

# Проверка
nslookup nspd.gov.ru 192.168.1.50
# Должен вернуть РЕАЛЬНЫЙ IP, не 198.18.x.x
```

После этого на клиенте сделать `ipconfig /flushdns` (Win) или `sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder` (Mac).

**Когда нужно:** российские госсайты (nspd.gov.ru, gosuslugi.ru) попавшие в community-листы блокируют зарубежные IP → выход через AWG получает Forbidden.

## Известные проблемы / Особенности

- `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
