Une des plaies de l'
Évidemment, je ne prétends pas faire un guide général de toutes
les mesures anti-
Car un des charmes (?) de Netfilter (au fait, il est parfois nommé
par le nom de sa commande principale,
Commençons par le commencement. Vous êtes responsables d'un
D'abord, deux avertissements importants, un général et un spécifique. Le général est que les DoS sont souvent courtes et que la meilleure stratégie est parfois de faire le gros dos et d'attendre. Des contre-mesures mal conçues ou irréfléchies ont de bonnes chances d'aggraver le problème au lieu de le résoudre. Ne vous précipitez donc pas.
Et l'autre avertissement concerne le
risque de se DoSer soi-même, avec certaines contre-mesures, lorsque
la contre-mesure nécessite d'allouer un
Il n'est évidemment pas possible de faire de la
Commençons par le module le plus simple, l'un des plus connus et,
je crois, un des premiers, connlimit. connlimit utilise le système de suivi de
connexions (
% iptables -A INPUT -p tcp --dport 80 -m connlimit \
--connlimit-above 20 -j DROP
S'appuyant sur un système qui conserve trace de toutes les connexions
en cours, le suivi de connexions est fragile si l'attaquant peut
fabriquer beaucoup de connexions en peu de temps, saturant ainsi les
tables de connexion, même si on ne filtre pas par adresse mais
globalement, comme dans l'exemple ci-dessus.
Évidemment, vingt connexions, c'est peu, et c'est partagé entre tous,
attaquants et utilisateurs légitimes. On peut donc demander à ce que
la restriction se fasse par préfixe /28 (valeur un peu arbitraire, je sais) :
% iptables -A INPUT -p tcp --dport 80 -m connlimit \
--connlimit-above 20 --connlimit-mask 28 -j DROP
Comme les modules suivants, connlimit est documenté dans la
Comme connlimit repose sur le suivi de connexions de Linux, les
outils existants comme iptstate permettent de suivre l'activité de la
machine et le nombre de connexions auquel elle fait face. Quant à
l'efficacité du filtrage, on peut regarder les statistiques de
Netfilter avec
connlimit ne peut travailler qu'avec le nombre actuel de
connexions. Si on veut travailler avec des paquets individuels, on a
le module recent. Il permet plein de choses
amusantes en testant si une machine a envoyé « récemment » un paquet de
ce type. L'utilisation la plus courante pour faire face à un trafic
intense se fait en deux temps : lorsqu'on voit passer le paquet
intéressant, noter l'adresse IP de la machine dans une
table (
% iptables -A INPUT -p tcp --dport 80 --tcp-flags SYN SYN -m recent \
--set --name Web
% iptables -A INPUT -p tcp --dport 80 --tcp-flags SYN SYN -m recent \
--update --name Web --seconds 5 --hitcount 10 -j DROP
Ici, on met les adresses IP dans une table nommée
Ensuite (seconde ligne), on teste si on a vu au moins 10 paquets de
ce modèle pendant les 5 dernières secondes et, si oui, on jette le
paquet (tout en mettant à jour la table, le
Voici un exemple des deux règles après quelques essais, 6 paquets
ont été refusés :
% iptables -n -v -L INPUT
Chain INPUT (policy ACCEPT 53068 packets, 11M bytes)
pkts bytes target prot opt in out source destination
47 2820 tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80flags: 0x02/0x02 recent: SET name: Web side: source
6 360 DROP tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80flags: 0x02/0x02 recent: UPDATE seconds: 5 hit_count: 10 name: Web side: source
Attention à la quantité de mémoire consommée (pour éviter de
se DoSer soi-même). Elle se configure au chargement du module dans le
noyau (avec
Malheureusement, il ne semble pas que le module recent permette d'utiliser des préfixes (par exemple de longueur 26 ou 28) mais seulement des adresses IP. C'est une sérieuse limitation en cas de DoS, où on souhaite limiter la taille de l'état enregistré, et on on soupçonne que l'attaquant n'a pas qu'une seule machine à sa disposition.
Voyons alors un autre module, limit. Il
permet, en utilisant l'
% iptables -A INPUT -p tcp --dport 80 --tcp-flags SYN SYN -m limit \
--limit 3/second --limit-burst 7 -j ACCEPT
% iptables -A INPUT -p tcp --dport 80 --tcp-flags SYN SYN -j DROP
Ici, on accepte les paquets TCP SYN tant qu'il y en a moins de 3 par
seconde, et on les jette au-delà. Notez le
Ce module est très simple. Mais le module limit, comme recent, ne permet pas de travailler par préfixe IP.
Tournons nous vers notre quatrième (!) et dernier module de
limitation du trafic, hashlimit. Il permet de
regrouper les adresses en préfixes et dispose également de la
possibilité de gérer plusieurs tables de préfixes. Ici, on a nommé la
table
% iptables -A INPUT -p tcp --dport 80 --tcp-flags SYN SYN -m hashlimit \
--hashlimit-name Web --hashlimit-above 3/second --hashlimit-mode srcip \
--hashlimit-burst 7 --hashlimit-srcmask 28 -j DROP
On regroupe les adresses IP par préfixes de longueur 28. Et on admet 3
paquets par seconde. Ce module représente, à mon avis, la meilleure
combinaison entre souplesse et consommation de mémoire (toujours
dangereuse en cas de DoS).
Voilà, j'espère que cela a pu aider un peu, je termine avec trois
conseils :
Cet article ne concernait que TCP. Si vous voulez sécuriser un
service