我有一套我为网络监控、控制等设计的脚本。我在这些脚本中做的一件事是创建一个 iptables 链,如iptables -N mychain. 然后我根据需要将规则插入到主表中,以便将数据包放入我的自定义链,无论我希望它们在那里有什么目的。
我的问题是:我有一个执行“刷新”的脚本 - 换句话说,它删除所有规则并重新开始。它在出现任何奇怪的异常情况时很有用。即使有人管理它的一部分,人们仍然经常手动管理 iptables。(这就是为什么我希望我所有的工作都在一个单独的表中完成。)
如果我想清楚了我的锁链,很简单:iptables -F mychain。但是我不知道该怎么做是删除我可能创建的任何规则,这些规则将引用链接回内置链(输入、输出等)
假设我的应用程序中存在错误,或者用户在摆弄表格并最终弄乱了表格,并且它以某种方式将规则添加到 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
Run Code Online (Sandbox Code Playgroud)
让我们假设一个不道德或不知情的管理员创建了三个最底层的规则。
所以现在,我可以发布iptables -D INPUT -j TEST并且我创建的规则将消失。但是,这些其他规则不会被删除,因为使用时的参数-D必须匹配。因此,即使我努力删除自己的规则,由于不同的原因,数据包仍然可能不止一次地出现在那里。
刷新主链不一定合适。同样,在命令行中使用 iptables 是很常见的(我一直都是自己做的)所以只是盲目地清除每条规则就可以清除某人有充分理由添加的内容,即使它是一个临时规则。
显而易见的解决方案是以某种方式删除目标是链的任何规则TEST并删除这些规则。但是,我在 iptables 手册页中没有看到任何可以完成此操作的命令。
我能看到的最接近任何用户的东西是iptables -S. 我可以使用iptables -S并创建一个解析器来解释输出,但这是一些额外的工作。我只是想知道是否有更正确的方法来以某种通配符方式删除规则。同样,删除任何跳转目标是我想要的任何链的规则。
如果我有一个想要删除的链,但它在其他地方有一个引用,也会发生类似的情况。我希望能够找出该引用的位置,并且很可能也将其删除。
这可能吗?或者我最终不得不编写一个解析器来解释iptables -S输出?
这应该相当简单。使用 iptables-save 将当前规则集写入文件或标准输出,删除任何内容-j YOURCHAIN并使用 iptables-restore 加载结果
这是一个很诱人的管道
iptables-save | grep -v -- '-j YOURCHAIN' | iptables-restore
Run Code Online (Sandbox Code Playgroud)
但是,我不确定同时运行 save 和 restore 是否能正常工作。将保存与恢复分开会更安全。将有一个小的关键区域,在该区域中将丢失对规则集的干预更新。
| 归档时间: |
|
| 查看次数: |
4520 次 |
| 最近记录: |