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
Em seguida, adicione / elimine dinamicamente os endereços IP:
$ pfctl -t badhosts -T add 1.2.3.4
$ pfctl -t badhosts -T delete 1.2.3.4
Outros comandos 'table' incluem flush
(remove all), replace
e show
. Veja man pfctl
para mais.
Se você quiser uma lista mais permanente, poderá 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.conf
e man pfctl
.
Nota : Os exemplos acima assumem que a interface voltada para a Internet é fxp0
, por favor mude de acordo com sua configuração. Além disso, lembre-se de que as regras em pf.conf
são avaliadas sequencialmente e, para as regras block
ou pass
, é a última regra de correspondência aplicável. 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 à tabela badhosts
$ 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 o segundo host será capaz de fazer conexões com a porta 80 de outras máquinas, porque a regra pass
corresponde e substitui a regra block
.