Files
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

34 lines
1.7 KiB
YAML

# Site-wide переменные окружения "Облачная площадка" — тонкий адаптер над
# ansible/site-cloud.env. Ничего site-специфичного не хардкодится: только
# имена ключей env-файла.
local_asn: "{{ lookup('env', 'LOCAL_ASN') }}"
anycast_prefix: "{{ lookup('env', 'ANYCAST_PREFIX') }}"
dummy_iface: "{{ lookup('env', 'DUMMY_IFACE') | default('dummy0', true) }}"
priv1_iface: "{{ lookup('env', 'PRIV_MAIN_IFACE') }}"
priv2_iface: "{{ lookup('env', 'PRIV_BACKUP_IFACE') }}"
ext_iface: "{{ lookup('env', 'EXT_IFACE') }}"
frr_apt_series: "{{ lookup('env', 'FRR_APT_SERIES') | default('frr-stable', true) }}"
enable_snat: true
as_path_prepend_count: "{{ lookup('env', 'AS_PATH_PREPEND_COUNT') }}"
# DNAT anycast -> dnat_target_ip. Задан DNAT_TARGET_IP — DNAT включается
# автоматически (см. roles/frr_anycast/defaults/main.yml).
dnat_target_ip: "{{ lookup('env', 'DNAT_TARGET_IP') | default('', true) }}"
# M1/M2/B1/B2 сидят на общих для всех 4 узлов L2-сегментах, поэтому список
# соседей — один на всё окружение, а не per-node (см. host_vars/vr0N.yml).
bgp_neighbors:
- ip: "{{ lookup('env', 'MAIN1_NEIGHBOR_IP') }}"
asn: "{{ lookup('env', 'MAIN_ASN') }}"
prepend: false
- ip: "{{ lookup('env', 'MAIN2_NEIGHBOR_IP') }}"
asn: "{{ lookup('env', 'MAIN_ASN') }}"
prepend: false
- ip: "{{ lookup('env', 'BACKUP1_NEIGHBOR_IP') }}"
asn: "{{ lookup('env', 'BACKUP_ASN') }}"
prepend: true
- ip: "{{ lookup('env', 'BACKUP2_NEIGHBOR_IP') }}"
asn: "{{ lookup('env', 'BACKUP_ASN') }}"
prepend: true