Files
knowledge-base/snippets/podkop-reference.md
dttb 3d71b56ae3 Домашний роутер: awg2 (Финляндия) рабочий — корень был rp_filter, не протокол
- Корень «awg2 не ходил»: строгий rp_filter=1 на интерфейсе дропал transport
  из туннеля (handshake жив, транзит 0%). awg0 работал на rp_filter=2 (loose).
  При заведении финского awg2 строка rp_filter=2 не была добавлена (для awg0 была).
- Фикс на роутере: net.ipv4.conf.awg2.rp_filter=2 в /etc/sysctl.conf
  + hotplug 99-awg-rpfilter (loose на все awg* при ifup). podkop → awg2.
- podkop-reference §5: добавлена грабля rp_filter (handshake-есть-транзита-нет).
- Снято неверное «awg2 сломан / OpenWrt не тянет AWG 1.5» — сервер/протокол исправны.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-23 18:50:55 +03:00

207 lines
21 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-05-29
type: reference
tags: [openwrt, podkop, sing-box, amneziawg, fakeip, netbird, reference, handbook]
aliases: [podkop, подкоп, podkop-handbook, podkop-справочник]
---
# Podkop — канонический справочник
> **Single source of truth по podkop.** Почти все объекты Олега на этом стеке (NIIKN, Sergey, Переделки, Benelux, Krasnogorsk, Znamenskoye, HomeLab dttb).
> Здесь — **модель, списки, правильный конфиг, грабли, инвентарь**. Пошаговая диагностика «обход не работает» — в [[podkop-fakeip-diagnostics]].
> Цель документа: перестать наступать на одни и те же грабли (история: [[../decisions/2026-05-29-niikn-diadoc-ozon-fix]] — месяц лечил симптом вместо причины).
---
## 1. Модель — понимать, а не копировать
Podkop = обёртка над **sing-box** (+ туннель AmneziaWG/VLESS), которая селективно заворачивает ТОЛЬКО нужные домены в туннель через механизм **FakeIP**.
```
Клиент LAN
└─DNS→ dnsmasq:53 ──(noresolv)──► sing-box FakeIP DNS 127.0.0.42:53
├─ домен В списке → отдаёт FakeIP 198.18.x.x
└─ домен НЕ в списке→ резолвит реально (upstream)
└─пакет на 198.18.x.x → роутер: маршрут 198.18.0.0/15 → внутрь
→ nftables fwmark + tproxy → sing-box
→ sing-box знает реальный адрес (из FakeIP-кэша)
→ main-out (bind_interface awg0) → туннель → EXIT
└─пакет на реальный IP → обычный WAN напрямую
```
**Главное, что нужно усвоить:**
- FakeIP (`198.18.0.0/15`) получают **только домены из подключённых списков**. Всё остальное идёт напрямую.
- Туннель несёт **только** FakeIP-трафик. Значит «что заворачивается» = «какие списки подключены». Ошибся со списком → не тот трафик в туннеле.
- **EXIT-нода туннеля определяет, КУДА выходит завёрнутый трафик.** У всех объектов Олега EXIT — **зарубежный** (Финляндия/Сингапур). Поэтому в туннель должно попадать только то, что нужно открывать с **зарубежного** IP (заблокированное РКН). Российский сайт в туннеле → выходит с зарубежного IP → гео-блок.
---
## 2. ⚠️ Списки inside/outside — ГЛАВНЫЕ грабли
itdoginfo называет списки по тому, **где находится пользователь**, а не где сайт. Легко перепутать. Запомнить намертво:
| Список | Что внутри | Для кого | Куда заворачивать |
|--------|-----------|----------|-------------------|
| **`russia_inside`** | Зарубежные сайты, заблокированные **внутри** России (РКН): соцсети, новости, и т.п. | Для тех, кто **внутри РФ** и хочет обойти РКН | ✅ в зарубежный туннель |
| **`russia_outside`** | **Российские** сайты, доступные только из РФ-подсетей (gosuslugi, ozon, банки, gov.ru) | Для тех, кто **за границей** и хочет попасть на РФ-сервисы | ⛔ в **РОССИЙСКИЙ** выход (или вообще не заворачивать, если ты в РФ) |
**Мнемоника:** `inside` = «я ВНУТРИ РФ, мне нужно наружу» (зарубежное заблокированное). `outside` = «я СНАРУЖИ РФ, мне нужно внутрь» (российское гео-фенсенное).
### Decision guide
| Сценарий объекта | EXIT туннеля | Какие списки | НЕ ставить |
|------------------|-------------|--------------|------------|
| Офис/дом **в РФ**, обойти РКН (типовой случай Олега) | зарубежный (FI/SG) | `russia_inside` ИЛИ точечно `meta`+`youtube`+`telegram`+(`twitter`/`discord`/`tiktok` по нужде) | ⛔ **`russia_outside`** — сломает РФ-сайты (gosuslugi/ozon/ЕИС → гео-блок) |
| Доступ к РФ-сервисам из-за границы | **российский** | `russia_outside` | inside-списки |
> **НИИКН-урок (2026-05-29):** стоял `russia_outside` при финском выходе → gosuslugi/ozon/ЕИС/nspd фейкапились и уходили в Финляндию → «Доступ ограничен». Лечилось dnsmasq-override'ами, которые слетали при каждом реконфиге → месяц повторяющихся жалоб. Корень — убрать `russia_outside`. **Если объект в РФ — `russia_outside` НЕ ставить никогда.**
### Точечные списки vs бандл
Для рабочего объекта **лучше точечные** (`meta`, `youtube`, `telegram`) чем `russia_inside` целиком: `russia_inside` тащит и `porn`/`anime`/`hdrezka`/`news` — лишняя нагрузка на туннель и не всегда уместно. `russia_inside` оправдан, когда нужен «всё заблокированное разом».
---
## 3. Каталог community-листов
Источник: <https://github.com/itdoginfo/allow-domains>. Подключённые: `uci -q get podkop.main.community_lists`.
| Список | Содержимое |
|--------|-----------|
| `meta` | Instagram, Facebook, WhatsApp, Threads — все Meta |
| `youtube` | YouTube/Google video CDN |
| `telegram` | Telegram (домены + IP) |
| `twitter` | X/Twitter |
| `discord` | Discord (вкл. голосовые IP) |
| `tiktok` | TikTok |
| `cloudflare` | CF-инфра (осторожно — широкий) |
| `oai` | OpenAI / ChatGPT |
| `hdrezka`,`anime`,`news`,`porn` | контент-категории |
| `russia_inside` | бандл зарубежного заблокированного (см. §2) |
| `russia_outside` | ⛔ российские гео-фенсенные сайты (см. §2) |
Добавить/убрать:
```sh
uci add_list podkop.main.community_lists='discord'
uci del_list podkop.main.community_lists='russia_outside'
uci commit podkop && /etc/init.d/podkop restart
```
---
## 4. Базовый правильный конфиг (типовой объект в РФ)
```sh
# /etc/config/podkop
uci set podkop.main.connection_type='vpn' # vpn=AWG-интерфейс | proxy=VLESS/SS
uci set podkop.main.interface='awg0'
uci set podkop.settings.disable_quic='1' # ⚠️ ОБЯЗАТЕЛЬНО (см. грабли)
# списки — точечные под РФ-объект:
for L in meta youtube telegram; do uci add_list podkop.main.community_lists="$L"; done
uci commit podkop && /etc/init.d/podkop restart
```
Обязательные внешние условия (иначе туннель «есть, но не работает»):
1. **awg0 в firewall WAN-зоне** — иначе пакеты не уходят:
`uci add_list firewall.@zone[1].network='awg0'; uci commit firewall; /etc/init.d/firewall reload`
Проверка: `nft list chain inet fw4 output | grep awg0``oifname "awg0" jump output_wan`.
2. **DNS клиентов = роутер** (DHCP option 6), цепочка `LAN→dnsmasq→127.0.0.42` с `noresolv=1`.
3. **Маршрут FakeIP-диапазона** на upstream-роутере, если podkop не на дефолтном шлюзе (как НИИКН, где шлюз — MikroTik):
`/ip route add dst-address=198.18.0.0/15 gateway=<podkop-router>` (MikroTik-синтаксис).
4. **EXIT зарубежный** для inside-сценария.
---
## 5. Грабли (то, на что я наступал) — проверять в первую очередь
| Грабли | Симптом | Что делать |
|--------|---------|-----------|
| **`russia_outside` на РФ-объекте** | РФ-сайты (gov/ozon/банки) «Доступ ограничен», заграница работает | Убрать список (§2). НЕ лепить per-domain override. |
| **busybox `ip -br` не поддерживается** | `ip -br link` молча пуст → ложный вывод «интерфейса нет» | Проверять `ip addr show awg0` / `ip link show awg0`, живость — `ping -I awg0 8.8.8.8`. [[../../.claude/projects/-Users-ai-knowledge-base/memory/feedback_busybox_ip_br_flag\|памятка]] |
| **dnsmasq-overrides слетают** | «вчера работало, сегодня нет» после реконфига | podkop владеет `dhcp.@dnsmasq[0].server` и переписывает его. **Не бороться за override — убрать причину фейкапа (список).** Если override нужен — выносить в `/etc/dnsmasq.d/` (podkop не трогает). |
| **`disable_quic=0`** | YouTube/Meta/Google текут мимо обхода | QUIC/HTTP3 на UDP:443 идёт мимо tproxy. `disable_quic='1'` обязателен. |
| **awg0 не в WAN-зоне** | туннель UP, handshake есть, но трафик не уходит | добавить awg0 в firewall WAN (§4). |
| **NetBird + podkop конфликт fwmark** | tproxy-счётчик не растёт там, где есть NetBird (Переделки) | оба вешают chain на `prerouting priority mangle (-150)`, NetBird перетирает mark `0x00100000`. Фикс: патч `/usr/bin/podkop` — priority `-150 → -140`. [[../decisions/2026-04-17-peredelki-podkop-stability-fix]] |
| **sing-box crash-loop / cache.db lock** | sing-box рестартует по кругу после ребута | залочен `cache.db` (две копии): `killall sing-box; sleep 2; /etc/init.d/podkop restart` |
| **sing-box без procd-автозапуска** | после ребута обход мёртв | `/etc/init.d/sing-box enabled` должно быть включено |
| **AmneziaWG H-значения диапазоном** | handshake не встаёт | H1H4 на сервере и клиенте — фиксированные числа, не диапазоны |
| **MTU/фрагментация** | сайты открываются наполовину | MTU awg0 1420→1380; `ping -M do -s 1380 8.8.8.8 -I awg0` |
| **Клиент сам обходит DNS роутера** | curl с роутера ок, у клиента нет | iPhone Private Relay/Safari Hide IP/Chrome DoH. Выключить у клиента; на роутере — DNAT :53 + reject DoH (см. runbook §7). [[../../.claude/projects/-Users-ai-knowledge-base/memory/feedback_iphone_breaks_fakeip\|памятка]] |
| **`podkop restart` сбрасывает `shutdown_correctly`** | редкие странности после рестарта | проверять флаг после рестарта |
| **Роутер ходит, LAN-клиенты — нет** (залип FakeIP/tproxy для форвардного) | сам Cudy `curl https://api.anthropic.com` → 405, а с LXC/клиента ВСЕ туннельные сайты (telegram/anthropic) виснут на **TCP-connect** (`Trying 198.18.x... timed out`, до Connected не доходит); nft-метки/tproxy счётчики растут, но SYN-ACK не возвращается. Прямые сайты (не в списках) у клиента работают | `killall sing-box; sleep 2; rm -f /tmp/sing-box/cache.db; /etc/init.d/podkop restart` на роутере. Бенелюкс 2026-06-21: из-за этого «висли» агенты swarmclaw на коробке (claude не достучивался до Anthropic). **Диагностика-ловушка:** `curl --interface awg0 https://api.anthropic.com` НЕ показатель — резолвит в FakeIP и шлёт фейк прямо в awg0 → ложный таймаут. Правильно = обычный FakeIP-путь роутера. |
| **`download_lists_via_proxy='1'` с ПУСТОЙ секцией ломает sing-box** | `sing-box FATAL: start service: initialize rule-set: download detour not found: -out` → detour-тег вышел `-out` (пустая секция + суффикс) | На **0.7.19** включать МОЖНО и НУЖНО, если GitHub блокирован РКН: `uci set podkop.settings.download_lists_via_proxy=1; uci set podkop.settings.download_lists_via_proxy_section=main` → detour `main-out` (туннель). Тогда remote rule-set'ы (`*.srs` с `release-assets.githubusercontent.com`) качаются ЧЕРЕЗ туннель. Без этого при пустом `/tmp/sing-box/rulesets` (после `rm cache.db`/обновления) sing-box падает `initialize rule-set: Get ...` т.к. `route.final=direct-out`=WAN. **Грабля 0.7.14 = НЕ задана секция.** HomeLab dttb 2026-06-23. |
| **`podkop list_update` падает: raw.githubusercontent.com блокирован РКН** | в логах `Attempt N/3 to download .../*.lst failed`, напрямую с WAN `curl raw.git` = HTTP 000. Списки тихо устаревают (обход «потихоньку перестаёт ловить» новые домены/подсети) | Добавить **сам GitHub в обход**: `uci set podkop.main.user_domain_list_type='dynamic'; uci add_list podkop.main.user_domains='githubusercontent.com'; uci commit podkop; /etc/init.d/podkop restart`. Тогда роутерный `list_update` резолвит raw.git в FakeIP → туннель → HTTP 200. via_proxy оставить `0`. |
| 🔴 **`rp_filter` строгий на awg-интерфейсе → handshake есть, транзита НЕТ** | `awg show` = свежий handshake + растёт `received`; но `ping -I awgN 1.1.1.1` = **100% потерь**, end-to-end 000, sing-box не качает списки. Transport-ответ из туннеля приходит на awgN, при `rp_filter=1` (strict) ядро не видит обратного маршрута к internet-src через awgN → **дроп до доставки**. Особенно на мульти-туннельных роутерах, где один awg работает (стоит `=2`), другой нет (унаследовал `default=1`) | `sysctl -w net.ipv4.conf.<iface>.rp_filter=2` (loose) → проверь `ping -I <iface>`. Персистентно: строка `net.ipv4.conf.<iface>.rp_filter=2` в `/etc/sysctl.conf` + hotplug `/etc/hotplug.d/iface/99-awg-rpfilter` (loose на все `awg*` при ifup). **Диагностика:** сравни `sysctl net.ipv4.conf.{рабочий,сломанный}.rp_filter` — разница `2` vs `1` = это он. HomeLab dttb 2026-06-23 (awg2 vs awg0). |
---
## 6. Частые операции
```sh
# Завернуть конкретный домен, которого нет в листах (через туннель):
uci set podkop.main.user_domain_list_type='dynamic'
uci add_list podkop.main.user_domains='example.com' # покрывает и поддомены
uci commit podkop && /etc/init.d/podkop restart
# ИСКЛЮЧИТЬ домен из проксирования (форсировать реальный IP → напрямую).
# ⚠️ Сначала спроси: а почему он вообще фейкапится? Может, лишний список (§2).
# Если правда нужен — override в dnsmasq:
uci add_list dhcp.@dnsmasq[0].server='/example.ru/77.88.8.8'
uci commit dhcp && /etc/init.d/dnsmasq restart
rm -f /tmp/sing-box/cache.db && /etc/init.d/sing-box restart # сбросить старый FakeIP
# Обновить листы вручную:
podkop list_update
```
---
## 7. Диагностика (кратко; полный runbook отдельно)
**Самый полезный тест — спросить sing-box напрямую, фейкапит ли он домен:**
```sh
nslookup ozon.ru 127.0.0.42
# 198.18.x.x → домен В списке (заворачивается). Реальный IP → идёт напрямую.
```
Этим я доказал НИИКН-фикс: до удаления `russia_outside` РФ-сайты = 198.18.x, после = реальные, а instagram/youtube остались 198.18.x.
Дальше — по шагам: **[[podkop-fakeip-diagnostics]]** (туннель → sing-box → nft/tproxy → маршрут → FakeIP → DNS-цепочка → клиент).
---
## 8. Анти-паттерн: симптом vs причина
- Жалоба «РФ-сайт не открывается» + FakeIP на нём → **не лепить override**, а спросить «какой список его поймал» и убрать список.
- «Overrides слетают» → не строить watchdog на доливку overrides, а убрать причину фейкапа.
- Повторяется второй раз → проверить **свой исходный конфиг**, а не обход.
- [[../../.claude/projects/-Users-ai-knowledge-base/memory/feedback_root_cause_recurring|памятка: корень vs band-aid]]
---
## 9. Инвентарь podkop по объектам
| Объект | Роутер / доступ | conn / iface | EXIT | Списки | Статус |
|--------|-----------------|--------------|------|--------|--------|
| **НИИКН** | OpenWrt VM101 `192.168.1.50` (jump pve-niikn `100.70.120.229`) | vpn / awg0 | Финляндия `78.17.4.225` | `meta`,`youtube`,`telegram` | ✅ `russia_outside` убран 2026-05-29; gov через NetBird→LionART маршруты + dnsmasq-overrides (backup); watchdog на pve-niikn |
| **Sergey/Одинцово** | Cudy TR3000 `100.70.110.164` root/`1qaz!QAZ` | vpn / awg0 | Сингапур `202.71.12.186` | `russia_inside`,`telegram`,`meta` | ✅ корректно (inside); VLESS-резерв `vlees` |
| **Переделки** | см. [[../projects/peredelki/README]] / [[../projects/peredelki/credentials]] | — | — | проверить | fwmark-патч -150→-140 (NetBird coexistence) |
| **Benelux** | Cudy TR3000 `100.70.207.97`, ssh mac-ed25519 (compromise 2026-05-20) | vpn / awg0 | Сингапур `202.71.12.186` | `russia_inside`,`telegram`,`meta` (+`githubusercontent.com` user_domain) | ✅ 2026-06-17: обход ОК (TG 302 / WA 200), `russia_outside` нет; list_update чинён (raw.git заведён в обход — RKN блокировал WAN-загрузку); `download_lists_via_proxy=1` сломал sing-box, откатан |
| **HomeLab dttb** | [[../projects/dttb/openwrt-router]] | — | — | — | цепочка с AGH: `dnsmasq→AGH:5353→127.0.0.42`; DNS-hijack стоит |
| Krasnogorsk / Znamenskoye | см. project README | — | — | проверить | проверить |
> Быстрый аудит любого роутера на «грабли inside/outside»:
> `ssh root@<ip> 'uci -q get podkop.main.community_lists'` — если объект в РФ и видишь `russia_outside` → это баг.
> TODO: пройтись по Переделки/Benelux/Krasnogorsk/Znamenskoye этим аудитом.
---
## Ссылки
- [[podkop-agent-runbook]] — операционная выжимка для AI-агента (автономное решение)
- [[podkop-fakeip-diagnostics]] — пошаговый runbook «обход не работает»
- [[../decisions/2026-05-29-niikn-diadoc-ozon-fix]] — кейс russia_outside (корень)
- [[../decisions/2026-04-17-peredelki-podkop-stability-fix]] — fwmark vs NetBird
- [[../decisions/2026-04-30-openwrt-homelab-agh-podkop-chain]] — AGH + podkop цепочка
- [[../decisions/2026-05-12-sergey-instagram-iphone-fakeip]] — клиент обходит DNS
- [[../projects/niikn/openwrt-bypass]] — детальный конфиг AWG/НИИКН
- itdoginfo allow-domains: <https://github.com/itdoginfo/allow-domains>