jeudi 4 novembre 2010

Limitation de connexions avec iptables

Le script

Il est court mais bref :

IPT=/sbin/iptables
WEBMAXPERMIN="260"
WEBBURST="40"

$IPT -N throttle

# hashlimit-htable-expire en millisecondes
$IPT -A throttle -m hashlimit \
--hashlimit-name webthrottle \
--hashlimit-upto $WEBMAXPERMIN/minute \
--hashlimit-mode srcip \
--hashlimit-burst $WEBBURST \
--hashlimit-htable-expire 300000 \
-j ACCEPT
$IPT -A throttle -j LOG --log-prefix "FREIN " --log-level 1
$IPT -A throttle -j REJECT

#puis dans le INPUT
$IPT -A INPUT -d $ETH00 -p tcp -m tcp --dport 80 --tcp-flags FIN,SYN,RST,ACK SYN -j throttle

L'explication

Et il est aussi simple lorsqu'on connait hashlimit.
Tout d'abord on créé une règle nommée throttle qui utilisera hashlimit pour éjecter des paquets en fonction de leur nombre.
  • On met en mode srcip : filtrage en fonction de la source seulement, donc même si le port change, on prend la même entrée dans la table
  • On choisit une limite à 260 paquets par minute (pourquoi pas)
  • On choisit un burst de 40 et une expiration de 300s et là il faut un peu plus d'explication.
Le burst c'est la possibilité de dépasser la limite autorisée pendant un temps donné. Ce burst se mesure par rapport à la limite du nombre de paquet par seconde. Par exemple un burst de 10 avec un maximum de 5 paquet par seconde donne un burst de 50 paquets. Ici ca nous donne 260/60*40=173 paquets. Pourquoi ce calcul ? Je ne sais pas mais c'est ce que j'ai constaté dans les sources.
Attention le burst est un nombre de paquets mais pas par seconde. C'est un nombre qui lorsqu'il est atteint provoque l'application de la règle. Par exemple, si quelqu'un passe 174 fois dans cette règle en 1s il se fera couper de même s'il passe 179 fois en 2s.
La première limite à cela est l'expiration de l'entrée. Si le bourrin ne fait rien pendant la période d'expiration, il a le droit de revenir après (ici 300s).
S'il ne dépasse pas son burst, il a aussi le droit de revenir mais cette fois à la vitesse maximale autorisée (ici de 4.3 paquets/s).
Et enfin, on fait passer les paquets en entrée sur le port 80 (on protège le serveur web) dans cette règle. On veut limiter les connexions, donc on y fait passer les paquets connus pour passer en début et en fin de connexion. Ici deux d'entre eux sont inutiles car on ne considère que les connexions entrantes. Comme on matche le début et la fin des connexions, la limite en nombre de connexion correspond aux toutes les limites évoquées précédemment divisées par 2.

Source : http://linux-attitude.fr/post/limitation-de-connexions-avec-iptables

Aucun commentaire:

Enregistrer un commentaire