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 继续寻找下一条规则?但是我在手册页的任何地方都没有看到它,我错过了什么吗?
IPTables 链中有两种目标:终止目标和非终止目标。
ACCEPT
,REJECT
,DROP
是终止目标。它们终止当前 Netfilter 钩子中数据包的处理。MARK
,LOG
以及许多其他的非终止目标。他们根据数据包创建一些操作,然后继续执行下一个规则。在您的示例中,
-j MARK
是链中的第一条规则。它标记数据包,然后移动到下一个规则,该规则丢弃数据包。如果你想标记并接受数据包,那么你需要类似的东西:
此外,不建议在
mangle
表中丢弃数据包。规则按顺序处理。
通过
-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
.