使用的是pluto,systemctl部署后可以看到ipsec服务(linux使用的是ip xfrm):
可以检查下配置是否正确
以上都正确的话,除了通过日志(journalctl -xefu ipsec或者
ipsec whack --status)确认下ipsec是否正常,还可以通过以下命令确认整个流程:
策略路由是否生效:
ip rule list
ip route list table中是否包含配置的私网网段
事实证明策略路由存在与否没有什么影响,
可能是因为ipsec是POSTROUTING规则,路由并不改变源和目的IP
查看ipsec中策略:
查看ipsec状态:
ipsec状态看起来没问题,抓包发现源IP变成了node的IP,k8s会设置SNAT,
怀疑是k8s的SNAT修改了源IP后,匹配不上ipsec policy,SNAT查看:
iptables -t nat -nL
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
KUBE-POSTROUTING all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes postrouting rules */
RETURN all -- 172.22.0.0/16 172.22.0.0/16 /* flanneld masq */
MASQUERADE all -- 172.22.0.0/16 !224.0.0.0/4 /* flanneld masq */
RETURN all -- !172.22.0.0/16 172.22.0.0/24 /* flanneld masq */
MASQUERADE all -- !172.22.0.0/16 172.22.0.0/16 /* flanneld masq */
Chain KUBE-POSTROUTING (1 references)
target prot opt source destination
RETURN all -- 0.0.0.0/0 0.0.0.0/0 mark match ! 0x4000/0x4000
MARK all -- 0.0.0.0/0 0.0.0.0/0 MARK xor 0x4000
MASQUERADE all -- 0.0.0.0/0 0.0.0.0/0 /* kubernetes service traffic requiring SNAT */
可以看到第一条规则是一个SNAT(MASQUERADE是SNAT的一种方式:从服务器的网卡上,自动获取当前ip地址来做NAT)
于是添加一条规则优先于SNAT:
这样流量可以经过iptables而不做SNAT,因为iptables的规则是:
至于为什么先处理snat再处理xfrm,是linux源码写死的。。。