当 iptables 表中没有自定义跳转链时会发生什么?

当 iptables 表中没有自定义跳转链时会发生什么?

我正在研究 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-SERVICESfilter

KUBE-SERVICES桌子上有一条链nat,但我猜它不会natfilter桌子走到桌子?

答案1

我认为您的问题根源在于iptables-save输出不包括自定义链中的计数器。

只有每个表中的默认链(请参阅man 8 iptables每个表中的链)才会保存数据包/字节计数器。

所有其他链始终会保存[0:0]值。

您可能希望添加iptables-save -c标志以包含所有规则的数据包/流量计数器,以查看数据包如何遍历您的链和规则。这也应该表明它们的命运在哪里决定。

因为据我所知,目标的通常行为-j是,当目标链中的规则已被处理但未产生决定性匹配时,处理将返回到原始链,并处理那里的下一个规则。所以我怀疑当自定义目标为空时也会发生这种情况,处理将立即继续处理链中的下一个规则。

答案2

:KUBE-SERVICES - [0:0]KUBE-SERVICESline 定义表中的链filter。它没有规则并且为空,但它仍然是定义的。

相关内容