我正在尝试创建一个脚本,该脚本将在某些条件下禁止某些 IP 地址,并且我需要一种方法来在每个午夜“清除”这些块,以便重新开始。我已经成功创建了阻塞部分。
我现在正在努力立即删除所有 INPUT DROP 规则,但以下命令返回“错误规则”错误。
iptables -D INPUT -j DROP
答案1
这是解决该问题的方法,因此该问题根本不存在。而不是在过滤器/输入中添加删除规则:
iptables -A INPUT -s 192.0.2.2 -j DROP
iptables -A INPUT -s 198.51.100.10 -i eth0 -j DROP
...
创建专用的用户链来帮助管理这些丢弃规则。执行此操作一次:
iptables -N onlydrops
iptables -A INPUT -j onlydrops
然后在需要的时候:
iptables -A onlydrops -s 192.0.2.2 -j DROP
iptables -A onlydrops -s 198.51.100.10 -i eth0 -j DROP
...
完成此操作后,可以通过一个命令刷新所有用户链内容,而不会影响 INPUT 中的其余规则集。在午夜,人们可以运行:
iptables -F onlydrops
像往常一样,顺序确实很重要。以上只是根据用例和现有规则进行定制的示例。
答案2
我对 iptables 的理解是,您不能通过一次调用“-D”命令来删除一组规则(例如所有 DROP 规则)。
您可以使用 Flush (-F) 删除链中的所有规则。
您可以使用删除 (-D) 从链中删除单个规则。
以下问题和答案表明,当您的规则条目相同时,这甚至是一个问题:
https://stackoverflow.com/questions/25055121/can-i-remove-multiple-matching-rules-with-the-iptables-delete-command
在我看来,iptabels 的手册页中提到
从所选链中删除一条或多条规则
具有误导性。我不知道可以从一次调用中删除多个规则的情况iptables -D
。然而,也许在某些情况下我不知道这种情况是可能的。
更新:参见AB的评论,其中指出DNS可以通过“-D”参数删除多个规则。这是一个 DNS 名称解析为多个 IP 的情况。
答案3
如果您的 iptables 规则的定义中没有换行符,您应该能够执行以下操作:
iptables-save -t filter | grep -vxe '-A INPUT .*-j DROP' | iptables-restore
删除输出中以 开头-A INPUT
和结尾的规则。-j DROP
iptables-save
1 但我发现即使他们这样做也iptables-restore
无法处理iptables-save
输出,我认为这是一个错误。