使用所有规则删除iptables链


31

我有一个附加许多规则的链,例如:

> :i_XXXXX_i - [0:0]
> -A INPUT -s 282.202.203.83/32 -j i_XXXXX_i 
> -A INPUT -s 222.202.62.253/32 -j i_XXXXX_i 
> -A INPUT -s 222.202.60.62/32 -j i_XXXXX_i 
> -A INPUT -s 224.93.27.235/32 -j i_XXXXX_i 
> -A OUTPUT -d 282.202.203.83/32 -j i_XXXXX_i 
> -A OUTPUT -d 222.202.62.253/32 -j i_XXXXX_i 
> -A OUTPUT -d 222.202.60.62/32 -j i_XXXXX_i 
> -A OUTPUT -d 224.93.27.235/32 -j i_XXXXX_i

当我尝试使用以下方法删除此链条时:

iptables -X XXXX

但是出现了类似(尝试过iptables -F XXXXX)的错误:

iptables:链接太多。

有没有一种简单的方法可以通过一次命令删除链?


2
尝试刷新之前,我还没有见过像iptables barf这样的工具。
汤姆·奥康纳

只是好奇... 怎么很多规则是“多”?
Ladadadada'4

1
2多很多:)如果我尝试首先删除规则,它将喜欢多次输入:iptables -D OUTPUT -d XXX / 32 -j i_XXXXX_i
timy 2012年

3
试试这个:iptables-save | grep -v i_XXXXX_i | iptables-restore
Steven

@StevenMonday为什么不写为答案,这是最有用的答案(也可以通过文件和编辑文件来完成)。唯一不能删除的是完整的表格(无论如何都是“原始”)
nhed 2014年

Answers:


38

当带有-j CHAINTODELETE的规则引用链时,您将无法删除它们。找出引用链(链接)的内容,然后将其删除。同样,冲洗然后杀死。

-F,--flush [链]

冲洗选定的链(如果没有给出表中的所有链)。这等效于删除所有规则。

-X,--delete-chain [链]

删除指定的可选用户定义链。 不得引用该链。 如果存在,则必须删除或替换引用规则, 然后才能删除链。链必须为空,即不包含任何规则。如果未提供任何参数,它将尝试删除表中的每个非内置链。


我只想找到一种直接删除链的方法(有很多“ -j CHAINTODELETE”引用规则),但是从您的答案看来,这似乎是不可能的:(
timy 2012年

1
@timy StevenMonday的评论将单次删除所有对该链的引用。也许不是很理想,但很胆小。
杰夫·费兰德

12

这可能是题外话,但这是我找到这篇文章后所做的!对于某些用例,iptables -D选项可能有用。因为它允许您清除以-A编程方式添加的引用规则(如果您确切地知道如何添加它们)。

例如

    iptables -N MYCHAIN
    iptables -A INPUT -i interface -j MYCHAIN
    iptables -A MYCHAIN -j ACCEPT

可以用

   iptables -D INPUT -i interface -j MYCHAIN
   iptables --flush MYCHAIN
   iptables -X MYCHAIN

8

您需要两个步骤,但这仅需一个命令即可完成。

创建一个文件,并将其放入其中。

# Empty the entire filter table
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT

将文件另存为“清除所有规则”。现在,执行以下命令:

iptables-restore < clear-all-rules

现在,您只需一个命令即可随时清除它。


1
+1这实际上是从干净的固件配置开始的最快方法。
dr01 2016年

6

这是一个替代方案。它涉及三个命令,而不是一个,但是运气不错,它应该可以工作。

将您的iptables规则集转储到文件中:

iptables-save > /tmp/iptables.txt

删除对违规链的所有使用(和引用):

sed -i '/i_XXXXX_i/d' /tmp/iptables.txt

然后重新加载规则集:

iptables-restore < /tmp/iptables.txt && rm /tmp/iptables.txt

0

遵循这些原则,可以将所有要素全部放在一行中,而不会以任何方式降低iptables。

for chain in `iptables -L |grep i_XXXXX_i|awk '{ print $2 }'`; do iptables -X $chain; done

0

在iptables的man文件中,有一个选项 -S

S,--list-rules [链]打印选定链中的所有规则。如果未选择任何链,则所有链都将像iptables-save一样打印。与其他所有iptables命令一样,它适用于指定的表(默认为filter)。

通过使用iptables -S | grep <CHAINNAMEHERE>。举些例子:

root @ root:〜#iptables -S | grep流量日志

-N交通日志

-A转发-i eth0 -j交通

然后,您可以查看哪些规则阻止从表中删除链。仔细阅读每个规则(使用除外,iptables -N <CHAINNAMEHERE>然后使用-D选项删除该规则

-D,--delete chain rulenum从选定的链中删除一个或多个规则。此命令有两种版本:可以将规则指定为链中的数字(第一个规则从1开始)或匹配的规则。

例如iptables -D FORWARD -i eth0 -j TRAFFICLOG。删除链条的每个规则后,请使用-F选项冲洗链条iptables -F <CHAINNAMEHERE>

-F,--flush [chain]刷新选定的链(如果没有给出表中的所有链)。这等效于删除所有规则。

然后使用-X选项删除您的链,iptables -X <CHAINNAMEHERE>

-X,--delete-chain [链]删除指定的可选用户定义链。不得引用该链。如果存在,则必须删除或替换引用规则,然后才能删除链。链必须为空,即不包含任何规则。如果未提供任何参数,它将尝试删除表中的每个非内置链。

iptables是一个复杂的工具集,因此需要一个理想的教程。您可以在www.iptables.info尝试一下


0

这将吐出链并删除它们

for i in $(iptables -S | awk '{print $2}' | uniq ); do iptables -F $i && iptables -Z $i && iptables -X $i  ; done

0

我发现可以通过编辑/etc/iptables/rules.v4中的规则文件来删除规则和链。如果删除此文件中不需要的链,然后重新加载iptables,则在执行iptables -L时不再应该看到该链。


该文件仅在某些Linux发行版中存在,然后仅在某些Linux发行的某些版本中存在。
迈克尔·汉普顿
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.