iptables遍历和链策略,手动编辑

我喜欢手动编辑iptables文件,但是有一些让我感到困惑。

从我如何从手册中了解iptables,它从上到下遍历规则,如果不可能匹配,它将被logging并被底部的默认规则拒绝。

都好。

但是这些是什么意思:

*filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] <accept ssh, ssl, etc> <log all, deny all> 

顶部的链条具有默认策略“接受” – 这只是一种说法,我们接受数据包进入filter表,为以后的匹配? 对于我来说,在阅读手册之后,感觉好像它会接受一切,然后不读规则,因为默认情况下这些规则是如何工作的 – 如果有任何匹配,它将停止阅读规则,然后执行政策的行为。 这种行为的任何文件? 我找不到足够具体的东西。

我也看过这个, *filter表后面:

 *filter :RH-Firewall-1-INPUT - [0:0] 

这样就可以添加自己的连锁店,并将其他连锁店连接到这条连锁店:

 -A INPUT -j RH-Firewall-1-INPUT -A FORWARD -j RH-Firewall-1-INPUT 

但是这里的“ACCEPT”或“DROP”并没有被指定,而是有一个破折号( – )。

这使我更加困惑 – 它是如何工作的?

  1. 内置链上的策略决定了通过链中的所有规则而不匹配具有决定性目标的单个规则的数据包会发生什么情况。 在你上面的例子中,通过FORWARD链完全没有匹配任何规则的分组将被ACCEPT ,因为链的策略是ACCEPT

  2. 用户定义的链不能有策略。 通过一个用户定义的链,而不匹配一个规则与一个parsing目标的数据包返回到它们被发送到用户定义的链(“调用链”)的链上,在发送的那个他们在那里。

一个处理目标是处理一个数据包的目标。 例子包括DROPACCEPTMASQUERADE ; 非决定性目标包括LOG和空目标(具有没有目标的规则是合法的)。 当数据包与具有决定性目标的规则相匹配时,该数据包被认为被丢弃,并且不再发生规则处理。 当一个数据包匹配一个没有决定性目标的规则时,数据包处理将在下一个规则处继续。

这种关于目标匹配和处置的逻辑的一个重要推论就是第一方位匹配胜出 。 我们常常会在SF上看到有人提到的问题,例如,

 Chain INPUT (policy ACCEPT 210 packets, 22621 bytes) pkts bytes target prot opt in out source destination 3224K 1330M DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 

其中包含一个阻止访问Web服务器的规则( tcp dpt:80 )。 他们希望允许一个外部IP地址(比如1.2.3.4 )访问这个Web服务器,所以他们添加一个规则

 iptables -A INPUT -p tcp --dport 80 -s 1.2.3.4 -j ACCEPT 

他们最终得到这样一个链

 Chain INPUT (policy ACCEPT 210 packets, 22621 bytes) pkts bytes target prot opt in out source destination 3224K 1330M DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 0 0 ACCEPT tcp -- * * 1.2.3.4 0.0.0.0/0 tcp dpt:80 

正如你所看到的,数据包在最后一条规则是零 – 他们将永远是零 。 没有数据包可以匹配最后一条规则而没有匹配之前的规则,而且它之前的规则是DROP ,所以没有数据包会达到最后的规则。

正确处理这个问题的方法是确保您的例外来到您的规则之前 ,如下所示:

 Chain INPUT (policy ACCEPT 210 packets, 22621 bytes) pkts bytes target prot opt in out source destination 20 875 ACCEPT tcp -- * * 1.2.3.4 0.0.0.0/0 tcp dpt:80 3224K 1330M DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 

现在,首先处理exception接受,然后处理并丢弃不是来自特殊服务器的其他Web服务器数据包,最后链策略负责处理所有其他数据包并接受它们。