为什么使用扩展目标时 iptables 会继续寻找下一个规则?

为什么使用扩展目标时 iptables 会继续寻找下一个规则?

iptables 的手册页说,如果一条规则匹配,那么下一条规则由目标的值指定。

如果我有两个这样的规则:

iptables -t mangle -I FORWARD -s 192.168.1.10 -j DROP
iptables -t mangle -I FORWARD -s 192.168.1.10 -j MARK --set-mark

我以为由于 MARK 规则首先匹配并指定最终目标,所以 DROP 规则永远不会被参考。但实际上,它被参考了,数据包被丢弃了。

然而,如果规则

iptables -t mangle -I FORWARD -s 192.168.1.10 -j DROP
iptables -t mangle -I FORWARD -s 192.168.1.10 -j ACCEPT

然后,DROP 规则就永远不会被查阅,因为 ACCEPT 规则使其短路了。

是不是只有 ACCEPT、DROP 等特殊目标才能阻止 iptables 继续寻找下一个规则?但我在手册页中没有看到任何提及,我是不是错过了什么?

答案1

IPTables 链中有两种目标:终止目标和非终止目标。

ACCEPTREJECTDROP是终止目标。它们终止当前 Netfilter 钩子中数据包的处理。

MARKLOG还有许多其他是非终止目标。它们根据数据包创建一些操作,然后继续执行下一个规则。

在您的示例中,-j MARK是链中的第一个规则。它标记数据包,然后移至下一个规则,该规则会丢弃该数据包。

如果您想标记并接受数据包,那么您需要类似以下内容:

iptables -t mangle -A FORWARD -s 192.168.1.10 -j MARK --set-mark 0x1
iptables -t mangle -A FORWARD -s 192.168.1.10 -m mark ! --mark 0x1 -j DROP

此外,不建议删除mangle表中的数据包。

答案2

规则按顺序处理。

通过在添加规则时使用-I标志,您实际上是将每个新规则插入为链中的第一个规则,并按照处理顺序将所有现有规则向下推 1 个位置。

因此,您使用 -I 添加的最后一条规则将被首先评估。

通常,为了添加规则并确保它们以更直观的顺序进行处理,大多数脚本和人员使用标志-A将每个新规则作为最后一条规则附加到所有现有规则之后。

用于[sudo] iptables -L -v -n按内核评估的顺序显示活动规则(尽管有些人iptables-save更喜欢这样)。通常在讨论配置时,使用该--line-numbers选项对行进行编号也很有用。引用规则 #X 会使讨论它们变得更容易一些。
笔记:NAT 规则包含在iptables-save输出中,但必须通过添加选项-t nat即单独列出[sudo] iptables -L -v -n -t nat --line-numbers

相关内容