diff --git a/family/how-to/rasputin-router.md b/family/how-to/rasputin-router.md index b6b35773..14c2a7a8 100644 --- a/family/how-to/rasputin-router.md +++ b/family/how-to/rasputin-router.md @@ -1,7 +1,7 @@ --- title: Rasputin OpenWrt router created: '2026-07-22' -updated: '2026-09-15' +updated: '2026-09-17' tags: - openwrt - router @@ -12,7 +12,7 @@ tags: --- # Rasputin R5S OpenWrt router -> Status as of 2026-07-22: Rasputin is the OpenWrt edge/LAN router, routing normal LAN traffic through a VLESS/Xray tunnel via `tun0`, with explicit direct-WAN exceptions for upstream LAN access and Mac `cloudflared` QUIC traffic. +> Status as of 2026-09-17: Rasputin is the OpenWrt edge/LAN router, routing normal LAN traffic through a VLESS/Xray tunnel via `tun0`, with explicit direct-WAN exceptions for upstream LAN access and Mac `cloudflared` QUIC traffic. ⚠️ **WAN переехал на `eth0` (`192.168.2.157/24`, gw `192.168.2.2`)** — см. раздел «WAN-интерфейс изменился» ниже. Транзит в GPON-сегмент `192.168.0.0/24` **сломан** — см. одноимённый раздел. ## Identity @@ -461,6 +461,80 @@ Vr HL TOS Len ID Flg off TTL Pro cks Src Dst - Между сегментами есть санитарный `Reject to LAN` в `forward_lan` → произвольные порты не пройдут, ICMP-эхо тоже. - Порты HA (`8123`) и SSH (`22`) через транзит роутера **не проверять как индикатор живости** — индикатор это сам факт ответа SSH-сессии. +## 🔴 Транзит Rasputin → 192.168.0.0/24 (GPON-сегмент) НЕ РАБОТАЕТ + +**Наблюдение 2026-09-17.** Симптом: с Мака (LAN `192.168.6.0/24`) трафик на `192.168.0.50` и `192.168.0.1` (80 порт) не проходит. + +### Что подтверждено фактами + +| Тест | Результат | +|---|---| +| `ping -c2 192.168.0.50` **с Мака** (`192.168.6.173`, en8) | 100% loss | +| `ping -c2 192.168.0.50` **с самого Rasputin** | ✅ 0% loss, 2.11–2.79 ms, ttl=63 | +| `ping -c2 192.168.2.2` с Мака | 100% loss + `Destination Port Unreachable` от `192.168.6.1` | + +Вывод из таблицы: **L2/L3 от Rasputin до `192.168.0.50` живой** (`ttl=63` — один хоп). Ломается **только транзит из LAN `192.168.6.0/24`**. + +### Три причины + +**1. `ip rule 100` покрывает только `192.168.2.0/24`.** + +Фактические правила на роутере (2026-09-17): + +```text +0: from all lookup local +98: from 192.168.6.173 ipproto udp dport 7844 lookup main +99: from 192.168.6.104 ipproto udp dport 7844 lookup main +100: from all to 192.168.2.0/24 lookup main +101: from all iif br-lan lookup vpn +32766: from all lookup main +32767: from all lookup default +``` + +Для `192.168.0.50` правило `100` **не матчится** → пакет попадает в `101` → `table vpn` → `tun0` (VLESS). Трафик уходит в туннель вместо WAN. + +**2. NAT/masq для зоны `wan` не покрывает `192.168.0.0/24`.** + +Правило firewall уже расширено до GPON-сегмента: + +```text +meta l4proto tcp ip daddr { 192.168.0.1, 192.168.0.50, 192.168.2.0/24 } counter packets 19 bytes 1216 jump accept_to_wan comment "!fw4: Allow-upstream-LAN" +meta l4proto udp ip daddr { 192.168.0.1, 192.168.0.50, 192.168.2.0/24 } counter packets 0 bytes 0 jump accept_to_wan comment "!fw4: Allow-upstream-LAN" +``` + +То есть forward разрешён, но пакет уходит с source `192.168.6.x`, а GPON-сегмент не знает обратного маршрута в `192.168.6.0/24`. Ответ вернуться не может. В `forward_lan` **нет NAT-правила** для этого направления. + +**3. ICMP зарезан отдельно.** + +`Allow-upstream-LAN` в nft создан в двух вариантах — `tcp` и `udp`, **без `icmp`** — и стоит выше KillSwitch. Остальной ICMP из LAN падает в `KillSwitch` (`packets 71 bytes 6192`). Отсюда `Destination Port Unreachable` от самого роутера (см. раздел про ICMP ниже). + +> ⚠️ Из-за п.3 **пинг не является индикатором** доступности `192.168.0.0/24` из LAN. Проверять только тем каналом, которым будете работать (SSH/TCP). + +### WAN-интерфейс изменился (факт 2026-09-17) + +Ранее (capture 2026-07-22) WAN был `usb0` с адресом `10.252.240.230`. Сейчас **WAN = `eth0`**: + +```text +inet 192.168.2.157/24 scope global eth0 +default via 192.168.2.2 dev eth0 proto static src 192.168.2.157 +``` + +То есть Rasputin получает адрес `192.168.2.157` **от роутера `192.168.2.2`** и выходит в интернет через него, а `192.168.2.2` — через GPON `192.168.0.1`. Топология запроса подтверждена: `rasputin → 192.168.2.2 → 192.168.0.1 (GPON) → 192.168.0.50`. + +### План ремонта (НЕ применён, ждёт апрува) + +```sh +# 1. ip rule — расширить bypass на GPON-сегмент +ip rule add to 192.168.0.0/24 lookup main priority 100 +# 2. та же строка в /etc/rc.local — иначе умрёт после ребута +# 3. firewall: Allow-upstream-LAN dest_ip += 192.168.0.0/24, добавить proto icmp +# 4. проверить, что masq зоны wan покрывает 192.168.0.0/24 (иначе ответ не вернётся) +``` + +Порядок работ по боевому конфигу: коммит ДО → правка → заливка → проверка Алекса руками → коммит ПОСЛЕ. + +Три причины: (1) `ip rule 100` покрывает только `192.168.2.0/24` — трафик на `192.168.0.0/24` не матчится и уходит в `table vpn`/`tun0` вместо WAN; (2) нет NAT/masq для GPON-сегмента — пакет уходит с source `192.168.6.x`, ответ не может вернуться; (3) `Allow-upstream-LAN` создан только для `tcp`+`udp`, **без `icmp`** — ICMP из LAN падает в KillSwitch, и роутер сам отдаёт `Destination Port Unreachable`. Поэтому **пинг не индикатор**: для `192.168.0.0/24` он врёт так же, как для `192.168.2.0/24`. Проверять только тем каналом, которым будете работать (SSH/TCP), напр. `nc -zv 192.168.0.50 80` или `ssh -o BatchMode=yes`. + ## Downstream LAN Access ```text