Nach v1.2.102 (VIP nicht mehr statisch gebunden) wandert die Public-VIP .100 erstmals wirklich per keepalived zwischen den Node-MACs. Der Hosting-Upstream lernte die neue MAC aber nicht zuverlässig → .100 nach Schwenk von außen unerreichbar (vorher maskiert, weil .100 statisch dauerhaft auf utm-1 lag). Zwei Mechanismen ergänzt: 1) keepalived.conf.tpl global_defs: vrrp_garp_master_repeat 5 + vrrp_garp_master_refresh 60 (+ vrrp_garp_interval/gna 0, aus Legacy-Template verloren gegangen) → forciertes GARP beim Wechsel + periodische Auffrischung, damit die VIP-MAC am Switch nicht altert. 2) keepalived-master.sh: neuer Master pingt den Default-Gateway aus jeder Public-IP/VIP an (ping -I <vip>) → Upstream sieht Traffic VON der VIP und lernt die MAC sofort. Manche Hoster relearnen nur so, nicht via GARP. Test: keepalived_test.go prüft GARP-Direktiven im Render. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
83 lines
2.1 KiB
Smarty
83 lines
2.1 KiB
Smarty
global_defs {
|
|
router_id {{ .RouterID }}
|
|
script_user root
|
|
enable_script_security
|
|
# GARP: beim Master-Wechsel Gratuitous-ARP forciert senden (repeat) UND
|
|
# periodisch auffrischen (master_refresh) — sonst lässt der Upstream-Switch
|
|
# die VIP-MAC altern und die Failover-IP wird nach Minuten unerreichbar.
|
|
# Ergänzt durch den Priming-Ping in keepalived-master.sh (Traffic AUS der VIP).
|
|
vrrp_garp_interval 0
|
|
vrrp_gna_interval 0
|
|
vrrp_garp_master_repeat 5
|
|
vrrp_garp_master_refresh 60
|
|
}
|
|
|
|
vrrp_script chk_edgeguard {
|
|
script "/usr/lib/edgeguard/keepalived-check.sh"
|
|
interval 2
|
|
weight -50
|
|
fall 3
|
|
rise 2
|
|
}
|
|
{{ if .GWCheckIP }}
|
|
vrrp_script chk_gateway {
|
|
script "/usr/lib/edgeguard/keepalived-gw-check.sh {{ .GWCheckIP }}"
|
|
interval 5
|
|
weight -110
|
|
fall 5
|
|
rise 2
|
|
}
|
|
{{ end }}
|
|
{{ if .HBInterface }}
|
|
vrrp_sync_group VG_1 {
|
|
group {
|
|
VI_1
|
|
VI_HB
|
|
}
|
|
}
|
|
{{ end }}
|
|
vrrp_instance VI_1 {
|
|
state {{ .State }}
|
|
interface {{ .Interface }}
|
|
virtual_router_id {{ .RouterID }}
|
|
priority {{ .Priority }}
|
|
advert_int 1
|
|
nopreempt
|
|
{{ if .SrcIP }} unicast_src_ip {{ .SrcIP }}
|
|
unicast_peer {
|
|
{{ .PeerIP }}
|
|
}
|
|
{{ end }} authentication {
|
|
auth_type PASS
|
|
auth_pass {{ .AuthPass }}
|
|
}
|
|
virtual_ipaddress {
|
|
{{ range .VIPs }} {{ .Address }}/{{ .Prefix }} dev {{ .Device }}
|
|
{{ end }} }
|
|
track_script {
|
|
chk_edgeguard
|
|
{{ if .GWCheckIP }} chk_gateway
|
|
{{ end }} }
|
|
notify_master "/usr/lib/edgeguard/keepalived-master.sh"
|
|
notify_backup "/usr/lib/edgeguard/keepalived-backup.sh"
|
|
notify_fault "/usr/lib/edgeguard/keepalived-backup.sh"
|
|
}
|
|
{{ if .HBInterface }}
|
|
vrrp_instance VI_HB {
|
|
state {{ .State }}
|
|
interface {{ .HBInterface }}
|
|
virtual_router_id {{ .HBRouterID }}
|
|
priority {{ .Priority }}
|
|
advert_int 1
|
|
nopreempt
|
|
{{ if .HBSrcIP }} unicast_src_ip {{ .HBSrcIP }}
|
|
unicast_peer {
|
|
{{ .HBPeerIP }}
|
|
}
|
|
{{ end }} authentication {
|
|
auth_type PASS
|
|
auth_pass {{ .AuthPass }}
|
|
}
|
|
}
|
|
{{ end }}
|