Comme tout serveur accessible publiquement, mon blog est sujet à pas mal de trafic indésirable. Je ne fait clairement pas l’objet d’attaques DDOS ciblées, mais mes journaux révèlent tout de même un nombre non négligeable de connexions inopportunes, visant à pénétrer ou tester la sécurité du système. Ces activités sont souvent intéressantes à analyser, ou sont parfois cocasses aussi, mais laissons cela à Project Honeypot ou Internet Storm Control. L’idée est ici d’utiliser le traditionnel iptables pour bloquer les pénibles, sur la base d’une liste noire d’adresses IP.
Listes d’adresses IP:
- https://www.openbl.org/lists/base.txt
- https://lists.blocklist.de/lists/all.txt
- https://rules.emergingthreats.net/blockrules/compromised-ips.txt
- https://rules.emergingthreats.net/fwrules/emerging-Block-IPs.txt
Généré quotidiennement, le fichier suivant concatène toutes les entrées des listes précédentes.
https://blognote32.1337.cx/files/ipbl.txt
IPTABLES
Pour gérer efficacement un grand nombre d’adresses IP, il faut utiliser l’extension dédiée à cet usage: ipset. On créé ainsi un ensemble nommé d’entrées, qui sera ensuite ciblé en tant que liste d’adresses IP sources dans une règle de « DROP » iptables.
Un script vaut mieux que des mots, le suivant est planifié quotidiennement via une tâche cron.
#!/bin/bash
URL="https://blognote32.1337.cx/files/ipbl.txt"
SETNAME="IPBL"
if [ -x `which ipset` ]; then
BLACKLIST=$(curl $URL | grep -Po "\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}(/\d*)?")
if [ "$BLACKLIST" ]; then
logger -t "IP-Blacklist" "Updating blacklist rule"
ipset list $SETNAME &>/dev/null
if [ $? -ne 0 ]; then
ipset create $SETNAME iphash
else
ipset flush $SETNAME
fi
if [ -z "$(iptables --list | grep -Po $SETNAME)" ]; then
iptables -I INPUT 1 -m set --match-set $SETNAME src -j DROP
fi
for ip in $(echo -e "$BLACKLIST")
do
ipset add $SETNAME $ip 2>/dev/null
done
else
logger -t "IP-Blacklist" "No IPs to add."
fi
else
logger -t "IP-Blacklist" "ERROR: ipset command not found..."
fi
