J'ai fait cela en utilisant une combinaison de hashlimit TC et iptables. J'ai créé un limiteur de bande passante TC sortant sur l'interface LAN (pour cibler le trafic de téléchargement) réglé sur 5 Mbits/seconde. J'utilise ensuite le module iptables hashlimit dans la chaîne mangle 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 de destination distinctes, il commence à classer ces paquets dans la classe de mise en forme du trafic TC 5 Mbit/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é pour calculer le nombre de paquets par seconde qui serait de créer un seuil de 1,5 Mbits par seconde (1000 paquets/seconde ). Couplé à la définition de la valeur de rafale la plus élevée possible sur le module hashlimit iptables (qui, dans ma configuration, semble être de 10 000), le résultat de tout cela est que les téléchargements courts s'exécutent à pleine vitesse, mais les plus longs commencent à ralentir car certains paquets sont passé dans la classe de limitation de bande passante TC, ce qui abaisse évidemment le débit de paquets, etc. etc. C'est un peu un hack, mais étonnamment, cela fonctionne, et cela fonctionne bien. Et parce que TC est utilisé, aucun paquet n'est jamais abandonné - simplement retardé et ralenti en raison d'être poussé dans la classe TC une fois que le débit de paquets est atteint.
C'est sur une boîte CentOS 6. Je pense que les éléments les plus modernes permettent au module hashlimit de prendre en charge les octets par seconde, pas seulement les paquets par seconde, ce qui est encore mieux, mais j'ai essayé cela sur ma configuration et cela revient simplement à utiliser des paquets par seconde.
Je suis sur un téléphone portable en ce moment, donc je ne peux pas coller de configuration, mais si vous voulez des exemples, faites-le moi savoir et je modifierai cette réponse. J'aime beaucoup cette solution car la limitation que j'ai choisie est basée sur l'IP source et l'IP de destination. Ainsi, le système considère chaque combinaison IP src+dst distincte comme son propre flux de paquets à limiter. Le module hashlimit prend également en charge les ports source et de destination (essentiellement toute combinaison d'adresse IP source, de port source, d'adresse IP de destination, de port de destination), de sorte que vous pouvez même effectuer la limitation par session entre l'IP source + port et l'adresse IP + destination. .
MISE À JOUR
Voici donc à peu près comment vous le faites; une expérimentation sera nécessaire.
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
vous pouvez résoudre ce problème de manière simple, essayez d'utiliser un module récent avec iptables, un suivi récent 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 pour bloquer 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