Minha pesquisa mostra que não há nenhuma cláusula pf.conf
que permita obter esse nível de expansão de regras um para um.
Eu esperava que você pudesse fazer isso com macros, o que no seu caso seria algo como:
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
... mas se a macro for usada mais de uma vez na mesma linha, ela expandirá as últimas para a macro inteira e invocará o round-robin:
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
... o que eu tenho certeza que não foi o que você pretendia. :-) As tabelas também parecem estar fora. A página man explicitamente diz:
"As tabelas também podem ser usadas para o endereço de redirecionamento das regras nat e rdr e nas opções de roteamento das regras de filtragem, mas apenas para os pools de round-robin."
Então, infelizmente, parece que sua única opção é manter manualmente a lista ou gerá-la como um arquivo separado e incluí-la.
Além disso, infelizmente, a cláusula include
não é mencionada nas páginas pf.conf
man nos meus sistemas 7.4, 8.2 ou 9.0-RC2, então se você estiver executando o PF padrão que acompanha o FreeBSD, acredito que eles estejam rodando o PF importado do OpenBSD 4.5, que não parece suportar include
... mas só por precaução, aqui está uma maneira de gerar o 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
... que seria importado para o pf.conf com:
include "/etc/pf.conf.vhosts"
Se você não estiver executando um PF que ofereça suporte a includes, será um pouco mais complicado, mas você terá a ideia.
Desculpe pela pesquisa ligeiramente dispersa; Eu também não consegui encontrar uma maneira canônica de perguntar à PF por suas informações de versão, então tive que me debater um pouco.
EDITAR: Você pode fazer inclusões com a cláusula load anchor
, embora pareça que você terá que repetir sua macro $ext_if
dentro da âncora.