Идея проста: имеется 4 таблицы. 3 промежуточных и одна в которой хранятся заблокированные адреса. Все таблицы динамические. Адрес по мере подключения добавляется в каждую таблицу по очереди. У нас 3 промежуточных таблицы, адреса в которых хранятся по одной минуте. Таким образом получается, что если в течение одной минуты с одного и того же адреса будут произведены более 3-х попыток подключения, адрес попадает в самую главную таблицу, 4-ю. Адреса там в моем случае хранятся 30 минут. Если кому не хватает - можно больше :)
На мой взгляд это элегантно и красиво! Жаль, не моя идея :)
add action=drop chain=input dst-port=22 protocol=tcp src-address-list=ssh_blacklist add action=add-src-to-address-list address-list=ssh_blacklist address-list-timeout=30m chain=input \ connection-state=new dst-port=22 protocol=tcp src-address-list=ssh_stage3 add action=add-src-to-address-list address-list=ssh_stage3 address-list-timeout=1m chain=input \ connection-state=new dst-port=22 protocol=tcp src-address-list=ssh_stage2 add action=add-src-to-address-list address-list=ssh_stage2 address-list-timeout=1m chain=input \ connection-state=new dst-port=22 protocol=tcp src-address-list=ssh_stage1 add action=add-src-to-address-list address-list=ssh_stage1 address-list-timeout=1m chain=input \ connection-state=new dst-port=22 protocol=tcp add action=accept chain=input connection-state=new dst-port=22 protocol=tcp