我需要查询现有规则,以及能够轻松添加和删除规则.我没有找到任何API来做这件事.有什么东西我不见了吗?
我最接近解决方案的是使用iptables-save | iptables-xml
查询和手动调用iptables命令本身来添加/删除规则.我考虑的另一个解决方案是简单地从我的应用程序数据库中重新生成整个规则集并刷新整个链,然后再次应用它.但我想避免这种情况,因为我不想丢弃任何数据包 - 除非有一种方法可以原子地执行此操作.我想知道是否有更好的方法.
C中的API会很棒; 但是,因为我打算将它构建成一个独立的suid程序,所以用任何语言执行此操作的库也可以.
来自netfilter FAQ:
答案不幸的是:不.
现在你可能会想'但是libiptc呢?' 正如已经在邮件列表上多次指出的那样,libiptc 从未被用作公共界面.我们不保证一个稳定的接口,并计划在下一个linux数据包过滤的版本中将其删除.libiptc太低层,无论如何都无法合理使用.
我们很清楚,这种API基本缺乏,我们正在努力改善这种情况.在此之前,建议使用system()或打开管道进入iptables-restore的stdin.后者将为您提供更好的性能.
使用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地址,并在其记录上有超时.(曾经想在一小时内添加一些东西吗?).
甚至有一种原子方式可以将一个集合与另一个集合进行交换,因此刷新意味着创建一个新的临时集合,然后将其作为现有集合的名称进行交换.
您可以考虑使用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许可下的开源软件.