我有一套专为网络监控、控制等设计的脚本。我在这些脚本中做的一件事是创建一个 iptables 链,例如iptables -N mychain
。然后,我根据需要将规则插入主表中,以便将数据包发送到我的自定义链,以便实现我希望它们在那里的任何目的。
我的问题是:我有一个脚本可以执行“刷新”操作 - 换句话说,它会删除所有规则并重新开始。如果出现任何奇怪的异常情况,它很有用。即使有某些东西在管理部分 iptables,人们通常仍会手动管理它。(这就是为什么我希望我的所有工作都在单独的表中完成。)
如果我想清除我的链条,这很容易:iptables -F mychain
。但我不知道如何做的是删除我可能创建的任何引用内置链(INPUT、OUTPUT 等)中的该链的规则
假设我的应用程序出现错误,或者用户在摆弄表格时弄乱了表格,它以某种方式将规则添加到 INPUT 链两次。现在数据包将通过链两次 - 被计数两次、路由两次,等等。
解决此问题的明显方法是遍历主链并删除任何跳转目标是我的自定义链的规则。但我不知道该怎么做。
以下是我们可以设置的最坏情况的示例:
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
我们假设一个不道德或不了解情况的管理员制定了最底下的三条规则。
所以现在,我可以发布iptables -D INPUT -j TEST
,我创建的规则就会消失。但是,其他规则不会被删除,因为使用时的参数-D
必须匹配。所以即使我努力删除自己的规则,数据包仍可能因为不同的原因多次出现在那里。
清除主链不一定合适。同样,在命令行上使用 iptables 很常见(我自己一直这样做),因此只需盲目清除每一个规则可以清除某些人出于正当理由添加的内容,即使它是一条临时规则。
显而易见的解决方案是以某种方式移除任何规则,其目标是TEST
链并删除这些规则。但是,我在 iptables 手册页中没有看到任何可以完成此操作的命令。
我能看到的最接近任何用户的东西是iptables -S
。我可以使用iptables -S
并创建一个解析器来解释输出,但这需要额外的工作。我只是想知道是否有更正确的方法以某种通配符方式删除规则。再次删除任何跳转目标是我想要的任何链的规则。
如果我想删除某个链,但它在其他地方有引用,那么也会出现类似的情况。我希望能够找出该引用的位置,并且很可能也会将其删除。
这可能吗?还是我最终必须编写一个解析器来解释输出iptables -S
?
答案1
这应该相当简单。使用 iptables-save 将当前规则集写入文件或标准输出,删除任何内容,-j YOURCHAIN
然后使用 iptables-restore 将结果加载回来
这很适合做管道
iptables-save | grep -v -- '-j YOURCHAIN' | iptables-restore
但是,我不确定同时运行保存和恢复是否可行。将保存与恢复分开会更安全。将会有一个小的关键区域,其中规则集的中间更新将会丢失。
答案2
我认为除了重新加载整个配置之外,没有其他简单的方法可以解决这个问题。
您或许应该考虑以这种方式在您的链中添加一个删除策略,至少如果您勤奋的话,它会导致更少的问题,甚至可能引发一些讨论。
从技术角度来看,如果您必须解析各种命令的输出,您可能会发现 --line-num 很有帮助,但请记住按相反的顺序(从高到低)删除,以便索引不会每次都改变。
答案3
如果你需要高级操作iptables
,一个优秀的python库http://ldx.github.io/python-iptables/可能值得一看。它为 提供了编程接口(读取和修改)netfilter
。与 的互操作性iptables
是通过使用iptables
C 库(libiptc
、libxtables
和iptables
扩展)实现的,而不是调用iptables
二进制文件并解析其输出。