Irgendwie interessiert mich immer mal woher die IPs kommen die durch automatisierte Angriffscripts von fail2ban aussortiert werden. Was liegt hier nahe – ein Shellscript zu schreiben und dann mit crond regelmäßig zu erneuern. Geblockte IP-Adressen können mit:
fail2ban-client status | grep "Jail list:" | sed "s/ //g" | awk '{split($2,a,",");for(i in a) system("fail2ban-client status " a[i])}'
ausgelesen werden. Ist ein wenig unhandlich diese unformatierte Ausgabe.
Das hat zu folgendem Shellscript geführt:
#!/bin/bash
# Script zur Erzeugung einer html-Seite mit den von fail2ban geblockten IP-Adressen, entsprechender nslookup-Anfrage und GeoIP
echo \<!DOCTYPE HTML\>
echo \<html\>\<head\>\</head\>\<body bgcolor=99CCFF\>
echo \<h3\>\<font size="6"\>Automatisch geblockte IP-Adressen\</font\>\</h3\>
date +'%a. %d. %b %Y %T'
echo \<br\>\<br\>
echo \<table border="1"\>
echo \<thead\>\<tr\>
echo \<th\>\<center\>\<font size="4"\>IP-Adresse und Link auf entsprechende AbuseIPDB-Seite\</font\>\</center\>\</th\>
echo \<th\>\<center\>\<font size="4"\>fail2ban-Filter\</font\>\</center\>\</th\>
echo \<th\>\<center\>\<font size="4"\>Reverse Lookup\</font\>\</center\>\</th\>
echo \<th\>\<center\>\<font size="4"\>\GeoIP\</font\>\</center\>\</th\>
echo \</tr\>\</thead\>
echo \<tbody\>
IFS=$' '
IPBLOCK=$(fail2ban-client status | grep "Jail list:" | sed "s/ //g" | awk '{split($2,a,",");for(i in a) system("fail2ban-client status " a[i])}'| grep -v Status |cut -d " " -f 8- |sed 's/\n\ //g'|sed 's/\s/\n/g' | sort -V | uniq | sed '/^$/d' |sed 's/\s/x/g'|grep -v /var/) # Aus Fail2ban die geblockten IPs auslesen
echo $IPBLOCK | while read IP
do
echo \<tr\>
URL=https://www.abuseipdb.com/check/$IP
echo \<td\>\<a href\=$URL\>$IP\</a\>\</td\> #IP-Adresse anzeigen
HOSTNAME=$(dig -x $IP +noidnout | grep PTR | cut -d ";" -f 2) #Hostname anzeigen
GEOIP=$(echo $IP | xargs geoiplookup) #Geoip anzeigen
FILTER=$(grep $IP /var/log/fail2ban.log* |grep Ban|cut -d "[" -f 3|cut -d "]" -f 1|uniq) #fail2ban-Filter ermitteln
echo \<td\>\<center\>\<font size="4"\>"["$FILTER"]"\</font\>\</center\>\</td\>
echo \<td\>\<center\>\<font size="4"\>${HOSTNAME##*PTR}\</font\>\</center\>\</td\>
echo \<td\>\<center\>\<font size="4"\>$GEOIP\</font\>\</center\>\</td\>
echo \</tr\>
done
echo \<tbody\> \</table\>\</body\>
und die Ausgabe sieht dann so aus. Sicher kein besonders schönes Script aber funktional. Aufgerufen wird das Script alle 5 Minuten durch crond mit:
*/5 * * * * /Pfad zum Script/blocked-ips > /tmp/blocked.html && /bin/chown Benutzer:Gruppe /tmp/blocked.html && mv /tmp/blocked.html /Pfad zum Document-Root/
Der umständliche Weg über /tmp soll verhindern, dass die Seite bereits während der Laufzeit des Scriptes, es braucht eine Weile, unvollständig geladen wird.
(Das Paket mit geoiplookup findet sich im Paket geoip-bin und kann aus den Repositorien von Debian mit apt-get install geoip-bin installiert werden)