Limiter le nombre de sessions tcp par client sur un port donné

Voilà une fonction que j’utilise assez souvent avec iptables, limiter le nombre de sessions tcp par IP.

La principale utilité ici est de limiter les attaques de type déni de service (DoS), qui ont bien souvent pour effet de surcharger l’activité d’un processus en écoute sur un port tcp donné en ouvrant plusieurs sessions tcp dans le but de rendre impossible toute nouvelle connexion.

À noter qu’avec l’outil iptables, il est également possible de limiter le nombre de sessions tcp à une plage d’adresses suivant un masque, que ce soit IP ou IPv6.

Voici ce que nous dit le man iptables :

connlimit
Allows you to restrict the number of parallel connections to a server per client IP address (or client address block).

[!] –connlimit-above n
Match if the number of existing connections is (not) above n.

–connlimit-mask prefix_length
Group hosts using the prefix length. For IPv4, this must be a number between (including) 0 and 32. For IPv6, between 0 and 128.

Exemples :

# allow 2 telnet connections per client host
iptables -A INPUT -p tcp –syn –dport 23 -m connlimit –connlimit-above 2 -j REJECT

# you can also match the other way around:
iptables -A INPUT -p tcp –syn –dport 23 -m connlimit ! –connlimit-above 2 -j ACCEPT

-p sert naturellement à désigner le protocole sur lequel la règle va s’appliquer, –syn désigne les paquets initiant une session TCP, -dport sert à désigner le port distant, -m connlimit car nous faisons appel au module connlimit, –connlimit-above correspond au nombre de sessions TCP à limiter, et enfin (optionnel) –connlimit-mask permet de donner un masque CIDR du sous-réseau source à filtrer, dans ce cas, c’est toute la plage de la source (alors calculée en fonction du masque donné) qui sera limitée au nombre de sessions choisi.

Voici quelques exemples que j’utilise actuellement sur mes serveurs :

Pour ssh, je limite à 3 le nombre de sessions tcp par IP (avec une policy à DROP par défaut) :

iptables -A INPUT -p tcp --syn --dport 22 -m connlimit ! --connlimit-above 3 -j ACCEPT

On pourrait très bien permettre seulement 10 connexions ssh sur le sous-réseau /24 de la source comme suivant :

iptables -A INPUT -p tcp --syn --dport 22 -m connlimit ! --connlimit-above 10 --connlimit-mask 24 -j ACCEPT

Avec une telle règle, si 198.51.100.2 ouvre 3 connexions ssh, il reste à toute la plage IP 198.51.100.0-198.51.100.255 7 connexions possibles.

Pour IPv6 je limite à 3 le nombre de sessions ssh par /64 :

ip6tables -A INPUT -p tcp --syn --dport 22 -m connlimit ! --connlimit-above 3 --connlimit-mask 64 -j ACCEPT

 

De la même façon, pour http et https, je limite à 30 sessions tcp actives par IP (et 30 par /64 IPv6)

iptables -A INPUT -p tcp --syn --dport 80 -m connlimit ! --connlimit-above 30 -j ACCEPT
 
iptables -A INPUT -p tcp --syn --dport 443 -m connlimit ! --connlimit-above 30 -j ACCEPT
 
ip6tables -A INPUT -p tcp --syn --dport 80 -m connlimit ! --connlimit-above 30 --connlimit-mask 64 -j ACCEPT
 
ip6tables -A INPUT -p tcp --syn --dport 443 -m connlimit ! --connlimit-above 30 --connlimit-mask 64 -j ACCEPT

 

À affiner selon vos besoins 🙂

Ce contenu a été publié dans Administration Système, avec comme mot(s)-clé(s) , , , . Vous pouvez le mettre en favoris avec ce permalien.

Une réponse à Limiter le nombre de sessions tcp par client sur un port donné

  1. dzorg dit :

    merci article tres interessant
    j’adopte la restriction des requetes http

    iptables -A INPUT -p tcp –syn –dport 80 -m connlimit ! –connlimit-above 30 -j ACCEPT

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *