我喜欢手动编辑 iptables 文件,但有些东西让我有点困惑。
根据我从手册中理解的 iptables,它从上到下遍历规则,如果没有匹配项,它将被记录并被底部的默认规则拒绝。
都好。
但这些意味着什么:
*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
。用户定义的链不能有策略。如果数据包一路通过用户定义的链,而没有匹配具有决定性目标的规则,则它们将返回到发送它们到用户定义链的链(“调用链”),其规则位于发送它们到用户定义链的规则之后。
A决定性的目标是处理数据包的目标;示例包括DROP
、ACCEPT
和MASQUERADE
;非处理性目标包括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
现在,首先处理异常接受,然后处理和丢弃不是来自异常服务器的其他 Web 服务器数据包,最后链策略处理所有其他数据包并接受它们。