OpenBSD pf 端口转发多条规则

OpenBSD pf 端口转发多条规则

我有几十台服务器位于 OpenBSD 防火墙后面,并带有端口转发功能。大多数规则非常相似,仅在 IP 或有时在转发的端口上有所不同,所以我想压缩它们以消除过多的重复,但我发现不可能使用带有rdr-to规则。有什么方法可以改进此配置吗?是否有选项可以使用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 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

答案1

来自 pf.conf(5) 手册页:

转换选项仅适用于通过指定接口的数据包,如果未指定接口,则转换将应用于所有接口上的数据包。例如,将外部接口上的端口 80 重定向到内部 Web 服务器仅适用于来自外部的连接。从本地主机到外部接口地址的连接将不会被重定向,因为此类数据包实际上并不通过外部接口。重定向无法将数据包反射回它们到达的接口,它们只能重定向到连接到不同接口的主机或防火墙本身。

您可能能够通过不指定希望在哪个接口上进行重定向并允许 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
  • 发往 10.0.0.213 的入站流量$extif将被重定向至 172.16.1.193。
  • 发往 10.0.0.213 的入站流量$intif将被重定向至 172.16.1.193。
  • 这也将允许不属于的流量$intnet顺利地被重定向。这可能是可取的,也可能不是。

在没有看到您的整个规则集或真正了解您想要完成的任务的情况下,我只能提供一个概念验证示例。

最后一点:我真的会避免这样做。有一种趋势(至少我有这种趋势)是希望通过让一条规则做不止“一件事”来编写尽可能少的规则。这很糟糕。防火墙已经非常复杂,而且似乎总是配置错误;为什么要通过制定拜占庭规则集来让自己更难呢?更长的规则集和更简单的规则将更容易理解、维护和调试。避免过于聪明的诱惑。

相关内容