端口转发,用于接口上的所有IP

我以非特权用户身份运行基于Java的Web服务器。 因此它监听端口8080和8443,而不是80和443。

现在我正在使用以下pf规则在内部转发端口:

 rdr pass on $ext_if proto tcp from any to $ext_ip port 80 -> $ext_ip port 8080 rdr pass on $ext_if proto tcp from any to $ext_ip port 443 -> $ext_ip port 8443 

(显然为$ext_if$ext_ip定义了macros)

现在我想添加更多的IP到接口(SSL vHosts) – 最好的方法是什么? 我是否必须为每个添加的IP重复这些规则? 或者,我可以以某种方式为“每个IP上的接口”做一个规则?

编辑:不幸的是,IP不是从同一个子网。 我试图列出他们在$ext_ipmacros,但我仍然更喜欢一个解决scheme,我不必明确添加每个IP。

谢谢!

我的研究表明,没有pf.conf子句可以使您达到这种规则的一对一扩展。

我希望你可以用macros来做到这一点,在你的情况下,它会是这样的:

 vhost_ips = "{ 198.51.100.4, 198.51.100.5 }" rdr pass on $ext_if proto tcp from any to $vhost_ips port 80 -> $ext_ip port 8080 rdr pass on $ext_if proto tcp from any to $vhost_ips port 443 -> $ext_ip port 8443 

…但是如果macros在同一行上多次使用,它实际上将后者扩展到整个macros,并调用循环:

 rdr pass on int0 proto tcp from any to 198.51.100.4 port 80 -> { 198.51.100.4, 198.51.100.5 } port 8080 round-robin rdr pass on int0 proto tcp from any to 198.51.100.5 port 443 -> { 198.51.100.4, 198.51.100.5 } port 8443 round-robin 

我很确定这不是你想要的。 :-)表格也显示出来。 手册页明确指出:

“表也可以用于nat和rdr规则的redirect地址,也可以用于筛选器规则的路由选项,但只能用于循环池。

所以不幸的是,看起来您唯一的select是手动维护列表,或者将其作为单独的文件生成并包含它。

另外不幸的是,在我的pf.conf或9.0-RC2系统的pf.conf手册页中没有提到include子句,所以如果你运行的是FreeBSD附带的PF,我相信它们正在运行从OpenBSD 4.5似乎不支持include …但是为了以防万一,下面是一个生成include的方法:

 $ cat vhost.list 198.51.100.4 198.51.100.5 $ cat gen-vhosts-pf.sh #!/bin/sh for ip in `egrep -v ^# /etc/vhost.list`; do echo "rdr pass on \$ext_if proto tcp from any to $ip port 80 -> $ip port 8080" echo "rdr pass on \$ext_if proto tcp from any to $ip port 443 -> $ip port 8443" done $ ./gen-vhosts-pf.sh | sudo tee /etc/pf.conf.vhosts rdr pass on $ext_if proto tcp from any to 198.51.100.4 port 80 -> 198.51.100.4 port 8080 rdr pass on $ext_if proto tcp from any to 198.51.100.4 port 443 -> 198.51.100.4 port 8443 rdr pass on $ext_if proto tcp from any to 198.51.100.5 port 80 -> 198.51.100.5 port 8080 rdr pass on $ext_if proto tcp from any to 198.51.100.5 port 443 -> 198.51.100.5 port 8443 

…将被导入到pf.conf中:

 include "/etc/pf.conf.vhosts" 

如果你没有运行一个支持include的PF,它会有点棘手,但你明白了。

对于稍微分散的研究感到抱歉; 我也找不到一个规范的方式来问PF的版本信息,所以不得不绕了一下。

编辑:你可能能够做load anchor子句包括,虽然看起来你将不得不重复你的$ext_ifmacros内锚。

假设所有的IP都在同一个子网上,你可以使用Aggregation

 $ ext_net =“192.168.1.0/24”

我不认为你需要做任何特别的事情,因为别名没有configuration成独立的networking设备。 这与Linux不同,您将eth0eth0:1eth0:2视为离散接口。 因此,pf规则应扩展为适用于该接口上的所有IP地址:

 # ifconfig sis2 192.168.4.1 netmask 255.255.255.0 alias # ifconfig sis2 sis2: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500 lladdr 00:00:24:c6:4d:ee priority: 0 media: Ethernet autoselect (100baseTX full-duplex) status: active inet 192.168.1.1 netmask 0xffffff00 broadcast 192.168.1.255 inet6 fe80::200:24ff:fec6:4dee%sis2 prefixlen 64 scopeid 0x3 inet 192.168.4.1 netmask 0xffffff00 broadcast 192.168.4.255 

使用下面的pf规则…

 # allow untrusted -> trusted ssh & http traffic untrust="sis2" pass in log on $untrust inet proto tcp from $untrust:network to $trust:network port 22 pass in log on $untrust inet proto tcp from $untrust:network to $trust:network port 80 

这扩展到以下…

 @32 pass in log on sis2 inet proto tcp from 192.168.1.0/24 to 192.168.0.0/24 port = ssh flags S/SA @33 pass in log on sis2 inet proto tcp from 192.168.1.0/24 to 192.168.0.0/24 port = www flags S/SA @34 pass in log on sis2 inet proto tcp from 192.168.4.0/24 to 192.168.0.0/24 port = ssh flags S/SA @35 pass in log on sis2 inet proto tcp from 192.168.4.0/24 to 192.168.0.0/24 port = www flags S/SA @36 pass in log on sis1 inet proto tcp from 192.168.0.0/24 to 192.168.0.1 port = ssh flags S/SA 

您将需要使用pfctl来重新应用您的pf规则,但是这是关于假设您的macros和规则是正确的所有必须做的以解决别名IP地址的问题。

另外,你可以通过列出interface:0忽略接口中的所有别名interface:0