当前位置:  开发笔记 > 运维 > 正文

如何以编程方式动态管理iptables规则?

如何解决《如何以编程方式动态管理iptables规则?》经验,为你挑选了3个好方法。

我需要查询现有规则,以及能够轻松添加和删除规则.我没有找到任何API来做这件事.有什么东西我不见了吗?

我最接近解决方案的是使用iptables-save | iptables-xml查询和手动调用iptables命令本身来添加/删除规则.我考虑的另一个解决方案是简单地从我的应用程序数据库中重新生成整个规则集并刷新整个链,然后再次应用它.但我想避免这种情况,因为我不想丢弃任何数据包 - 除非有一种方法可以原子地执行此操作.我想知道是否有更好的方法.

C中的API会很棒; 但是,因为我打算将它构建成一个独立的suid程序,所以用任何语言执行此操作的库也可以.



1> Eric Lathrop..:

来自netfilter FAQ:

答案不幸的是:不.

现在你可能会想'但是libiptc呢?' 正如已经在邮件列表上多次指出的那样,libiptc 从未被用作公共界面.我们不保证一个稳定的接口,并计划在下一个linux数据包过滤的版本中将其删除.libiptc太低层,无论如何都无法合理使用.

我们很清楚,这种API基本缺乏,我们正在努力改善这种情况.在此之前,建议使用system()或打开管道进入iptables-restore的stdin.后者将为您提供更好的性能.


这个netfilter邮件列表帖子说iptables-restore是原子的:http://www.mail-archive.com/netfilter-devel@lists.samba.org/msg00456.html

2> Jerub..:

使用iptables-save和iptables-restore来查询和重新生成规则很容易就是最有效的方法.曾经这些曾经是shell脚本,但现在它们是非常有效的C程序.

但是,我应该指出,您可以使用一种工具,这将使维护iptables变得更加容易.大多数动态规则集实际上是重复多次重复的规则,例如:

iptables -A INPUT -s 1.1.1.1 -p tcp -m --dport 22 -j ACCEPT
iptables -A INPUT -s 2.2.2.0/24 -p tcp -m --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 22 -j REJECT

每次你想要改变哪些端口可以访问端口22(对于端口敲门很有用)时,你可以使用ipsets,而不是替换这些规则.即:

ipset -N ssh_allowed nethash
iptables -A ssh_allowed -m set --set ssh_allowed src -p tcp -m --dport 22 -j ACCEPT
ipset -A ssh_allowed 1.1.1.1
ipset -A ssh_allowed 2.2.2.0/24

集可以保存IP地址,网络,端口,mac地址,并在其记录上有超时.(曾经想在一小时内添加一些东西吗?).

甚至有一种原子方式可以将一个集合与另一个集合进行交换,因此刷新意味着创建一个新的临时集合,然后将其作为现有集合的名称进行交换.


Ubuntu现在已经足够支持ipset了.

3> Grzegorz Luc..:

您可以考虑使用rfw作为iptables的REST API.它从各种可能并发的源序列化iptables命令,并动态远程执行iptables.

rfw专为尝试在多个盒子上更新防火墙规则的分布式系统而设计,但也可以在localhost接口上的单个机器上运行.然后它允许避免SSL和身份验证开销,因为在这种情况下它可以在纯HTTP上运行.

示例命令:

PUT /drop/input/eth0/11.22.33.44

对应于:

iptables -I INPUT -i eth0 -s 11.22.33.44 -j DROP

您可以插入和删除规则以及查询当前状态以获取JSON格式的现有规则:

GET /list/input

免责声明:我开始了这个项目.它是MIT许可下的开源软件.

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有