я немного по другому делаю и все работает. если адаптировать под Ваш код, то
-A INPUT -p tcp -m multiport --dports 9,22,25,110 -m conntrack --ctstate NEW -j SSH_CHECK
.....
# 1. проверка, 2. бан, 3. занесение нового в список
iptables -A SSH_CHECK -j SSH_CHECK_remove
iptables -A SSH_CHECK -m conntrack --ctstate NEW -m recent --name bruteforce --rsource --update --seconds 90 --hitcount 4 -j REJECT --[.....]
iptables -A SSH_CHECK -m recent --name bruteforce --rsource --set
# удаление из бана через 12 часов (43200 сек)
iptables -A SSH_CHECK_remove -m recent --name bruteforce --rsource --rcheck --seconds 43200 -j RETURN
iptables -A SSH_CHECK_remove -m recent --name bruteforce --rsource --remove
у Вас же ведь проверяется tpc пакеты, почему icmp влияет на это?
в цепочке SSH_CHECK явно не указывается tpc, может из какой-то еще цепочки туда заход есть?
а список большой, потому что нет отчистки: туда заносятся все входящие пакеты, которые пришли на порт 9,22,25,110 (судя по коду)
вообще нужно все смотреть... iptables-save
