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

20 KiB
Raw Blame History

date, type, tags, aliases
date type tags aliases
2026-06-23 project
buzharovo
openwrt
podkop
amneziawg
fakeip
doh
Severni Les router
Бужарово podkop роутер

Бужарово — podkop-роутер «Severny-Les» (Cudy TR3000)

Отдельный роутер обхода РКН для стройрынка Бужарово (Северный лес). Не путать со шлюзом 1С-сервера buzharovo-router — это новый 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 amnezialuci.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.250ssh -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 3389192.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.1198.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.org200.
    • Телефон в 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).

Связанное