这是我用来作为参考的:https://unix.stackexchange.com/a/145933
所以如果我这样做:
iptables -I INPUT -p tcp -s MY IP --dport 21 -j ACCEPT
iptables -I INPUT -p tcp -s 0.0.0.0/0 --dport 21 -j DROP
我知道只能MY IP
连接到端口 21。但是有没有办法添加另一个接受的 IP?
我尝试过这样做:
iptables -I INPUT -p tcp -s MY OTHER IP --dport 21 -j ACCEPT
但它仍然被阻止,但我认为这是因为 DROP 是之前的。我可以在不删除 DROP 规则的情况下追加吗?
答案1
选项不-I
iptables
附加(即-A
),它用于插入一个新的规则。不同之处在于,-A
添加了新规则结尾链的,而默认情况下,-I
在链的开始的链条。
由于链是按顺序读取的,因此在规则-j ACCEPT
之前处理您的规则非常重要-j DROP
。
有几种方法可以做到这一点:
- 使用
-A
而不是-I
添加您的规则。这将确保规则添加在最后,并且如果您不重新排序命令,它们将按正确的顺序排列。我会推荐这个而不是其他两个选项。 - 继续使用
-I
,但交换您的规则。这样,-j ACCEPT
规则将在规则之前被处理-j DROP
。 -I
可选地接受一个额外的参数,即链中插入新规则的位置,它应该是一个数字。由于您添加的-j ACCEPT
规则不带任何参数,因此它成为第一个规则(即第 1 行);因此,在第 2 行添加第二条规则:iptables -I INPUT 2 -p tcp -s 0.0.0.0/0 --dport 21 `-j DROP`
话虽如此,如果您要拥有许多像第一个规则一样的规则,那么出于性能原因,最好创建一个自定义链:
iptables -N check-ftp
iptables -A check-ftp -s IP1 -j ACCEPT
iptables -A check-ftp -s IP2 -j ACCEPT
[...]
iptables -A check-ftp -j DROP
iptables -A INPUT -p tcp --dport 21 -j check-ftp
这会为您的链中的“FTP 连接”创建一条规则。这样,如果传入的网络数据包不是 FTP 数据包,则 netfilter 代码将不会遍历(长)规则列表来确定是否允许此特定数据包,而是立即转到下一个规则。如果它是一个 FTP 数据包,然后将要过一遍长长的清单。