Files
poc-frr-anycast/docs/2026-09-10-nftables-dnat-plan.md
T
ayurishchevandClaude Sonnet 5 1e287ee81c Add DNAT anycast -> backend in frr_anycast nftables config
Трафик на 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
2026-09-10 17:25:09 +03:00

1.9 KiB
Raw Blame History

План внедрения: 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 обновлены.