防火墙 – 我如何在运行中以编程方式管理pf规则?

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

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

C中的API会很棒;但是,用任何语言执行此操作的库也可以.

最佳答案
大多数程序化的PF需求可以通过PF表或规则锚来解决,甚至可以通过两者的组合来解决.只有在极端情况下,您才需要重复使用低级设备接口.因此,第一步是尝试按顺序解决接近这些解决方案的任务,如果前一个解决方案不起作用,则只转到下一个:

> PF表
>规则锚
>低级设备接口

前两个选项在pf.conf手册页中有详细说明.一旦你有了你的规则,表格和锚点,就可以用pfctl修改它们.你应该能够通过前两个功能实现你需要执行99%的任务.

现在,如果您确实需要访问低级接口,则需要访问/ dev / pf特殊设备.打开后,您可以在其上调用ioctl()以向PF发送命令.遗憾的是,没有关于如何使用这个界面的详细文档,它主要是在PF device手册页中解释,但并非完全如此.我说“大多数”是因为文档中专门提到添加和删除规则的部分有点模糊.但是必须阅读才能开始了解它是如何工作的.然后,您需要检查头文件,其中声明了您需要使用的结构:net / pfvar.h.最后,我建议使用界面查看一段代码以供参考. ftp-proxy代码清晰简单,你可以找到它here.

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

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

转载注明原文:防火墙 – 我如何在运行中以编程方式管理pf规则? - 代码日志