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.net/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.net/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