Menu Fermer

14 règles iptables Anti-DoS

Les attaques DoS posent de sérieux problèmes aux administrateurs réseaux.
Pour atténuer ce type de cyberattaque, vous pouvez mettre en place des règles iptables afin de protéger votre VPS, serveur dédié, cloud, bare metal.
Bien sûr, si l’attaque est trop importante, le pare-feu ne pourra pas tout bloquer. Toutefois, il est fortement conseillé de mettre en place des règles de mitigation.

Dans ce tutoriel, je vous propose 14 règles iptables Anti-DoS pour mieux protéger votre serveur.

14 règles iptables Anti-DOS

14 règles iptables Anti-DOS

Bloquer les paquets non valides

Cette règle bloque tous les paquets qui ne sont pas des paquets SYN et qui n’appartiennent pas à une connexion TCP établie.

iptables -t mangle -A PREROUTING -m conntrack --ctstate INVALID -j DROP

Bloquer les nouveaux paquets qui ne sont pas SYN

Cette règle bloque tous les paquets qui sont nouveaux (n’appartenant pas à une connexion établie) et qui n’utilisent pas le drapeau SYN.

iptables -t mangle -A PREROUTING -p tcp ! --syn -m conntrack --ctstate NEW -j DROP

Bloquer les valeurs MSS peu communes

La règle iptables ci-dessus bloque les nouveaux paquets (seuls les paquets SYN peuvent être de nouveaux paquets, conformément aux deux règles précédentes) qui utilisent une valeur TCP MSS qui n’est pas commune.
Cela permet de bloquer les SYN flood muets.

iptables -t mangle -A PREROUTING -p tcp -m conntrack --ctstate NEW -m tcpmss ! --mss 536:65535 -j DROP

Bloquer les paquets avec des drapeaux TCP bidons

Le jeu de règles ci-dessus bloque les paquets qui utilisent de faux drapeaux TCP (XMAS Packets, etc), c’est-à-dire des drapeaux TCP que des paquets légitimes n’utiliseraient pas.

iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,ACK FIN -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,URG URG -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,PSH PSH -j DROP
iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL NONE -j DROP

Bloquer les paquets provenant de sous-réseaux privés (Land Attack)

Ces règles bloquent les paquets usurpés provenant de sous-réseaux privés (locaux).
Sur votre interface réseau publique, vous ne souhaitez généralement pas recevoir de paquets provenant d’IP sources privées.

Ces règles supposent que votre interface de bouclage utilise l’espace IP 127.0.0.0/8.

iptables -t mangle -A PREROUTING -s 224.0.0.0/3 -j DROP 
iptables -t mangle -A PREROUTING -s 169.254.0.0/16 -j DROP 
iptables -t mangle -A PREROUTING -s 172.16.0.0/12 -j DROP 
iptables -t mangle -A PREROUTING -s 192.0.2.0/24 -j DROP 
iptables -t mangle -A PREROUTING -s 192.168.0.0/16 -j DROP 
iptables -t mangle -A PREROUTING -s 10.0.0.0/8 -j DROP 
iptables -t mangle -A PREROUTING -s 0.0.0.0/8 -j DROP 
iptables -t mangle -A PREROUTING -s 240.0.0.0/5 -j DROP 
iptables -t mangle -A PREROUTING -s 127.0.0.0/8 ! -i lo -j DROP

Bloquer ICMP (ou pas)

On peut aussi bloquer le protocole Internet Control Message Protocol (ICMP)..
Il est généralement présenté comme un protocole qui pose des problèmes de sécurité et qui n’est généralement pas nécessaire et qu’il représente une vulnérabilité que les attaquants peuvent exploiter.
Or ce n’est pas tout à fait le cas, car ICMP est utilisé utilisé dans les requêtes ping ou encore par le Path MTU Discovery (PMTUD).

Pour bloquer totalement, ICMP, utilisez cette règle :

iptables -t mangle -A PREROUTING -p icmp -j DROP

Toutefois, au regard de cet article : Faut-il bloquer ICMP.
Je vous déconseille de le faire. La meilleure solution est de configurer une limitation sur le nombre de paquets par IP.
Par exemple avec :

iptables -t mangle PREROUTING -A -p icmp -m hashlimit --hashlimit-name icmp --hashlimit-mode srcip --hashlimit 3/second --hashlimit-burst 5 -j ACCEPT

Vous pouvez aussi bloquer le ping en suivant ce tutoriel : Iptables : bloquer ping (ICMP)

Limiter le nombre de connexions sur un port

Cette règle iptables permet de lutter contre les attaques de connexion. Elle rejette les connexions des hôtes qui ont plus de 80 connexions établies. Si vous rencontrez des problèmes, vous devriez augmenter la limite car cela pourrait causer des problèmes avec les clients légitimes qui établissent un grand nombre de connexions TCP.

iptables -A INPUT -p tcp -m connlimit --connlimit-above 80 -j REJECT --reject-with tcp-reset

Limite le nombre de nouvelles connexions TCP

Limite le nombre de nouvelles connexions TCP qu’un client peut établir par seconde. Cela peut être utile contre les attaques de connexion, mais pas tellement contre les inondations SYN, car celles-ci utilisent généralement une quantité infinie d’IP sources différentes usurpées.

iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m limit --limit 60/s --limit-burst 20 -j ACCEPT 
iptables -A INPUT -p tcp -m conntrack --ctstate NEW -j DROP

Bloquer la fragmentation de paquets

Cette règle bloque les paquets fragmentés.
Normalement, vous n’en avez pas besoin et le blocage des fragments atténuera les inondations par fragmentation UDP. Mais la plupart du temps, les inondations de fragmentation UDP utilisent une grande quantité de bande passante qui est susceptible d’épuiser la capacité de votre carte réseau, ce qui rend cette règle facultative et probablement pas la plus utile.

iptables -t mangle -A PREROUTING -f -j DROP

Limiter les TCP RST

Cela limite les paquets TCP RST entrants pour atténuer les inondations TCP RST. L’efficacité de cette règle est discutable.

iptables -A INPUT -p tcp --tcp-flags RST RST -m limit --limit 2/s --limit-burst 2 -j ACCEPT 
iptables -A INPUT -p tcp --tcp-flags RST RST -j DROP

Atténuation des attaques SYN Flood

Les attaques Syn Flood visent à créer un grand nombre de fausses demandes SYN dont l’adresse IP source est usurpée, et les envoyer à la cible. La cible répond avec SYN/ACK, et alloue ses ressources pour la connexion, mais ne reçoit jamais de réponse ACK. Les ressources de la machine cible sont épuisées et elle cesse de répondre à toute autre demande provenant d’une machine légitime.

Vous pouvez atténuer ce type d’attaque une règle iptables suivante :

iptables -A INPUT -m limit --limit 1/s --limit-burst 3 -j RETURN
iptables -A INPUT -j DROP

Atténuation des attaques SYN Flood (méthodes avec SYNPROXY)

SYNPROXY est une nouvelle cible d’iptables qui a été ajoutée dans le noyau Linux version 3.12 et iptables 1.4.21.

L’objectif de SYNPROXY est de vérifier si l’hôte qui a envoyé le paquet SYN établit réellement une connexion TCP complète ou s’il ne fait rien après avoir envoyé le paquet SYN.

S’il ne fait rien, il rejette le paquet avec un impact minimal sur les performances.

Alors que les règles iptables que nous avons fournies ci-dessus bloquent déjà la plupart des attaques basées sur TCP, le type d’attaque qui peut encore leur échapper s’il est suffisamment sophistiqué est un SYN flood.

Voici les règles SYNPROXY d’iptables qui permettent d’atténuer les SYN floods qui contournent nos autres règles :

iptables -t raw -A PREROUTING -p tcp -m tcp --syn -j CT --notrack 
iptables -A INPUT -p tcp -m tcp -m conntrack --ctstate INVALID,UNTRACKED -j SYNPROXY --sack-perm --timestamp --wscale 7 --mss 1460 
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP

Plus de détails :

Bloquer les attaques brute force SSH

SSH est un service réseau très visé par les attaques brute force.
Si vous souhaitez limiter ces attaques, vous pouvez appliquer ces règles.

iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -m recent --set 
iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 10 -j DROP

Pour aller plus loin, vous pouvez aussi mettre en place la protection fail2ban : Fail2ban : protéger son serveur des attaques DoS et Bruteforce

Bloquer les scans de ports

Le balayage de port est aussi très fréquents pour énumérer les ports ouverts et les services réseaux utilisés sur une machine distante.
Pour limiter et bloquer les scans de ports, utilisez ces règles :

iptables -N port-scanning 
iptables -A port-scanning -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s --limit-burst 2 -j RETURN 
iptables -A port-scanning -j DROP