我可能不明白这应该如何工作,但我不明白为什么具有这个基本 vrrp_instance 的 BACKUP 系统会立即转换为主系统并且似乎从不尊重优先级。
当两者都健康且在线时,为什么虚拟 IP 地址不会从备份系统中删除?
看起来两个系统都在广播 vrrp 通告。从tcpdump
备份系统来看:
betaproxyslc01.fakecorp.com > vrrp.mcast.net: vrrp betaproxyslc01.fakecorp.com > vrrp.mcast.net: VRRPv2, 广告,51, 优先 150, authtype simple, intvl 1s, 长度 20, >addrs: virtual-app.fakecorp.com验证“密码” 15:52:24.541637 IP(tos 0xc0、ttl 255、id 1611、偏移量 0、标志[无]、proto VRRP(112)、长度 40)
betaproxyslc02.fakecorp.com > vrrp.mcast.net: vrrp betaproxyslc02.fakecorp.com > vrrp.mcast.net: VRRPv2, 广告,51, 优先 100,authtype simple,intvl 1s,长度20,>addrs:virtual-app.fakecorp.com验证“密码” 15:52:25.410073 IP(tos 0xc0、ttl 255、id 1779、偏移量 0、标志[无]、proto VRRP(112)、长度 40)
但虚拟 IP 地址会通过命令显示在两个主机上ip addr
。
配置如下:
global_defs {
notification_email {
[email protected]
}
notification_email_from [email protected]
smtp_server mysmtpserver.fakecorp.com
smtp_connect_timeout 30
router_id BETAPROXYSLC01
}
vrrp_script chk_haproxy{
script "killall -0 haproxy"
interval 2 # check every 2 seconds
weight 2 # add 2 points of prio if OK
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 150
advert_int 1
notify /usr/local/bin/notify.sh
authentication {
auth_type PASS
auth_pass keep0ut!
}
virtual_ipaddress {
10.10.0.40
}
track_script{
chk_haproxy
}
}
在BACKUP服务器上,router_id不同,状态为BACKUP,优先级为100。其他设置相同。
这是在 CentOS 7 上安装的,带有 Keepalived v1.2.10(2014 年 6 月 10 日),Hyper-V 客户虚拟机,带有 3.10.0-123.8.1.el7.x86_64 内核。
答案1
路由器之间的 VRRP 通信使用多播 IP 地址 224.0.0.18 [1]和 IP 协议号 112 [2]。
因此,您只需允许具有这些特定参数的传入和传出流量,VRRP 即可正常工作。通常提到的防火墙规则是多余的,并且不必要地广泛制定。
我建议您使用这些防火墙规则:
firewall-cmd --direct --permanent --add-rule ipv4 filter INPUT 0 --in-interface eth0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --direct --permanent --add-rule ipv4 filter OUTPUT 0 --out-interface eth0 --destination 224.0.0.18 --protocol vrrp -j ACCEPT
firewall-cmd --reload
[1]https://www.rfc-editor.org/rfc/rfc5798#section-5.1.1.2
[2]https://www.rfc-editor.org/rfc/rfc5798#section-5.1.1.4
答案2
参考末尾的防火墙信息这一页我可以通过以下方式打开防火墙来使其正常工作:
firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -i eth0 -d 224.0.0.0/8 -j ACCEPT
firewall-cmd --direct --perm --add-rule ipv4 filter INPUT 0 -i eth0 -d 224.0.0.0/8 -j ACCEPT
firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -p vrrp -i eth0 -j ACCEPT
firewall-cmd --direct --perm --add-rule ipv4 filter INPUT 0 -p vrrp -i eth0 -j ACCEPT
firewall-cmd --direct --add-rule ipv4 filter OUTPUT 0 -p vrrp -o eth0 -j ACCEPT
firewall-cmd --direct --perm --add-rule ipv4 filter OUTPUT 0 -p vrrp -o eth0 -j ACCEPT
似乎只有前两个选项是必要的。一旦我将规则设置为接受到多播地址的流量,备份系统就会注意到 vrrp 流量,恢复到备份模式并撤回 VIP。我想让我感到困惑的是,我可以在两个系统上使用 tcpdump 看到来自两个系统的多播流量。