如何删除指向iptables链中的所有规则?

我有一套我为networking监控,控制等devise的脚本。 我在这些脚本中做的一件事就是创build一个iptables链,比如iptables -N mychain 。 然后,我将规则插入到主表中,以便无论我希望他们在那里拥有什么目的,都可以将数据包送到我的自定义链中。

我的问题是:我有一个脚本,执行“刷新” – 换句话说,它删除所有规则,并重新开始。 如果出现任何奇怪的exception情况,这是有用的。 即使有pipe理部分的东西,人们通常仍然会手动pipe理iptables。 (这就是为什么我要把所有的工作都放在一个单独的桌子上。)

如果我想清除我的链,那很简单: iptables -F mychain 。 但是我知道如何去做的是删除任何我可能创build的链接返回链接(INPUT,OUTPUT等等)的规则。

让我们假设我的应用程序中有一个错误,或者是一个用户摆弄,最后搞乱了表格,并且不知何故将规则添加到了INPUT链中两次。 现在数据包会经过两次链 – 被算两次,被路由两次,不pipe怎样。

显而易见的解决scheme是通过主链,并删除任何跳转目标是我的自定义链的规则。 但我不知道该怎么做。

以下是我们可以设置的最坏情况的一个例子:

 iptables -N TEST iptables -A INPUT -j TEST iptables -I INPUT 1 -p tcp --dport 1234 -j TEST iptables -I INPUT 1 -p tcp --dport 1234 -j TEST # again, for doubling error iptables -I INPUT -p icmp -j TEST 

让我们假设一个不择手段或不知情的pipe理者创造了三条最底层的规则。

所以现在,我可以发出iptables -D INPUT -j TEST ,我创build的规则将会消失。 但是,由于使用-D必须匹配的参数,这些其他规则不会被删除。 所以,即使我认真的去掉自己的规则,包仍然会因为不同的原因不止一次地结束。

冲洗主链不一定合适。 同样,在命令行中使用iptables也很常见(我自己一直都是这样做的),所以只要盲目地清除每个规则,就可以清除某个人为了一个好理由而添加的东西,即使这是暂时的规则。

明显的解决办法是以某种方式删除目标是TEST链的任何规则,并删除这些规则。 但是我没有看到任何可以完成这个任务的iptables手册页。

我可以看到的最接近的可能是任何用户是iptables -S 。 我可以使用iptables -S并创build一个parsing器来解释输出,但这是一些额外的工作。 我只是想知道是否有一种更正确的方式来删除某些通配符的规则。 同样,删除任何跳转目标是我想要的链的规则。

如果我有一个我想摆脱的链条,可能会发生类似的情况,但是在其他地方有一个参考。 我希望能够找出引用的位置,最有可能的是删除它。

这可能吗? 或者我最终不得不写一个parsing器来解释iptables -S输出?

这应该相当简单。 使用iptables-save将当前规则集写入文件或stdout,使用-j YOURCHAIN删除任何内容,并使用iptables-restore加载结果

这很诱人做一个pipe道

 iptables-save | grep -v -- '-j YOURCHAIN' | iptables-restore 

但是,我不确定如果同时运行保存和还原将工作正常。 将保存与恢复分开将是更安全的。 会有一个小规模的关键区域,对规则集的干预更新将会丢失。

我不认为有一个解决这个问题的方法比重新加载整个configuration还要简单。

你也许应该考虑给你的链条添加一个drop策略,至less如果你勤奋的话,会导致问题不那么明显,也许会引发一些讨论。

从技术angular度来看,如果您将不得不parsing各种命令的输出,可能会发现–line-num有帮助,但请记得按相反顺序(从高到低)删除,以便索引不会每次都改变。

如果你需要在iptables上进行高级操作,一个优秀的python库http://ldx.github.io/python-iptables/可能值得一看。 它为netfilter提供了编程接口(包括读取和修改)。 与iptables互操作性是通过使用iptables C库( libiptclibxtablesiptables扩展),而不是调用iptables二进制文件并parsing其输出来实现的。