Fail2ban це Python скрипт, котрий сканує ваші журнали для пошуку атак та створює правила iptable, що дозволяють ігнорувати трафік з цих IP-адрес. Це дуже зручно для забезпечення SSH захисту, а також захисту інших сервісів.
У нього є можливість назавжди заблокувати трафік з IP-адреси. Він отримує список атакуючих IP з логу /var/log/secure. Після ротації журналів і перезапуску процесу fail2ban IP більше не будуть заблокованими. Так що я оптимізував цей процес, щоб зберегти усі заблоковані IP-адреси в файл, щоб їх завжди можна було внести до черного списку.
Всі зміни були проведені в файлі конфігурації /etc/fail2ban/actions.d/iptables.conf. Це дозволяє завантажити в правила iptables список IP из файлу (/etc/fail2ban/ip.deny), під час перезапуску file2ban.
actionstart = iptables -N fail2ban-<name>
iptables -A fail2ban-<name> -j RETURN
iptables -I INPUT -p <protocol> –dport <port> -j fail2ban-<name>
for IP in `cat /etc/fail2ban/ip.deny`; do iptables -I fail2ban-SSH 1 -s $IP -j DROP;done
Під час виявлення атакуючого IP варто зробити перевірку чи він не входить до списку дозволених адрес, що зберігаються в /etc/fail2ban/ip.allow. Після перевірки цього IPб в разі його відсутності, можна додавати до списку заблокованих, що міститься в /etc/fail2ban/ip.deny:
actionban = if [ -z `awk '$1 == "<ip>" { print "true" }' /etc/fail2ban/ip.allow` ]; then iptables -I fail2ban-<name> 1 -s <ip> -j DROP;fi
if [ -z `awk '$1 == "<ip>" { print "true" }' /etc/fail2ban/ip.deny` ] && [ -z `awk '$1 == "<ip>" { print "true" }' /etc/fail2ban/ip.allow` ]; then echo “<ip>” >> /etc/fail2ban/ip.deny;fi
Наступні зміни обов'язкові тому, що функціональність видалення бану не було додано в fail2ban (до версії 0.9):
actionunban = if [ -z `awk '$1 == "<ip>" { print "true" }' /etc/fail2ban/ip.deny` ]; then iptables -D fail2ban-<name> -s <ip> -j DROP;fi
if [ -z `awk '$1 == "<ip>" { print "true" }' /etc/fail2ban/ip.deny` ] && [ -z `awk '$1 == "<ip>" { print "true" }' /etc/fail2ban/ip.allow` ]; then echo “<ip>” >> /etc/fail2ban/ip.allow;fi
Завжди можна відмінити блокування для певних IP-адрес, добавивши їх в файл ip.allow, але варто використовувати змінну "ignoreip" в jail.conf поки функціонал видалення бана не будет завершено.