Files
knowledge-base/projects/buzharovo/podkop-router.md

141 lines
20 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-06-23
type: project
tags: [buzharovo, openwrt, podkop, amneziawg, fakeip, doh]
aliases: [Severni Les router, Бужарово podkop роутер]
---
# Бужарово — podkop-роутер «Severny-Les» (Cudy TR3000)
Отдельный роутер обхода РКН для стройрынка Бужарово (Северный лес). **Не путать** со шлюзом 1С-сервера [[buzharovo-router|Cudy WR6500H 185.13.47.2]] — это новый Cudy TR3000 под podkop.
- **hostname:** `Severny-Les` (было `Severni_Les` — поправлено на корректную латиницу 2026-06-23).
- **NetBird:** `100.70.113.251` / `severny-les-113-251.netbird.cloud` (группа Claude-Diag, ключ `64DF527E-…`, `--disable-dns`). Прямой доступ: **`ssh root@100.70.113.251`** (root/`1qaz!QAZ`).
## Железо / ОС
- **Cudy TR3000 v1**, OpenWrt 24.10.3 r28872, aarch64; extroot на USB (Verbatim 31 ГБ, ext4 label `extroot``/overlay`, ~27 ГБ свободно).
- podkop **v0.7.19**, sing-box **1.12.4** (бинарь скопирован с домашнего 10.0.0.1; opkg-метадата числит 1.12.22 — бэкап `/usr/bin/sing-box.bak-1.12.22`; версия на обход НЕ влияла, см. ниже).
- **AmneziaWG-пакеты** (`kmod-amneziawg 6.6.104.1.0.20250924`, `amneziawg-tools 1.0.20250903`, `luci-proto-amneziawg 2.0.4`) перенесены **с домашнего 10.0.0.1** (байт-в-байт та же платформа) — `opkg files`→tar→распаковка+`depmod`; kmod-зависимости (`kmod-udptunnel4/6`, crypto) из штатного фида. AWG 1.5 поддержан (S3/S4 + H-диапазоны). См. [[reference_infra]] / память «Переиспользуй инфру Олега».
- ⚠️ **Грабля LuCI «Unsupported protocol type» у awg0** (туннель при этом работает — это только вебка): при ручном копировании `luci-proto-amneziawg` его **ресурсная зависимость `/www/luci-static/resources/uqr.js`** (QR-lib) НЕ попадает в `opkg files` пакета → `amneziawg.js` делает `require uqr` → класс протокола не регистрируется. Фикс: скопировать `uqr.js` с домашнего + `rm -f /tmp/luci-*; /etc/init.d/rpcd restart` + hard-refresh браузера. (Бэкенд тоже нужен: `ubus list | grep amnezia``luci.amneziawg`.) `dom.js` отдельным файлом отсутствует — это норма (в базовом бандле).
## Сеть и доступ (стадия препрод, 2026-06-23)
Сейчас стоит в домашней лабе: воткнут во **второй LAN-порт Proxmox**.
- LAN роутера: **192.168.1.1/24** (br-lan).
- WAN роутера: `eth0` DHCP из домашней сети — IP **10.0.0.215**, шлюз **10.0.0.1** (домашний роутер). Весь интернет идёт через дом.
- **Доступ (основной):** по NetBird — `ssh root@100.70.113.251`.
- **Доступ (фолбэк, по LAN):** jump через Proxmox — `ssh root@10.0.0.250``ssh -o UserKnownHostsFile=/dev/null root@192.168.1.1` (root / `1qaz!QAZ`). Host-key 192.168.1.1 на Proxmox конфликтует → нужен `UserKnownHostsFile=/dev/null`.
- **Firewall для NetBird:** добавлена зона `nbird` (device `wt0`, `input=ACCEPT` для управления, `forward=REJECT` — NetBird-пиры НЕ ходят в LAN стройрынка, masq off). Без неё SSH на NetBird-IP = «Connection refused» (wt0 был вне зон). ⚠️ Доступ к роутеру по NetBird гейтит ACL группы Claude-Diag — на проде сузить, если в группе лишние пиры.
- На стройрынке будет свой провайдер — сохранить LAN `192.168.1.0/24`.
## Туннель
- AmneziaWG **awg0** → Finland HOSTKEY `151.241.234.241:41624` (тот же хаб, что у дома и НИИКН; AWG 1.5: S3/S4 + H-диапазоны), клиент `10.8.1.3/32`.
- На Amnezia-панели (LXC 143) пир называется **«Severni Les»**. Список клиентов хаба: `Admin [macOS]`=10.8.1.1, `podkop homelab`=10.8.1.2 (домашний), `Severni Les`=10.8.1.3.
- `rp_filter` глобально `0` → транзит через туннель работает без правок (в отличие от домашнего, где нужен per-iface `=2` — см. [[../dttb/openwrt-router]]).
## podkop-конфиг (рабочий)
| Параметр | Значение |
|---|---|
| `interface` | `awg0` (Финляндия) |
| `community_lists` | `meta youtube telegram` |
| `disable_quic` | `1` |
| `dns_type` | **`doh`** ← ключевой фикс |
| `dns_server` | **`1.1.1.1/dns-query`** (DoH по IP, БЕЗ префикса `https://`) |
| `download_lists_via_proxy` | **`1`** / section `main` |
> ⚠️ **DoH по IP, и значение — `1.1.1.1/dns-query` (без `https://`).** Два подвоха:
> 1. **Не bare IP.** Если задать `dns_server=8.8.8.8`, podkop подставляет каноничный DoH-URL `https://dns.google/dns-query` (**хостнейм**) — его надо резолвить через bootstrap по `:53` (за домашним хайджеком) → хрупко.
> 2. **Не полный URL `https://1.1.1.1/dns-query`.** Конфиг sing-box он соберёт верно (IP-DoH), НО **проверка «Основной DNS» в диагностике podkop баговая**: делит `dns_server` по `/` и для `https://…` выполняет `dig @https:` → ложный красный крест.
> Правильное значение **`1.1.1.1/dns-query`**: `url_get_host`=`1.1.1.1` (IPv4) → bootstrap не нужен (sing-box стучит прямо на `1.1.1.1:443`), И диагностика парсит верно (`dig @1.1.1.1 +https=/dns-query`) → зелёная.
> Косметика: «Счётчики правил mangle» краснеют в препроде (нет LAN-клиентов → forward-метки на нуле); в проде с клиентами зеленеют.
## Грабли, которые лечили (2026-06-23)
1. **`download_lists_via_proxy=0` → sing-box не качал rule-set'ы** (GitHub блокирован РКН по WAN, `/tmp/sing-box/rulesets` пуст). Фикс: `download_lists_via_proxy=1` + `download_lists_via_proxy_section=main` (detour→`main-out`=туннель). Бэкап `/etc/config/podkop.bak-srs-fix-20260623`. Подробно: [[../../snippets/podkop-reference]] §5.
2. **Главное: обход не работал (telegram/youtube 000), хотя туннель жив.** sing-box дозванивался до самого FakeIP (`dial tcp 198.18.0.x: i/o timeout`) вместо реального IP. **Корень — препрод-среда:** роутер стоит за домашним роутером, а у того **catch-all DNS-хайджек** (`udp dport 53 dnat → 10.0.0.1:53`). Восходящий резолв sing-box'а (за реальным IP по `udp:53`) перехватывался домашним хайджеком → возвращался домашний FakeIP → петля. **Фикс: `dns_type=doh`** — резолвер по `https/443` минует `:53`-хайджек. На боевом объекте (свой провайдер) работал бы и на `udp`, но DoH делает роутер устойчивым к любому вышестоящему DNS-перехвату. Грабля в справочнике: [[../../snippets/podkop-reference]] §5.
- Тупиковые версии (отброшены проверкой): sing-box 1.12.22→1.12.4 и `dns_server` 77.88.8.8→8.8.8.8 — **на обход не влияли**, причина была в DNS-хайджеке.
## sing-box 1.13.x — НЕ ставить (пока podkop 0.7.19)
podkop 0.7.19 генерит sing-box-конфиг под ветку **1.12** (старый формат DNS-секции). В 1.13 формат DNS менялся → риск, что sing-box не распарсит конфиг и не стартует. Держим 1.12.x (как дома). Латест — только после проверки совместимости с podkop, откатно.
## Веб-терминал в LuCI (ttyd)
`luci-app-ttyd` + `ttyd` 1.7.3 уже стоят, служба enabled, слушает `0.0.0.0:7681`, **writable** (этот билд RW по умолчанию; `-R` сделал бы RO — его нет). LuCI-вьюшка (System → Terminal) вставляет `<iframe src="http://<хост-как-открыта-LuCI>:7681">`.
- **Грабля «окно терминала не активно/пустое»:** LuCI открывали на `192.168.1.1`, а этот адрес **коллизит с НИИКН/Переделки** в NetBird (тот же `192.168.1.0/24`) → iframe на `192.168.1.1:7681` уходил не туда. Фикс: `uci set ttyd.@ttyd[0].url_override='http://100.70.113.251:7681'` (стабильный NetBird-IP). Теперь терминал грузится с него независимо от того, как открыта LuCI (браузер должен быть в NetBird).
- **Рекомендация:** открывать сам роутер по NetBird — **`http://100.70.113.251`** (а не `192.168.1.1`), тогда и LuCI, и терминал однозначны. После правки — hard-refresh страницы LuCI (term.js кешируется).
- Терминал спрашивает логин (`/bin/login` → root/`1qaz!QAZ`); :7681 гейтит firewall-зона `nbird` + ACL группы Claude-Diag.
## Шлюз 1С — миграция настроек со старого WR6500H (2026-06-23)
TR3000 = шлюз Бужарово (Вариант B, см. [[../../decisions/2026-06-22-buzharovo-podkop]]). Перенесено:
**Статик-лизы DHCP** (`/etc/config/dhcp`, у всех `dns=1`):
| Хост | IP | MAC |
|---|---|---|
| Server1C | `192.168.1.249` | `00:E0:4C:68:9E:34` |
| KASSA3 (касса 1) | `192.168.1.18` | `1C:1B:0D:32:10:A2` |
| KASSIRULICA2 (касса 2) | `192.168.1.99` | `74:D4:35:83:B8:B6` |
MAC'и сняты из ARP-кэша Server1C (WinRM через openclaw LXC137 по NetBird, физ. iface `192.168.1.249` — чтобы обойти коллизию подсети с НИИКН). Полный ARP объекта — в логе сессии.
**Проброс портов** (`firewall.@redirect`, пока «как на старом WR6500H»):
- `RDP-Server1C`: WAN tcp/udp `3389``192.168.1.249:3389` (DNAT).
- На WR6500H публично были также 443 (LuCI) и 53 (DNS) — это сервисы самого роутера, не host-проброс, не переносим.
- ⚠️ RDP в интернет — security-риск (флагалось в разведке). Рекомендация: позже увести в NetBird (Server1C уже `100.70.75.103`). Пока по решению Олега — как на старом.
**LAN (проверено 2026-06-23):** `br-lan` = `192.168.1.1/24` (= WR6500H), gw/DNS клиентам `.1` = TR3000. DHCP-пул обрезан до **`.100.238`** (был `.100.249`) — статик-IP касс (`.18`/`.99`) и Server1C (`.249`) вне пула. dnsmasq→`127.0.0.42` (FakeIP), `noresolv=1`, `dont_touch_dhcp=0`. Проверка клиента: `nslookup web.telegram.org @192.168.1.1``198.18.x` (туннель), `gosuslugi.ru`→реальный IP (напрямую). **IPv6 на LAN отключён** (`dhcp.lan.ra=disabled`, `dhcpv6=disabled`) — против утечки заблокированного мимо v4-FakeIP (как дома/Оливье).
**Не пробрасывалось наружу:** 1С-кластер (`1540/1541/1560-1591`) и MSSQL (`1433`) — только LAN. Wi-Fi держит WR6500H в режиме AP/bridge.
**WR6500H** (`185.13.47.2`): SSH off + браузерный sha256-хэш-логин → headless-дамп конфига невозможен; 1С-настройки восстановлены из [[../../decisions/2026-05-07-buzharovo-recon]].
## Установлен на объекте + проверка (2026-06-24)
Своп со WR6500H выполнен, роутер в проде. Проверено по NetBird `100.70.113.251`:
- **WAN** поднялся на родном `185.13.47.2/25` (gw `185.13.47.1`) — WAN-MAC/тип подключения перенесены верно.
- **Туннель** awg0→Финляндия: handshake свежий, трафик идёт. telegram/youtube `200` через FakeIP (`198.18.x`); gosuslugi `200` напрямую (реальный IP). На роутере обход 100% рабочий (tproxy-счётчики PodkopTable растут).
- **1С**: Server1C `192.168.1.249` в сети; проброс RDP `3389→.249` активен (DNAT-счётчик >0, порт OPEN по WAN и по NetBird `100.70.75.103`).
- **NetBird**: Management/Signal Connected, служба enabled (autostart).
- Точки доступа TP-Link (`c4:2f:90`: .200/.105) и Keenetic (`44:47:cc`: .210) — чистые AP/bridge (свой DHCP/DNS не раздают, на :53 молчат). Двойного NAT нет.
### Грабля «обход не работает у клиентов» — ДВЕ разные причины (2026-06-24)
При миграции роутера **не перенесли DNS-hijack/анти-утечку** (дома он есть, см. [[../../snippets/podkop-reference]] §190). Клиенты резолвили мимо роутера → нет FakeIP → мимо туннеля. В conntrack видны были утечки `src=LAN dst=77.88.8.8/1.1.1.1/8.8.8.8 :53`.
**Добавлено на TR3000** (бэкапы: `/etc/config/firewall.bak-forcedns-20260624`, `firewall.bak-blockdoh-20260624`, `dhcp.bak-privaterelay-20260624`):
1. `Force-DNS-53` — DNAT всех LAN :53 (tcp/udp) → `192.168.1.1`. Заворачивает любой чужой DNS на dnsmasq роутера. ✅ счётчик растёт, утечки переписываются на `.1`.
2. `Block-DoT-853` — REJECT :853 (Android/iOS Private DNS).
3. `Block-DoH-443` — REJECT :443 к публичным DoH-резолверам (8.8.8.8/8.8.4.4/1.1.1.1/1.0.0.1/9.9.9.9/149.112.112.112/94.140.14.14-15/77.88.8.8/77.88.8.1).
4. `Block-QUIC-443` — REJECT udp/443 LAN→WAN (убивает HTTP/3-DoH и транспорт iCloud Private Relay; TCP/443 цел).
5. dnsmasq `address=/mask.icloud.com/`, `/mask-h2.icloud.com/`, `/mask-api.icloud.com/` → NXDOMAIN (отключает iCloud Private Relay при переподключении к Wi-Fi).
> ⚠️ Эти 5 правил полезны для ВСЕХ клиентов и должны остаться. После добавления сбрасывать conntrack :53 (или ждать ~30с UDP-таймаут), иначе старые сессии висят мимо DNAT.
**НО iPhone `192.168.1.115` «не сработал» по ДРУГОЙ причине (не DNS/не Relay):** на самом телефоне установлено **приложение AmneziaVPN/AmneziaWG**, заворачивающее весь трафик в свой туннель `202.71.12.186:37209` (старый резервный домашний AWG-эндпоинт). conntrack: `src=192.168.1.115 dst=202.71.12.186 dport=37209` [ASSURED], мегабайты трафика, 0 запросов :53 к роутеру изначально. Роутерный обход к такому телефону неприменим — он ходит мимо Wi-Fi-маршрутизации целиком.
> **Фикс (на стороне айфона, НЕ роутера):** выключить/удалить приложение Amnezia на телефоне (`Настройки → VPN → откл` или в самом приложении). После — переподключить Wi-Fi → пойдёт через FakeIP роутера. **Урок:** прежде чем чинить DNS на роутере — проверь conntrack клиента на свой VPN-туннель (большой UDP-поток на внешний IP мимо :53).
**Не доделано (вернуться):** подтвердить, что после выключения Amnezia на iPhone .115 трафик идёт через FakeIP (`dst=198.18.x`). Опц.: решить, оставлять ли Block-QUIC-443 (к этому айфону отношения не имел, но полезен против HTTP/3-DoH).
## Установка на объекте — чеклист (выезд 2026-06-24, утро)
TR3000 полностью преднастроен на столе. На объекте — физический своп со WR6500H + WAN провайдера.
**Доступ во время работ:**
- По NetBird (основной): `ssh root@100.70.113.251` (root/`1qaz!QAZ`), LuCI `http://100.70.113.251`, веб-терминал в LuCI работает.
- Локально (фолбэк): ноут в LAN-порт TR3000 → `http://192.168.1.1` (но этот IP коллизит с НИИКН в NetBird — по NetBird-IP надёжнее).
**Шаги:**
1. **WAN/провайдер (Олег сам).** Снять с WR6500H тип подключения (Network → WAN: `DHCP` / `PPPoE` / `Static`) и **WAN-MAC** (Status). Поставить то же на TR3000 (`Network → Interfaces → WAN`):
- *DHCP с привязкой IP к MAC* → WAN=DHCP + клонировать WAN-MAC WR6500H (WAN → Advanced → Override MAC). Иначе провайдер не выдаст `185.13.47.2`.
- *PPPoE* → логин/пароль провайдера.
- *Static* → IP `185.13.47.2` + маска/шлюз/DNS.
- 2.5G-аплинк перецепить в 2.5G-порт TR3000.
2. **WR6500H → режим AP/bridge:** DHCP off; патч-корд LAN-порт WR6500H → LAN-порт TR3000. Wi-Fi 7 раздаёт WR6500H. Так нет двойного NAT (единственный NAT — на TR3000).
3. **Проверки после подъёма WAN** (`ssh root@100.70.113.251`):
- `awg show awg0` — handshake свежий; `curl -s -m8 -o/dev/null -w '%{http_code}' https://web.telegram.org``200`.
- Телефон в Wi-Fi: Telegram/YouTube открываются; gosuslugi/банк/ОФД — напрямую (НЕ через туннель).
- Server1C получил `192.168.1.249` (статик-лиз); RDP `185.13.47.2:3389` отвечает (проброс уже на TR3000).
- Кассы `.18`/`.99` видят 1С на `192.168.1.249`.
4. **Флешку НЕ вынимать** (на ней overlay → роутер откатится на 19 МБ внутренней памяти).
**Откат:** вернуть WAN в WR6500H + WR6500H обратно в router-режим. Конфиг TR3000 не трогается.
**Уже готово на TR3000:** extroot · podkop→awg0 (FI) `meta/youtube/telegram` · DoH · NetBird `100.70.113.251` · ttyd · статик-лизы (Server1C/KASSA3/KASSIRULICA2) · проброс RDP `3389→.249`. Server1C — доступ/рецепты: [[server1c]] (rmngr-loop: `Restart-Service '1C:Enterprise 8.3 Server Agent (x86-64)' -Force`).
## Связанное
- [[README]] — проект Бужарово
- [[../dttb/openwrt-router]] — домашний роутер (тот же финский хаб awg2; там грабля rp_filter)
- [[../../decisions/2026-06-23-amnezia-web-panel-lxc143]] — Amnezia-панель и финский хаб