Commit c5663ba3 authored by Vitaly Lipatov's avatar Vitaly Lipatov

memory: add lesson and feedback on routing for NAT-peer tunnels

- lesson on anyssh.ru = 91.232.225.8 hidden behind shared jumphost - feedback: never add office-subnet routes on remote NAT peer Both incidents from ikev2.gr.egw setup where adding routes on parentglobal first killed reverse SSH access to the host. Co-Authored-By: 's avatarClaude Opus 4.7 <noreply@anthropic.com>
parent 2a671517
......@@ -24,7 +24,10 @@
| border (PVE-хост) | `ssh root@border` |
| beget.ogw.eterhost.ru (217.12.37.55) | `ssh root@beget.ogw.eterhost.ru` |
| telemt.eterfund.ru (91.232.225.3) | `ssh root@91.232.225.3` |
| enceladus (192.168.0.17, бэкенд chat.eterfund.ru) | `ssh root@enceladus` (порт 22; lav@ — нет ключа) |
| gyle (CT 716 на border, 91.232.225.86) | `ssh root@91.232.225.86` (был .43 до 2026-05-25) |
| sip.etersoft.ru (91.232.225.18) | `ssh -p32 root@sip.etersoft.ru` (ключи добавлены 2026-04-27, lav@ тоже работает с NOPASSWD sudo) |
| time.office.etersoft.ru | `ssh time` (алиас, порт 6122, lav+sudo) — НЕ работает напрямую `ssh root@time.office`, см. [reference_time_office_sessions.md](reference_time_office_sessions.md) |
## Сервисы (не в skills)
......@@ -43,6 +46,8 @@
- [feedback_verify_before_stating.md](feedback_verify_before_stating.md) — ВСЕГДА проверять информацию, не выдумывать
- [feedback_upgrade_sisyphus.md](feedback_upgrade_sisyphus.md) — обновление LXC ALT p11 → Sisyphus
- [feedback_skill_confirmation_direct.md](feedback_skill_confirmation_direct.md) — подтверждения от skill'ов спрашивать напрямую, не через lavtomate
- [feedback_no_routes_on_remote_nat_peers.md](feedback_no_routes_on_remote_nat_peers.md) — НЕ добавлять маршруты на удалённой машине за NAT при настройке туннелей; MASQUERADE на нашей стороне достаточно
- [lesson_anyssh_ru_in_91232225.md](lesson_anyssh_ru_in_91232225.md) — anyssh.ru = 91.232.225.8, не маршрутизировать всю /24 через туннель
- [lesson_lavtomate_bug_create_confirmation.md](lesson_lavtomate_bug_create_confirmation.md) — bug_create сломан: НЕ ретраить, проверять через confirmation_check
- [lesson_dns_free_ip_check_both_zones.md](lesson_dns_free_ip_check_both_zones.md) — поиск свободного IP: проверять ОБЕ зоны (forward+reverse) и ping
- Сброс пароля AD: `логин + uidNumber`
......@@ -59,6 +64,7 @@
- [project_roundcube_fix.md](project_roundcube_fix.md) — fix_reply_button после обновления
- [project_vpn_telegraf_monitoring.md](project_vpn_telegraf_monitoring.md) — OpenVPN per-user статистика через telegraf+exec, ждём Etersoft#19028
- [project_hikvision_ftp_ct540.md](project_hikvision_ftp_ct540.md) — CT 540 hikvision-ftp на spacer (192.168.0.216), Etersoft#18775
- [project_mail_password_hash_migration.md](project_mail_password_hash_migration.md) — Etersoft#19044: DES→SHA-512, этапы 1-3 готовы (cyradm/sec/roundcube), осталось форс-сброс 19 слабых
## Десктоп lav
- [lav_desktop_hyprland.md](lav_desktop_hyprland.md) — Deferred + Ximper + Hyprland
......@@ -84,3 +90,9 @@
- [lesson_dhcp_8net_dynamic_range.md](lesson_dhcp_8net_dynamic_range.md) — dhcp.office: 8/24 имеет динамический пул 8.100–8.254, 0/24 — 0.160–0.199; статика ставить вне
- [lesson_cyrus_sasl_restart.md](lesson_cyrus_sasl_restart.md) — cyrus-imapd на ALT: `serv restart` НЕ работает, нужен `systemctl restart`; SASL auxprop кэширует `sql_select` на процесс; `Hoffice` в defaultdomain — НЕ трогать; симлинк в `/var/spool/imap/domain/` опасен с autocreate
- [lesson_warp_oom_nft_deadlock.md](lesson_warp_oom_nft_deadlock.md) — warp.egw CT 703: OOM SIGKILL оставляет stale nft, чинится drop-in ExecStartPre; gre.beget CT 683 — путь до Cloudflare endpoint
- [lesson_builder_tmp_cleanup.md](lesson_builder_tmp_cleanup.md) — builder: /tmp чистит systemd-tmpfiles (10d), stmpclean локально отключён для /tmp
- [lesson_roundcube_password_plugin_config.md](lesson_roundcube_password_plugin_config.md) — Roundcube password: `%c``%P` после 1.2, иначе DB Error 1064; не путать `password` и `password.log`
- [lesson_mail_postfix_sasl_config_path.md](lesson_mail_postfix_sasl_config_path.md) — mail.etersoft.ru: Postfix читает `/etc/postfix/sasl/smtpd.conf`, НЕ `/etc/sasl2/smtpd.conf`. Cyrus `imap=1`, Postfix `smtpauth=1`
- [lesson_sieve_domain_split.md](lesson_sieve_domain_split.md) — sieve расщепление при symlink доменов: managesieve пишет по login-домену, доставка читает по spool-symlink → правила Roundcube не применяются
- [lesson_lavtomate_master_active_empty.md](lesson_lavtomate_master_active_empty.md) — Lavtomate пишет пустой master active.script без `include "roundcube"` → правила Roundcube глохнут; ручной workaround + задание в lavtomate/docs/task-sieve-master-include.md
- [lesson_chat_eterfund_telemt_oom.md](lesson_chat_eterfund_telemt_oom.md) — chat.eterfund.ru: round-robin .43 (CT 691 telemt TLS-прокси на enceladus) + 217.12.37.55 (beget); инцидент 2026-05-25 — gyle CT 716 захватывал .43, перенесли gyle на .86
---
name: feedback-no-routes-on-remote-nat-peers
description: При настройке IPsec/VPN-туннеля к удалённой машине за NAT никогда не добавлять на ней маршруты на офисные подсети — достаточно SNAT/MASQUERADE на нашей стороне
metadata:
node_type: memory
type: feedback
originSessionId: 7ffb5a77-2b00-4e79-86c1-26711b9a62c2
---
При настройке туннеля (IPsec/WireGuard/etc.) между нашей точкой и удалённой машиной за NAT (например parentglobal, доступной только через обратный SSH-туннель к anyssh.ru) — **никаких маршрутов на офисные подсети на удалённой стороне не добавлять**.
**Why:** Пользователь явно сказал «не добавлять маршруты» (формулировка «маршруты не прилетели»). Лишний маршрут вроде `91.232.225.0/24 via <tunnel-peer>` перехватывает трафик к управляющему хосту (`anyssh.ru = 91.232.225.8`) и убивает обратный SSH-туннель ещё до того, как сам IPsec-туннель встанет — после этого хост недоступен и требует локального вмешательства. Это случилось 2026-05-25 при настройке ikev2.gr.egw.etersoft.ru.
**How to apply:**
- На удалённой стороне создавать только сам tunnel-интерфейс с p2p-адресом (например `10.10.10.6/30`). On-link маршрут `10.10.10.4/30` появится сам от systemd/iproute2 — этого достаточно.
- На нашей стороне (CT-responder) делать `iptables -t nat -A POSTROUTING -o ipsec0 -j MASQUERADE` — весь офисный трафик прячется за единственным p2p-адресом нашего конца туннеля. Удалённой стороне нечего маршрутизировать, ответы идут на known-link.
- Если действительно нужны specific-маршруты на удалённой машине (редкий случай — например, нужно достучаться с неё к конкретному офисному IP без NAT), сначала через `dig` проверить, что управляющие хосты (anyssh.ru, jumphost, и т.п.) не попадают в маршрутизируемую подсеть, и при необходимости добавлять `pinhole`-маршрут на их конкретный /32 через default-gw **раньше**, чем общий маршрут.
- Перед любым `systemctl start` нового сетевого сервиса на удалённом хосте — пересмотреть, не появится ли в маршрутной таблице что-то, перекрывающее текущий путь до управления.
См. также: [[lesson-anyssh-ru-in-91232225]]
---
name: lesson-anyssh-ru-in-91232225
description: "anyssh.ru это 91.232.225.8 в собственной офисной подсети, любые маршруты на 91.232.225.0/24 могут разорвать обратный SSH-туннель удалённых хостов"
metadata:
node_type: memory
type: reference
originSessionId: 7ffb5a77-2b00-4e79-86c1-26711b9a62c2
---
`anyssh.ru` резолвится в `91.232.225.8` (только A-запись, AAAA нет). Этот хост — наш собственный SSH-jumphost/relay, через который удалённые машины за NAT (типа `parentglobal` с домашнего интернета) держат обратный SSH-туннель `ssh -R 10337:localhost:22`. Внешний `ssh -p 10337 etersoft@anyssh.ru` форвардится по этому туннелю на удалённый хост.
**Why:** Когда настраивал ikev2.gr.egw.etersoft.ru (CT 706 на border), добавил на parentglobal маршрут `91.232.225.0/24 via 10.10.10.5 dev ipsec0` *до* установления IPsec SA. Это перехватило трафик к anyssh.ru:22 (91.232.225.8), обратный SSH-туннель умер, parentglobal стал недоступен извне до ручного вмешательства локально. Пользователь явно предупреждал «маршруты не прилетели».
**How to apply:**
- Перед любым изменением маршрутизации на удалённом NAT-хосте, доступном через anyssh.ru, **обязательно**: `dig +short anyssh.ru` и убедиться, что подсеть управления не пересекается с тем, что собираешься направить через туннель.
- Если нужно маршрутизировать `91.232.225.0/24` через ipsec0 на таком хосте — сначала добавить более специфичный pinhole `ip route add 91.232.225.8/32 via 192.168.1.1 dev enp3s0` (или иную правильную пару), и только потом более общий маршрут.
- Альтернатива: маршрутизировать через туннель только подсети офисных клиентов (`10.20.30.0/24`, `10.27.0.0/24`, `10.28.0.0/24`), не трогать `91.232.225.0/24` целиком.
- Никогда не делать start/enable IPsec-сервисов на удалённом хосте без предварительной проверки, что текущая SSH-связь не пойдёт через будущий tun-интерфейс. Сначала добавлять маршруты через `metric 1000+` чтобы они уступали default; или использовать start_action=none + ручной `swanctl --initiate`.
См. также: [[lesson-routing-pinhole-management-plane]] (если будет добавлен).
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment