Webpage zur Anzeige der von fail2ban geblockten IP-Adressen

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)

kais-universum.de