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 链中有两种目标:终止目标和非终止目标。
ACCEPT
、REJECT
、DROP
是终止目标。它们终止当前 Netfilter 钩子中数据包的处理。
MARK
,LOG
还有许多其他是非终止目标。它们根据数据包创建一些操作,然后继续执行下一个规则。
在您的示例中,-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
。