С задачей неплохо справляется скриптик pf-badhost, в блок листе которого, почти 650млн IP буратин, он собирается из Spamhaus, Firehol, Emerging Threats и Binary Defense, которые достаточно часто обновляются.

Настроить все просто:

Создаем пользователя

useradd -s /sbin/nologin -d /var/empty _pfbadhost

Скачиваем и устанавливаем скриптик и нужные файлы:

ftp https://geoghegan.ca/pub/pf-badhost/0.5/pf-badhost.sh
install -m 755 -o root -g bin pf-badhost.sh /usr/local/bin/pf-badhost
install -m 640 -o _pfbadhost -g wheel /dev/null /etc/pf-badhost.txt
install -d -m 755 -o root -g wheel /var/log/pf-badhost
install -m 640 -o _pfbadhost -g wheel /dev/null /var/log/pf-badhost/pf-badhost.log
install -m 640 -o _pfbadhost -g wheel /dev/null /var/log/pf-badhost/pf-badhost.log.0.gz

Даем права _pfbadhost права запускать скрипт от superuser(вот тут как-то неприятно)

# cat /etc/doas.conf
permit root
permit nopass _pfbadhost cmd /sbin/pfctl args -nf /etc/pf.conf
permit nopass _pfbadhost cmd /sbin/pfctl args -t pfbadhost -T replace -f /etc/pf-badhost.txt
Optional rule for authlog scanning

permit nopass _pfbadhost cmd /usr/bin/zcat args -f /var/log/authlog /var/log/authlog.0.gz


4. Настраиваем PF(/etc/pg.conf):

table <pfbadhost> persist file “/etc/pf-badhost.txt” block in quick on egress from <pfbadhost> block out quick on egress to <pfbadhost>


5. Запускаем скрипт от имени пользователя `_pfbadhost`:

doas -u _pfbadhost pf-badhost -O openbsd


6. Перезагружаем правила в pf и проверяем, что все работает:

pfctl -f /etc/pf.conf doas -u _pfbadhost pf-badhost -O openbsd


7. Добавляем запуск в crontab:
crontab -u _pfbadhost -e

0 * -s pf-badhost -O openbsd


И наконец полезные командочки как этим управлять вручную:

pfctl -t pfbadhost -T show # тут будет дохренища строк

pfctl -t pfbadhost -T add 192.168.0.1 pfctl -t pfbadhost -T add 192.168.0.0/16

pfctl -t pfbadhost -T delete 192.168.0.0/16

pfctl -t pfbadhost -T test 192.168.0.1