A melhor maneira de fazer isso é definir uma tabela e criar uma regra para bloquear os hosts, em pf.conf:
table <badhosts> persist
block on fxp0 from <badhosts> to any
E adicione / exclua dinamicamente endereços IP a partir dele:
$ pfctl -t badhosts -T add 1.2.3.4
$ pfctl -t badhosts -T delete 1.2.3.4
Outros comandos da 'tabela' incluem flush(remover tudo) replacee show. Veja man pfctlpara mais.
Se você deseja uma lista mais permanente, pode mantê-la em um (ou mais) arquivos. Em pf.conf:
table <badhosts> persist file "/etc/badguys1" file "/etc/badguys2"
block on fxp0 from <badhosts> to any
Você também pode adicionar nomes de host em vez de endereços IP. Veja a seção "Tabelas" de man pf.confe man pfctl.
Nota : Os exemplos acima assumem que a interface da Internet é fxp0, altere de acordo com a sua configuração. Além disso, lembre-se de que as regras pf.confsão avaliadas sequencialmente e são blockou são passa última regra de correspondência que se aplica. Com este conjunto de regras
table <badhosts> persist
block on fxp0 from <badhosts> to any
pass inet tcp from 192.168.0.0/24 to any port 80
e depois de adicionar 1.2.3.4 e 192.168.0.10 à badhoststabela
$ pfctl -t badhosts -T add 1.2.3.4
$ pfctl -t badhosts -T add 192.168.0.10
todo o tráfego de 1.2.3.4 e 192.168.0.10 será bloqueado, mas a segunda série vai ser capaz de fazer conexões à porta de outras máquinas de 80 porque os passjogos de regras e substitui a blockregra.