6 votes

Comment utiliser iptables ou tc pour limiter les paquets par client.

J'ai des problèmes avec les clients du réseau qui envoient des données trop rapidement.

Je veux les ralentir, en utilisant iptables, ou éventuellement tc.

J'ai vu des solutions iptables comme :

sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -m limit --limit 50/second --limit-burst 50 -j ACCEPT

mais je pense que la limite s'applique à tout ce qui correspond à la règle, plutôt que par adresse client.

Existe-t-il un moyen de faire en sorte que cette règle limite les paquets par adresse client ?

4voto

Louis Gerbarg Points 33025

Je l'ai fait en utilisant une combinaison de TC et iptables hashlimit. J'ai créé un limiteur de bande passante TC en sortie sur l'interface LAN (pour cibler le trafic de téléchargement) réglé sur 5 Mbits/seconde. J'utilise ensuite le module hashlimit d'iptables dans la chaîne de contrôle de sortie de l'interface de sorte que si le débit de paquets dépasse un certain seuil, entre deux adresses IP source et destination distinctes, il commence à classer ces paquets dans la classe de mise en forme du trafic TC 5 Mbits/s.

Vous devez définir le seuil de paquets correctement, cependant, et j'ai basé le mien sur le fait que mon MTU est de 1500 octets, donc utilisé ceci pour calculer combien de paquets par seconde cela serait pour créer un seuil de 1,5 Mbits par seconde (1000 paquets/seconde). Si l'on ajoute à cela la définition de la valeur de rafale la plus élevée possible sur le module iptables hashlimit (qui, sur ma configuration, semble être de 10 000), le résultat de tout cela est que les téléchargements courts se déroulent à pleine vitesse, mais que les téléchargements plus longs commencent à ralentir car certains paquets passent dans la classe de limitation de la bande passante TC, ce qui diminue évidemment le taux de paquets, etc. etc. C'est un peu une pirouette, mais étonnamment cela fonctionne, et cela fonctionne bien. Et parce que le TC est utilisé, aucun paquet n'est jamais abandonné - simplement retardé et ralenti en raison du passage dans la classe TC une fois que le taux de paquets est atteint.

Ceci est sur une boîte CentOS 6. Je pense que les versions plus modernes permettent au module hashlimit de prendre en charge les octets par seconde, et pas seulement les paquets par seconde, ce qui est encore mieux, mais j'ai essayé de le faire sur ma configuration et cela revient à l'utilisation des paquets par seconde.

Je suis sur un téléphone portable et je ne peux pas coller de configuration, mais si vous voulez des exemples, dites-le moi et je modifierai cette réponse. J'aime vraiment cette solution car la limitation que j'ai choisie est basée sur l'IP source et destination. Ainsi, le système voit chaque combinaison distincte src+dst IP comme son propre flux de paquets à limiter. Le module hashlimit prend également en charge les ports source et destination (en fait, toute combinaison d'IP source, port source, IP destination, port destination), de sorte que vous pourriez même effectuer la limitation sur une base par session entre IP source+port et IP destination+port.

UPDATE

Voici donc en gros comment procéder ; il faudra faire des essais.

tc :

/sbin/tc qdisc add dev eth0 root handle 1: htb
/sbin/tc class add dev eth0 parent 1: classid 1:1 htb rate 5Mbit

iptables :

#!/bin/bash

[[ "$1" =~ ^[ADI]$ ]] || exit 1

for IPT in /sbin/ip{,6}tables
do
  $IPT -t mangle -$1 POSTROUTING -o eth0 -m hashlimit --hashlimit-above 1000/second --hashlimit-burst 10000 --hashlimit-mode srcip,dstip --hashlimit-name limiter -j CLASSIFY --set-class 1:1
done

3voto

c4f4t0r Points 5014

Vous pouvez résoudre ce problème de manière simple, essayez d'utiliser le module recent avec iptables, recent garde la trace de l'adresse source :

iptables -m recent -h
recent match options:
[!] --set                       Add source address to list, always matches.
[!] --rcheck                    Match if source address in list.
[!] --update                    Match if source address in list, also update last-seen time.
[!] --remove                    Match if source address in list, also removes that address from list.
    --seconds seconds           For check and update commands above.
                                Specifies that the match will only occur if source address last seen within
                                the last 'seconds' seconds.
    --reap                      Purge entries older then 'seconds'.
                                Can only be used in conjunction with the seconds option.
    --hitcount hits             For check and update commands above.
                                Specifies that the match will only occur if source address seen hits times.
                                May be used in conjunction with the seconds option.
    --rttl                      For check and update commands above.
                                Specifies that the match will only occur if the source address and the TTL
                                match between this packet and the one which was set.
                                Useful if you have problems with people spoofing their source address in order
                                to DoS you via this module.
    --name name                 Name of the recent list to be used.  DEFAULT used if none given.
    --rsource                   Match/Save the source address of each packet in the recent list table (default).
    --rdest                     Match/Save the destination address of each packet in the recent list table.
    --mask netmask              Netmask that will be applied to this recent list.

exemple de blocage de ssh brute force :

iptables -A INPUT -i eth0 -p tcp --syn --dport 22 -m recent --name ssh --set
iptables -A INPUT -i eth0 -p tcp --syn --dport 22 -m recent --name ssh --rcheck --seconds  30 --hitcount 2 -j DROP

0voto

remote mind Points 341

Vous pouvez peut-être résoudre ce problème en utilisant le module connlimit :

http://www.cyberciti.biz/faq/iptables-connection-limits-howto/

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X