![iptables 策略如何工作?](https://linux22.com/image/648946/iptables%20%E7%AD%96%E7%95%A5%E5%A6%82%E4%BD%95%E5%B7%A5%E4%BD%9C%EF%BC%9F.png)
我添加了一些基本规则:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
然后,使用以下命令关闭所有其他端口:
iptables -A INPUT -j DROP
而且它运行完美,我已用以下方式测试过:
% telnet x.x.x.x 81
Trying x.x.x.x...
telnet: connect to address x.x.x.x: Operation timed out
telnet: Unable to connect to remote host
但是当我列出规则时,我看到policy ACCEPT
:
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
ACCEPT tcp -- anywhere anywhere tcp dpt:http
DROP all -- anywhere anywhere
我知道如何改变它,用iptables -P INPUT DROP
,然后它变成:
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
ACCEPT tcp -- anywhere anywhere tcp dpt:http
DROP all -- anywhere anywhere
但我不明白其中的区别,因为它和以前一样。我读过这文章建议将策略更改为 DROP,但我为什么要这样做?上面的 iptables 有什么不同?
答案1
iptables DROP 策略相当于iptables -A INPUT -j DROP
链末端的(DROP 规则)。但是这个规则必须留在链条的末端,它之后的任何规则都不会被任何数据包触碰。
如果您使用 DROP 规则,则不能再使用iptables -A
(附加),您只能使用iptables -I nr
(插入,nr 是最后一条规则的编号)并在最后一条规则之前插入规则。并且要使此插入起作用,您必须知道最后一条规则的规则编号,这当然会发生变化,因此编写脚本变得更加困难。您可以使用 DROP 策略来避免一些困难。
最后,我认为,如果我从一开始就知道如何处理不符合任何规则的数据包,那么它会使整体更具可读性。
对此还有其他想法吗?