Ycr*_*ros 39 linux api kernel iptables netfilter
我需要查询现有规则,以及能够轻松添加和删除规则.我没有找到任何API来做这件事.有什么东西我不见了吗?
我最接近解决方案的是使用iptables-save | iptables-xml查询和手动调用iptables命令本身来添加/删除规则.我考虑的另一个解决方案是简单地从我的应用程序数据库中重新生成整个规则集并刷新整个链,然后再次应用它.但我想避免这种情况,因为我不想丢弃任何数据包 - 除非有一种方法可以原子地执行此操作.我想知道是否有更好的方法.
C中的API会很棒; 但是,因为我打算将它构建成一个独立的suid程序,所以用任何语言执行此操作的库也可以.
Eri*_*rop 19
答案不幸的是:不.
现在你可能会想'但是libiptc呢?' 正如已经在邮件列表上多次指出的那样,libiptc 从未被用作公共界面.我们不保证一个稳定的接口,并计划在下一个linux数据包过滤的版本中将其删除.libiptc太低层,无论如何都无法合理使用.
我们很清楚,这种API基本缺乏,我们正在努力改善这种情况.在此之前,建议使用system()或打开管道进入iptables-restore的stdin.后者将为您提供更好的性能.
Jer*_*rub 12
使用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
Run Code Online (Sandbox Code Playgroud)
每次你想要改变哪些端口可以访问端口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
Run Code Online (Sandbox Code Playgroud)
集可以保存IP地址,网络,端口,mac地址,并在其记录上有超时.(曾经想在一小时内添加一些东西吗?).
甚至有一种原子方式可以将一个集合与另一个集合进行交换,因此刷新意味着创建一个新的临时集合,然后将其作为现有集合的名称进行交换.
您可以考虑使用rfw作为iptables的REST API.它从各种可能并发的源序列化iptables命令,并动态远程执行iptables.
rfw专为尝试在多个盒子上更新防火墙规则的分布式系统而设计,但也可以在localhost接口上的单个机器上运行.然后它允许避免SSL和身份验证开销,因为在这种情况下它可以在纯HTTP上运行.
示例命令:
PUT /drop/input/eth0/11.22.33.44
Run Code Online (Sandbox Code Playgroud)
对应于:
iptables -I INPUT -i eth0 -s 11.22.33.44 -j DROP
Run Code Online (Sandbox Code Playgroud)
您可以插入和删除规则以及查询当前状态以获取JSON格式的现有规则:
GET /list/input
Run Code Online (Sandbox Code Playgroud)
免责声明:我开始了这个项目.它是MIT许可下的开源软件.
据我了解(虽然似乎没有参考文献提到它),iptables-restore是原子的。最后,当COMMIT行被读取时,iptables电话iptc_commit中libiptc(在内部接口你不应该使用),然后调用setsockopt(SO_SET_REPLACE)你的新规则集。
这听起来就像您可以获得的原子性一样:通过一个内核调用。但是,邀请更多知识渊博的各方对此提出异议。:-)
编辑:我可以确认您的描述是正确的。iptables-restore在内核中作为原子操作完成。
更具体地说,“仅”操作是基于每个 CPU 的原子操作。当我们为每个 CPU 存储整个规则集 blob 时(由于缓存优化)。
故意没有 API 来管理这些规则。你不应该想这样做。或者其他的东西。
如果您需要足够动态的规则,并且您关心执行 /sbin/iptables 的性能,那么还有其他方法可以实现: