在OpenBSD防火墙后面有几十台端口转发的服务器。 大多数规则是非常相似的,只有IP或有时在端口转发,所以我想压缩他们删除过多的重复,但我发现,不可能使用rdr-to规则的表 。 有什么办法可以改善这个configuration吗? 可能有select使用pfmacros一次生成多个规则? 目前我无法使用外部预处理器。
示例规则集:
pass in on $extif proto tcp from any to 10.0.0.213 port {25,80,443} rdr-to 172.16.1.193 pass in on $intif proto tcp from $intnet to 10.0.0.213 port {25,80,443} rdr-to 172.16.1.193 pass out on $intif proto tcp from any to 172.16.1.193 port {25,80,443} received-on $intif nat-to $intif pass in on $extif proto tcp from any to 10.0.0.214 port {25,80,443} rdr-to 172.16.1.194 pass in on $intif proto tcp from $intnet to 10.0.0.214 port {25,80,443} rdr-to 172.16.1.194 pass out on $intif proto tcp from any to 172.16.1.194 port {25,80,443} received-on $intif nat-to $intif pass in on $extif proto tcp from any to 10.0.0.215 port {25,80,443,3389} rdr-to 172.16.1.195 pass in on $intif proto tcp from $intnet to 10.0.0.215 port {25,80,443,3389} rdr-to 172.16.1.195 pass out on $intif proto tcp from any to 172.16.1.195 port {25,80,443,3389} received-on $intif nat-to $intif
从pf.conf(5)手册页:
转换选项仅适用于通过指定接口的报文,如果没有指定接口,则转换应用于所有接口上的报文。 例如,将外部接口上的端口80redirect到内部Web服务器将仅适用于源自外部的连接。 从本地主机连接到外部接口的地址不会被redirect,因为这些数据包实际上并不通过外部接口。 redirect不能通过它们到达的接口reflection数据包,只能将它们redirect到连接到不同接口的主机或防火墙本身。
您可以通过不指定要redirect哪个界面来允许pf对您进行评估,从而可以浓缩一些规则。
例如:
pass in on $extif proto tcp from any to 10.0.0.213 port {25,80,443} rdr-to 172.16.1.193 pass in on $intif proto tcp from $intnet to 10.0.0.213 port {25,80,443} rdr-to 172.16.1.193
可以重写为:
pass in proto tcp from any to 10.0.0.213 port {25, 80, 443} rdr-to 172.16.1.193
$extif上发往10.0.0.213的入站stream量将被redirect到172.16.1.193。 $intif目的地为10.0.0.213的入站stream量将被redirect到172.16.1.193。 $intnetstream量也被redirect。 这可能或不可取。 没有看到你的整个规则集,或者真的知道你在做什么,我只能提供一个概念validation的例子。
最后一个注意:我真的会避免这样做。 有一种倾向(至less我是这么认为的),希望通过一条规则不仅仅是“一件事”而写出尽可能less的规则。 这不好。 防火墙已经非常复杂,似乎总是configuration错误; 为什么通过制定一个拜占庭式的规则让自己更难? 使用更简单的规则的更长的规则集将更易于理解,维护和debugging。 避免诱惑过于聪明。