GNU/Linux >> Tutoriels Linux >  >> Linux

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

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

Linux
  1. Comment bloquer l'adresse IP sur le serveur Linux

  2. Comment bloquer l'adresse IP sur le serveur Linux

  3. Comment utiliser le bloqueur IP dans cPanel

  4. Maestral Dropbox Client, découvrez comment l'installer et l'utiliser

  5. Comment limiter les E/S par processus à une limite maximale ?

Comment configurer et utiliser le client de messagerie Nylas N1 sous Linux

Comment utiliser Wireshark pour capturer et analyser les paquets réseau

Comment installer et utiliser Wireshark sur Ubuntu 21.04

Qu'est-ce que BusyBox sous Linux ? Comment l'utiliser?

Comment utiliser IPTables au lieu de firewalld pour Fedora 30-31-32

Comment utiliser SSH pour se connecter à un serveur distant sous Linux ou Windows