Защита от брутфорса по ssh во FreeBsd

Для защиты будем использовать пакетный фильтр pf, для его активации необходимо проделать следующее
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 раза в минуту, то ип блокируется на целый час.
Что характерно, блокируется доступ к серверу целиком по всем интерфейсам.