fix(cluster): keepalived Split-Brain + Boot-Race behoben — v1.2.101

Ursache der „WireGuard reißt immer wieder ab"-Abrisse war NICHT die UniFi,
sondern keepalived-Flapping im HA-Cluster: die VIP 89.163.205.100 (an der die
UniFi-Site-to-Site hängt) wanderte bei ~17 VRRP-Wahlen/Tag zwischen utm-1/utm-2
→ Tunnel-Abriss bei jeder Wahl.

Drei Bugs:
1) Firewall ließ VRRP (IP-Proto 112) zwischen den Cluster-Peers NICHT zu
   (policy drop). Adverts überlebten nur via conntrack-Reverse-Matching → bei
   conntrack-Ablauf gedroppt → Peer promotet sich → Split-Brain.
   Fix: ruleset.nft.tpl erlaubt `ip/ip6 ... vrrp saddr @peer_ipv4/6`;
   firewall.go nimmt zusätzlich hb_src_ip/hb_peer_ip aus cluster_settings ins
   Peer-Set (deckt den Heartbeat-Pfad 169.254.0.x ab).
2) Kein nopreempt → erholter Node riss die VIP sofort zurück (Flap-Back);
   aggressiver gw-Check (fall 2 → 10s-Blip = Failover).
   Fix: keepalived.conf.tpl mit `nopreempt` in VI_1+VI_HB, chk_gateway fall 2→5;
   keepalived.go setzt State immer BACKUP (nopreempt wirkt nur in BACKUP),
   Priorität 200/100 aus pg_role bleibt → deckt sich mit „manuelles Promote".
3) keepalived-Boot-Race: Unit startete vor vlan500 (nur After=network-online)
   → „interface vlan500 doesn't exist" → permanenter CONFIG-Crash ohne Recovery
   (keepalived nach Reboot tot). Fix: postinst legt Drop-in mit
   After=/Wants=edgeguard-interfaces.service + Restart=on-failure an.

Neuer Test internal/keepalived/keepalived_test.go (nopreempt/BACKUP/fall).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
Debian
2026-06-07 17:49:04 +02:00
parent 91e51890dd
commit a2450a759c
7 changed files with 175 additions and 41 deletions

View File

@@ -845,6 +845,25 @@ EOSQL
# atomic-write (tempfile → rename) durchführen kann.
install -d -m 0755 /etc/keepalived
chown "$EG_USER":"$EG_USER" /etc/keepalived
# ── keepalived systemd drop-in: Boot-Race-Fix ──────────────────
# keepalived referenziert VIP-Devices (vlanXXX), die erst von
# edgeguard-interfaces.service angelegt werden. Ohne Ordering startet
# keepalived vor den VLANs (beide nur After=network-online.target) →
# "interface vlanX doesn't exist" → permanenter CONFIG-Crash OHNE
# Auto-Recovery (keepalived bleibt nach Reboot tot). After=/Wants=
# wartet auf die Interfaces; Restart=on-failure ist das Sicherheitsnetz.
install -d /etc/systemd/system/keepalived.service.d
cat > /etc/systemd/system/keepalived.service.d/10-edgeguard.conf <<'KEEPALIVEDDROPIN'
[Unit]
After=edgeguard-interfaces.service
Wants=edgeguard-interfaces.service
StartLimitIntervalSec=0
[Service]
Restart=on-failure
RestartSec=3
KEEPALIVEDDROPIN
systemctl daemon-reload
sudo -n -u "$EG_USER" /usr/bin/edgeguard-ctl render-config --only=keepalived || true
if [ -f /etc/keepalived/keepalived.conf ]; then
systemctl enable keepalived >/dev/null 2>&1 || true