Трафик на 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
2.5 KiB
2.5 KiB
Summary: DNAT anycast → 95.163.53.117 в роли frr_anycast
Дата: 2026-09-10 План: 2026-09-10-nftables-dnat-plan.md
Что сделано
templates/nftables.conf.j2: добавлена цепочкаprerouting(hook prerouting priority dstnat) сip daddr <anycast-host> dnat to {{ dnat_target_ip }}, рендерится только при заданномdnat_target_ip. Отрабатывает до уже существующейpostrouting/masquerade (порядок гарантирован хуками nftables, явных зависимостей не требуется).defaults/main.yml: новая переменнаяdnat_target_ip: ""(по умолчанию выключено, площадка A не затронута).tasks/main.yml: pre-flightassert— еслиdnat_target_ipзадан, аenable_snat: false, playbook останавливается с понятной ошибкой (иначеnftables.confвообще не разворачивается и DNAT молча не применится).site-cloud.env/group_vars/site_cloud.yml:DNAT_TARGET_IP=95.163.53.117— DNAT включается автоматически по факту наличия значения, отдельный булев флаг не нужен.render-check-cloud.sh: добавлена проверкаdnat to 95.163.53.117на всех 4 узлах + валидация синтаксиса каждогоnftables.confчерезnft -c -f(еслиnftдоступен на control node).
Результаты проверки
render-check.sh(площадка A) — 6/6 OK, без изменений (роль не переиспользуетdnat_target_ip, когда он пуст).render-check-cloud.sh— все проверки пройдены, включая новую DNAT-проверку иnft -cдля всех 4 узлов (vr01–vr04).--syntax-check— OK для обоих playbook'ов.
Изменённые файлы
ansible/roles/frr_anycast/{defaults/main.yml,tasks/main.yml,templates/nftables.conf.j2}.ansible/site-cloud.env,ansible/group_vars/site_cloud.yml.ansible/tests/render-check-cloud.sh.README.md— раздел «Второе окружение» дополнен описанием DNAT.docs/2026-09-10-nftables-dnat-plan.md,docs/2026-09-10-nftables-dnat-summary.md.