Активируем IPFW
Добавим в /etc/rc.conf

firewall_enable="YES"
firewall_script="/etc/ddos.sh"
firewall_logging="YES"

Создаем наш файерволл в файл /etc/ddos

#!/bin/sh
ipfw='/sbin/ipfw -q'
${ipfw} flush
${ipfw} add check-state
${ipfw} table 1 flush
${ipfw} add deny ip from table\(1\) to me
${ipfw} add allow all from any to any

Пишем парсер логов и добавляем их в черный список
Создадим файл /etc/ban.sh, который будет собирать IP и добавлять их в table1

#!/bin/sh
echo '' > /etc/bl
cat /var/log/nginx/deathstar.name.access.log | awk ' match($0, /(\d*.\d*.\d*.\d*).*"-" "-"/) {print $1}' | sort | uniq >> /etc/bl
/sbin/ipfw table 1 flush
cat /etc/bl | awk '{ if ($1!="") {system("/sbin/ipfw table 1 add "$1"")} }' > /dev/null

Добавить в cron задание

*/1 * * * * root /etc/ban.sh

Не плохо бы добавить в конфиг nginx следующее:

if ($http_user_agent ~* "(vaginamook|2003100|ODI3|Hotbar|4.75|DigExt|20030718|Q312461|H010818|inktomi|googlebawt|FAST-WebCrawler|Microsoft-WebDAV-MiniRedir|F
return 403;
}