Nous allons prendre l'exemple de la protection de l'accès SSH sur le port 22 (le port par défaut).

Blocage automatique

Pour ce faire, il suffit de créer 2 règles:

iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 8 --rttl --name SSH -j DROP

Explications

La première commande permet, à chaque tentative de connexion d'une nouvelle adresse IP, de mémoriser cette adresse, la seconde bloque cette adresse si les conditions définies sont remplies.

  • l'option -i eth0 permet de définir quelle interface réseau est concernée,
  • l'option --dport 22 vous permet de choisir le port à contrôler,
  • --seconds 60 et --hitcount 8 sont les règles qui nous intéressent le plus: elles signifient que l'on bloquera le port s'il y a 8 tentatives en moins de 60 secondes depuis la même IP.

Débloquage automatique

Bien entendu, il est intéressant de pouvoir automatiquement nettoyer la liste des IP bannies, ne serait-ce que parce que vous pourriez vous trouver banni vous-même. Pour ce faire, il suffit d'installer un crontab:

*/10 * * * * /sbin/iptables -F

Cette simple ligne va vider iptables toutes les 10 minutes.

Initialisation automatique

Au redémarrage de votre machine, ces règles seront perdues, mais il est possible de les re-créer automatiquement. Pour ce faire, créez un fichier /etc/network/if-up.d/bfa_protection qui contiendra:

#!/bin/bash
[ "${METHOD}" != loopback ] || exit 0
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
/sbin/iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 8 --rttl --name SSH -j DROP

Ensuite, rendez le exécutable (chmod u+x /etc/network/if-up.d/bfa_protection) et les règles seront automatiquement créées à l'initialisation de l'interface réseau.

Suppression automatique

Pour être propre, il faut que ces règles soient supprimées lorsque l'interface réseau se désactive. Il suffit alors de créer le fichier /etc/network/if-down.d/bfa_protection qui contiendra:

#!/bin/bash
[ "${METHOD}" != loopback ] || exit 0
/sbin/iptables -D INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
/sbin/iptables -D INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 8 --rttl --name SSH -j DROP

Bien sûr, il faut le rendre exécutable (chmod u+x /etc/network/if-down.d/bfa_protection), et tout sera fonctionnel.

Ce billet est une traduction de Block brute force attacks with iptables par Kevin van Zonneveld, ces explications sont initialement pour Ubuntu.