kldload pf kldstat echo 'pf_enable="YES"' >> /etc/rc.conf
Теперь добавим правило в /etc/pf.conf (фильтрующие правила нужно добавлять после всех остальных правил)
if="em0" pass in on $if proto tcp from any to $if port ssh flags S/SA keep state (max-src-conn-rate 3/60, overload <ssh-bruteforce> flush global) block drop in quick on $if from <ssh-bruteforce> #обязательно оставьте пустую строку в конце файла
$if = em0 это наша сетевая карта.
max-src-conn-rate 3/60 означает не более 3 коннектов за 60 секунд, если более, то ип добавляется в таблицу
Запустим пакетный фильтр с правилами
pfctl -e pfctl -f /etc/pf.conf
Теперь надо обеспечить периодическую очистку таблицы нарушителей (мало ли что), для это ставим expiretable
cd /usr/ports/security/expiretable make install clean rehash
И вешаем на крон каждые 5 минут очистку записей, которые протухли более часа назад
Для этого добавляем строчку в /etc/crontab
*/5 * * * * root /usr/local/sbin/expiretable -t 3600 ssh-bruteforce
Обратите внимание, что крон запускается от рута.
Всё, теперь если частота доступа по ссш превысит 4 раза в минуту, то ип блокируется на целый час.
Что характерно, блокируется доступ к серверу целиком по всем интерфейсам.