
У меня проблема с тем, чтобы fail2ban делал то, что я хочу. Я использую действие, которое банит IP на CLoudFlare, это означает, что все еще много запросов проходит, пока все не будет обновлено на стороне Cloudflare (и, следовательно, пользователь больше не может получить доступ к сайту).
Пока этого не произошло, fail2ban пытается снова и снова банить IP-адрес, заставляя его отправлять тысячи (в случае DDoS-атаки) запросов в CloudFlare, что занимает чертовски много времени и, следовательно, не блокирует других злоумышленников, пока не закончит с предыдущими (уже забаненными).
Итак, есть ли способ остановить попытки fail2ban снова их забанить и просто игнорировать их?
#!/bin/bash
# Make sure that the ip-blacklist file exists
# otherwise we go ahead and create it
if [ ! -e "/etc/fail2ban/ip.blacklist" ] ; then
touch "/etc/fail2ban/ip.blacklist"
fi
if [[ $1 = ban ]]; then
if ! grep -q "$2" /etc/fail2ban/ip.blacklist; then
# Store the IP as we need it later to check if the user is already banned
echo "$2" >> /etc/fail2ban/ip.blacklist
# Submit the ban request
fi
elif [[ $1 = unban ]]; then
# Remove the IP from the blacklist
perl -ni -e "print unless (/^$2$/);" /etc/fail2ban/ip.blacklist
#sed -i '/^$2$/d' /etc/fail2ban/ip.blacklist
# Submit the unban request
fi
решение1
Рассмотрите возможность создания списка забаненных IP-адресов и добавления IP-адресов в него при отправке запроса на бан. В сценарии действий игнорируйте запросы на бан, если IP-адрес есть в списке. Вам также потребуется изменить действие разбана, чтобы удалить IP-адрес из списка забаненных IP-адресов. Создайте сценарий, например, такой:
#!/bin/bash
# Define ourbanfile
banFile=ip.blacklist
# Ensure we have a banFile will be created if missing
if [ ! -e ${banFile} ]; then
touch ${banFile}
fi
# Ban or unban as desired
if [[ $1 = ban ]]; then
if ! grep -q "$2" ${banFile}; then
# Store the IP as we need it later to check if the user is already banned
echo "$2" >> ${banFile}
# Submit the ban request
fi
elif [[ $1 = unban ]]; then
# Remove the IP from the blacklist
perl -ni -e "print unless (/^$2\$/);" ${banFile}
#sed -i '/^$2$/d' ${banFile}
# Submit the unban request
fi
# Cat banfile if running on terminal (testing)
tty -s && cat ${banFile}
# EOF
Ваши действия будут следующими:
actionban = /path/to/script ban <IP>
actionunban = /path/to/script unban <IP>