Ayant récemment installé un IPCop chez moi, j'ai découvert iptables. J'ai fait quelques recherche sur Internet sans vraiment trouver les bonne lignes de commandes qui empêcherait d'autre machines infectées de venir scanner la mienne. Finalement, en croisant diverses sources dont celle-ci, j'en suis arrivé aux règles suivantes :

/sbin/iptables -I FORWARD -p tcp --dport 22 -i eth3 \
-m state --state NEW -m recent --set

/sbin/iptables -I FORWARD -p tcp --dport 22 -i eth3 \
-m state --state NEW -m recent --update \
--seconds 60 --hitcount 2 -j DROP

/sbin/iptables -I FORWARD -p tcp --dport 22 -i eth3 \
-m state --state NEW -m recent --update \
--seconds 60 --hitcount 2 -j LOG --log-prefix "SSH Scan "

Étant tout à fait novice dans ce domaine, je ne vais pas m'aventurer dans une description détaillée de ce que font les trois lignes ci-dessus. En voici rapidement la logique et les effets.

Dans mon cas, l'interface eth3 est l'interface reliée à Internet. Ces trois règles s'appliquent à tous les paquets en transit d'une interface réseau à une autre. S'il y a plus de deux nouvelles connections par minute sur le port 22 - port de ssh par défaut - alors nous ne traiterons pas la connection, ce qui revient à dire, veuillez excuser l'approximation, que nous effacerons cette même connection et que la machine distante n'obtiendra plus de réponse pendant une minute. En plus d'effacer la connection, nous loguerons cette connection en la faisant précéder de la mention "SSH Scan ".

J'ai donc ajouté ces règles au fichier /etc/rc.d/rc.firewall.local de l'IPCop, ainsi que trois autre règles permettant d'effacer les trois premières si l'on souhaiter en arrêter le filtrage. Au final, voici le contenu du fichier :

#!/bin/sh
# Used for private firewall rules

# See how we were called.
case "$1" in
  start)
        ## add your 'start' rules here
        /sbin/iptables -I FORWARD -p tcp --dport 22 -i eth3 -m state --state NEW -m recent --set
        /sbin/iptables -I FORWARD -p tcp --dport 22 -i eth3 -m state --state NEW -m recent --update \
        --seconds 60 --hitcount 2 -j DROP
        /sbin/iptables -I FORWARD -p tcp --dport 22 -i eth3 -m state --state NEW -m recent --update \
        --seconds 60 --hitcount 2 -j LOG --log-prefix "SSH Scan "
        ;;
  stop)
        ## add your 'stop' rules here
        /sbin/iptables -D FORWARD -p tcp --dport 22 -i eth3 -m state --state NEW -m recent --set
        /sbin/iptables -D FORWARD -p tcp --dport 22 -i eth3 -m state --state NEW -m recent --update \
        --seconds 60 --hitcount 2 -j DROP
        /sbin/iptables -D FORWARD -p tcp --dport 22 -i eth3 -m state --state NEW -m recent --update \
        --seconds 60 --hitcount 2 -j LOG --log-prefix "SSH Scan "
        ;;
  reload)
        $0 stop
        $0 start
        ## add your 'reload' rules here
        ;;
  *)
        echo "Usage: $0 {start|stop|reload}"
        ;;
esac

Je ne sais pas si cette façon de faire est la meilleure, mais elle a le mérite de faire ce qu'on lui demande.