我正在研究 Kubernetes 中 iptables 如何将数据包从 pod 传输到服务。对于出站数据包,它首先经过 OUTPUT 链(在我的情况下是 nat 然后是 filter)。部分结果iptables-save
如下:
# Generated by iptables-save v1.4.21 on
*nat
-A KUBE-SERVICES ...
# other rules in nat table
*filter
:OUTPUT ACCEPT [9:1136]
:KUBE-FIREWALL - [0:0] # it seems there's no failures
:KUBE-SERVICES - [0:0]
-A OUTPUT -m conntrack --ctstate NEW -m comment --comment "kubernetes service portals" -j KUBE-SERVICES
-A OUTPUT -j KUBE-FIREWALL
-A KUBE-FIREWALL -m comment --comment "kubernetes firewall for dropping marked packets" -m mark --mark 0x8000/0x8000 -j DROP
# no KUBE-SERVICES chain in filter table
# no rules in other tables
我们可以从 看到-A OUTPUT -m conntrack
,它跳转到,但我在表中KUBE-SERVICES
找不到链。如果它不存在会发生什么?KUBE-SERVICES
filter
KUBE-SERVICES
桌子上有一条链nat
,但我猜它不会nat
从filter
桌子走到桌子?
答案1
我认为您的问题根源在于iptables-save
输出不包括自定义链中的计数器。
只有每个表中的默认链(请参阅man 8 iptables
每个表中的链)才会保存数据包/字节计数器。
所有其他链始终会保存[0:0]
值。
您可能希望添加iptables-save -c
标志以包含所有规则的数据包/流量计数器,以查看数据包如何遍历您的链和规则。这也应该表明它们的命运在哪里决定。
因为据我所知,目标的通常行为-j
是,当目标链中的规则已被处理但未产生决定性匹配时,处理将返回到原始链,并处理那里的下一个规则。所以我怀疑当自定义目标为空时也会发生这种情况,处理将立即继续处理链中的下一个规则。
答案2
:KUBE-SERVICES - [0:0]
KUBE-SERVICES
line 定义表中的链filter
。它没有规则并且为空,但它仍然是定义的。