Трафик на anycast-адрес (172.31.255.10) теперь сначала DNAT'ится на реальный backend (DNAT_TARGET_IP=95.163.53.117 для site-cloud) в prerouting, и только потом проходит уже существующий sNAT/masquerade в postrouting — обе цепочки в одной table inet nat, порядок хуков гарантирует правильную последовательность. DNAT включается автоматически по факту заданного dnat_target_ip (без отдельного булева флага), выключен по умолчанию — площадка A не затронута. Pre-flight assert не даёт задать dnat_target_ip без enable_snat (иначе nftables.conf вообще не разворачивается). render-check-cloud.sh дополнен проверкой DNAT-правила и валидацией синтаксиса каждого nftables.conf через `nft -c -f`. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Bc3HkMiDwooSyLBLoMKNyF
21 lines
1.9 KiB
Markdown
21 lines
1.9 KiB
Markdown
# План внедрения: DNAT anycast → 95.163.53.117 в роли frr_anycast
|
||
|
||
**Дата:** 2026-09-10
|
||
|
||
## Цель
|
||
|
||
Добавить в роль `frr_anycast` опциональную DNAT-трансляцию: трафик на anycast-адрес перенаправляется на `95.163.53.117`, до уже существующей SNAT/masquerade в `postrouting` (см. обсуждение в чате).
|
||
|
||
## Подход
|
||
|
||
- `table inet nat` дополняется цепочкой `prerouting` (`hook prerouting priority dstnat`) с правилом `ip daddr <anycast-host> dnat to <dnat_target_ip>` — рендерится только когда `dnat_target_ip` задан.
|
||
- `enable_dnat`/`dnat_target_ip` — новые опциональные переменные роли (дефолт выключено), выводятся из `DNAT_TARGET_IP` в env-файле: если задан — DNAT включается автоматически, отдельный булев флаг в env не нужен.
|
||
- DNAT имеет смысл только при уже включённом `enable_snat` (иначе `nftables.conf` вообще не разворачивается) — добавляется pre-flight `assert`.
|
||
- Применяется в окружении `site-cloud` (`DNAT_TARGET_IP=95.163.53.117` в `site-cloud.env`), площадка A не затрагивается (дефолт выключен).
|
||
|
||
## Definition of done
|
||
|
||
- `nftables.conf.j2` рендерит `prerouting`-цепочку с DNAT при заданном `dnat_target_ip`, без него — не рендерит (площадка A не меняется, у неё `enable_snat: false`).
|
||
- `render-check-cloud.sh` подтверждает: `dnat to 95.163.53.117` присутствует у всех 4 узлов, синтаксис `nft -c` валиден.
|
||
- README и summary обновлены.
|