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)