Либо fail2ban, либо самописный скрипт. Во втором случае делал бы в iptables одно единственное правило типа:
iptables -t mangle -A -m set --match-set blacklist src -j DROP
А в ipset добавлял бы выловленные адреса ботов по крону. Во-первых это эффективнее работает, чем по правилу на каждый адрес, а во-вторых - повторное добавление уже ранее отловленного адреса бота ничего не поломает и не засорит.