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

时间:2014-05-17 19:27:09

标签: firewall freebsd

我需要查询,修改,添加和删除规则。我还没有找到任何API来做这件事。

我发现最接近的是使用pfctl -s和pfctl -f来转储规则,修改和读取它们的pfctl工具。我考虑的另一个解决方案是简单地重新生成整个规则集并单独跟踪更改。我需要小心丢弃尽可能少的数据包。

C中的API会很棒;但是用任何语言做这件事的图书馆都很好。

3 个答案:

答案 0 :(得分:3)

没有"官方" API,但你可以看一下pfctl源代码,看看它是如何与内核接口的。

答案 1 :(得分:1)

要添加/更改pf规则,您应该针对/ dev / pf

发出ioctl调用

看看pf / ftp-proxy / filter.c这是一个简单而干净的如何操作的例子。

参考:

http://code.metager.de/source/xref/freebsd/contrib/pf/ftp-proxy/filter.c

答案 2 :(得分:1)

大多数程序化PF需求都可以用PF表或规则锚点,甚至两者结合来解决。仅在极端情况下,您才需要重新使用低级设备界面。因此,第一步是尝试解决您按顺序解决这些问题的任务,只有在上一个解决方案无效的情况下,才进行下一个解决方案:

  1. PF表
  2. 规则锚点
  3. 低级设备界面

前两个选项在pf.conf手册页中进行了详细说明。放置好规则,表和锚点后,即可使用pfctl对其进行修改。通过前两个功能,您应该能够完成PF需要完成的99%的任务。

现在,如果您确实需要访问低级界面,则需要访问/dev/pf特殊设备。打开后,您可以在其上调用ioctl()将命令发送到PF。遗憾的是,没有关于如何使用此接口的详细文档,在PF device手册页中对它进行了大部分(但不完整)说明。我之所以说“大部分”,是因为文档中专门提到添加和删除规则的部分含糊不清。但是,必须阅读此书才能开始了解其工作原理。然后,您需要检查头文件,其中声明了要使用的结构:net/pfvar.h。最后,我建议您使用接口参考代码。 ftp-proxy代码很清楚也很简单,您可以找到here

我想再次强调,这应该是您的最后选择,在尝试采用低级方法之前,请仔细检查并仔细考虑(并重新考虑)您的规则。即使这样做,也可以使用锚来隔离以编程方式插入的规则,以最大程度地减少不良或不安全规则的影响。此外,请尝试通过使用锚点过滤参数将添加的规则的复杂性降至最低(请查看man,以了解如何执行此操作)。想一想,如果您的程序添加了错误的规则(或被欺骗(利用)了该规则),则可能会使整个网络容易受到攻击。

最后,我想补充一点个人经验。我一直在使用PF防火墙,主要是在OpenBSD上,而在FreeBSD上则是PF,在从简单的家庭办公室防火墙到具有冗余,负载平衡和自动故障转移的更大规模(+1500主机)的部署中, 。在所有这些年中,我只需要使用低级接口一次,因为代码库不仅是用C语言编写的,而且是在无法访问pfctl的隔离环境中运行的。此系统添加的规则非常基础,它们仅添加和删除系统收集的动态参数(IP,端口等),而将静态PF规则的大部分选项留在其标准位置/etc/pf.conf中。我还经常使用锚过滤参数来最大程度地减少动态规则的复杂性。