如果规则与数据包匹配,并且有-j DROP
,我知道数据包将停止遍历其余规则。但是我不明白如果数据包与带有 -j ACCEPT 的规则匹配会发生什么?它会再次停止遍历规则还是会尝试匹配其他规则?换句话说,如果数据包有许多规则要匹配会发生什么。
答案1
第一个匹配获胜,如果目标是“终止”目标,则处理停止;这些目标包括DROP
、、ACCEPT
等等DNAT
。它们是决定数据包最终处置的目标;没有必要说它-j REJECT
是否可以在三行之后用覆盖-j OH-SORRY-I-DIDNT-MEAN-IT
。
第一个匹配成功,然后处理不是如果目标是“非终止的”,则停止;这些包括LOG
、ULOG
和将数据包发送到用户定义的链。在后一种情况下,处理将继续通过该链中的规则,如果没有与终止目标匹配,则数据包“掉出链的底部”,并返回到将其发送到用户定义的链之后的调用链中的规则。
明白了吗?第一场比赛获胜总是适用,这就是为什么规则的顺序很重要。
答案2
一般来说,iptables 目标有 2 种:
- 非终止目标(例如 LOG、ULOG、TOS、MARK、CONNMARK、NOTRACK、CONNTRACK)
- 终止目标(例如 ACCEPT、DROP、REJECT)
非终止意味着在应用了某个操作之后,数据包将继续执行下一个规则在里面同一条链/表
终止表示在应用了某个操作之后,处理结束在那桌子如果数据包还存在,那么数据包就会按照netfilter的流向继续进入下一个表(见下文)。当然,在REJECT和DROP的情况下,数据包已经不存在了,自然就不会再处理了。
这维基百科关于 iptables 的文章提供数据包将遇到的表/链的序列图。