最近在整 Kolla 的多机部署,没有物理环境还是在虚拟机上搞。不过今天被一个 keepalived 的问题卡了将近一天的时间。倒也不是啥大问题,还是栽到了自己挖的坑里。
问题¶
先说一下自己的环境,我使用了三台 kvm 虚拟机,每台两张网卡,一个用于上外网(eth0 10.2.0.0/24
),一个用于 neutron 的 tenant 网络使用(eth1)。问题就出在 eth0 上面。eth0 是桥在了我手动创建的一个桥上 (br0), 为了上外网,我打开了 ip_forward
, 并加了一条 iptables 转发规则:
iptables -t nat -A POSTROUTING -s 10.2.0.0/24 ! -d 10.2.0.0/24 -j MASQUERAE
一般情况下是没有问题的,但是加了 keepalived
就完了。vip 跑到了所有的机器上,感觉就是没有通讯上,或是选举有问题。重新核对了半天配置没有发现问题。由于 Kolla 里是用 docker 跑的 keepalived ,为了排除是 Docker 本身有问题,我还在虚拟机的系统上部署了 keepalived 的,还是同样的问题。
原因¶
最后在一次偶然的抓包中发现,所有机器上抓到的 vrrp 的包源地址居然都是网关(10.2.0.1
)发出来的,这还能不出问题?
查了查 vrrp 包,原来是在四层协议上,和 tcp/udp 是并列的。再看一眼自己的 iptables , 就知道是怎么回事了。后来把 iptables 改的明确了一些, 只 SNAT tcp,udp及icmp的协议,问题终于解决了。
-A POSTROUTING -s 10.2.0.0/24 ! -d 10.2.0.0/24 -p tcp -j MASQUERADE
-A POSTROUTING -s 10.2.0.0/24 ! -d 10.2.0.0/24 -p udp -j MASQUERADE
-A POSTROUTING -s 10.2.0.0/24 ! -d 10.2.0.0/24 -p icmp -j MASQUERADE
教训¶
- tcpdump 还是很有用的东西
- 四层上的协议除了 tcp/udp 还是有很多的 1
REF¶
原始链接:http://xcodest.me/iptables-forward-the-vrrp-packets-issue.html
许可协议:"署名-非商用-相同方式共享 3.0" 转载请保留原文链接及作者。
Comments