我正在尝试使用带有单播vrrp消息的dockerized keepalived(osixia / keepalived:1.4.5)在两个运行于不同子网上的VM之间创建虚拟ip。
不幸的是,由于数据包是从远程子网路由而来,因此由于ttl值而导致vrrp消息被丢弃(来自VM1的日志片段):
Mon Jul 2 12:41:56 2018: (VI_1): invalid ttl. 252 and expect 255
Mon Jul 2 12:41:56 2018: bogus VRRP packet received on ens160 !!!
Mon Jul 2 12:41:56 2018: VRRP_Instance(VI_1) Dropping received VRRP packet...
如果我正确理解了此变更日志说明,则应该从1.2.10版本开始解决该问题(来源:http://www.keepalived.org/changelog.html):
vrrp:禁用单播用例的TTL完整性检查。为了防止任何数据包注入,VRRP通过IP标头TTL提供完整性检查。此TTL务必等于255,这意味着发送方和接收方都连接在同一以太网段上。现在,由于单播扩展,必须禁用此保护,因为VRRP广告将大部分遍历不同的网段。 !!!警告 !!!当在单播用例中使用VRRP来防止任何数据包注入时,最佳实践是使用IPSEC-AH auth方法,否则您将面临潜在的攻击者!
这真的可以直接使用吗?还是应该以某种方式配置ttl的健全性检查?
我的设置
VM1 ip:172.31.245.109
VM2 ip:172.31.205.162
虚拟ip:172.31.245.10
VM1 keepalived.conf:
vrrp_script chk_live {
script "curl 172.31.245.109:8080"
interval 2 # check every 2 seconds
weight 2 # add 2 points of prio if OK
}
vrrp_instance VI_1 {
interface ens160
state MASTER
virtual_router_id 51
priority 101 # 101 on master, 100 on backup
virtual_ipaddress {
172.31.245.10
}
track_script {
chk_live
}
unicast_peer {
172.31.205.162
}
}
VM2 keepalived.conf:
vrrp_script chk_live {
script "curl 172.31.205.162:8080"
interval 2 # check every 2 seconds
weight 2 # add 2 points of prio if OK
}
vrrp_instance VI_1 {
interface eth0
state MASTER
virtual_router_id 51
priority 100 # 101 on master, 100 on backup
virtual_ipaddress {
172.31.245.10
}
track_script {
chk_live
}
unicast_peer {
172.31.245.109
}
}