Iptables: les pénibles sur blacklist

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:

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

Source: mass-blocking-evil-ip-addresses-iptables-ip-sets