
Ich habe ein Problem damit, fail2ban dazu zu bringen, das zu tun, was ich will. Ich verwende eine Aktion, die die IP auf CLoudFlare sperrt. Das bedeutet, dass immer noch viele Anfragen durchkommen, bis alles auf Cloudflares Seite aktualisiert wurde (und der Benutzer daher nicht mehr auf die Site zugreifen kann).
Bis das passiert, versucht fail2ban immer wieder, die IP zu sperren, was dazu führt, dass (im Falle eines DDoS-Angriffs) Tausende von Anfragen an Cloudflare gesendet werden, was verdammt lange dauert, und sperrt daher keine weiteren Angreifer, bis es mit den vorherigen (bereits gesperrten) Angreifern fertig ist.
Gibt es also eine Möglichkeit, fail2ban davon abzuhalten, erneut zu sperren, und sie einfach zu ignorieren?
#!/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
Antwort1
Erwägen Sie, eine Liste mit gesperrten IPs zu erstellen und die IPs dieser Liste hinzuzufügen, wenn Sie die Sperranforderung stellen. Ignorieren Sie Sperranforderungen im Aktionsskript, wenn die IP in der Liste enthalten ist. Sie müssen auch die Aktion zum Aufheben der Sperre ändern, um die IP aus der Liste mit gesperrten IPs zu entfernen. Erstellen Sie ein Skript wie das folgende:
#!/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
Ihre Aktionen wären:
actionban = /path/to/script ban <IP>
actionunban = /path/to/script unban <IP>