IPTables n'est pas conçu pour ce type de travail, où de nombreux paquets doivent être analysés pour prendre ces décisions. IPTables est en partie la solution!
La vraie réponse à cette question est les installations de contrôle du trafic impressionnantes et sous-utilisées de Linux. Notez que vous débrouiller avec cela sans savoir ce qui se passe peut vous amener à perdre la connectivité réseau vers la machine! Tu étais prévenu!
En supposant que eth0 soit le périphérique sortant, vous aurez besoin de créer une file d'attente de contrôle du trafic basée sur les classes qui, par défaut, générera le plus de trafic par le biais de la file d'attente "rapide" et placera une liste spécifique de personnes dans la file d'attente "lente".
L'avantage de cela est que vous pouvez créer une situation dans laquelle vous autorisez une grande quantité de trafic sortant pour l'utilisateur lent, sauf si une classe substituante souhaite la bande passante, mais cet exemple ne le fait pas (fournira toujours 10 kbps aux utilisateurs lents). Le système de file d'attente ressemblera à quelque chose comme ceci:
Inbound traffic
+
|
|
v
+------------------+
| Class 1:1 |
|------------------|
| Root (all flows)|
| 100mbit |
+-----+-----+------+
| |
| |
| |
| |
| |
+----------+ | | +----------+
| 1:11 +-----+ +-----+ 1:12 |
|----------| |----------|
| Default | | Slow |
|100mb-80kb| | 80kb |
+----------+ +----------+
Pour ce faire, vous devez d’abord configurer la discipline de mise en file d’attente dans le noyau. Ce qui suit le fera pour vous .. vous devez l'exécuter en tant que script entier
#!/bin/bash
tc qdisc add dev eth0 parent root handle 1: hfsc default 11
tc class add dev eth0 parent 1: classid 1:1 hfsc sc rate 100mbit ul rate 100mbit
tc class add dev eth0 parent 1:1 classid 1:11 hfsc sc rate 99920kbit ul rate 100000kbit
tc class add dev eth0 parent 1:1 classid 1:12 hfsc sc rate 80kbit ul rate 80kbit
tc qdisc add dev eth0 parent 1:11 handle 11:1 pfifo
tc qdisc add dev eth0 parent 1:12 handle 12:1 pfifo
La "valeur par défaut 11" est importante car elle indique au noyau quoi faire avec le trafic non classé.
Une fois cette opération effectuée, vous pouvez configurer une règle iptables pour classer les paquets correspondant à certains critères. Si vous envisagez de mettre beaucoup de gens dans cette règle lente, une règle ipset est plus appropriée (elle devrait être disponible sur rhel6 je crois).
Alors, créez une base de données ipset pour faire la correspondance avec ...
ipset create slowips hash:ip,port
Créez ensuite la règle iptables pour faire la correspondance.
iptables -t mangle -I OUTPUT -m set --match-set slowips dst,src -j CLASSIFY --set-class 1:12
Ceci indique au noyau que si vous faites correspondre l’adresse IP de destination avec le port source de l’ensemble, classifiez-la dans la file d'attente lente configurée avec le contrôle du trafic.
Maintenant, enfin, chaque fois que vous voulez ralentir une IP, vous pouvez utiliser la commande ipset pour ajouter l'ip à l'ensemble tel que:
ipset add slowips 192.168.1.1,80
ipset add slowips 192.168.1.1,21
...
Vous pouvez tester le fonctionnement à l'aide de la commande "tc -s class show dev eth0" et vous y verrez des statistiques indiquant que les paquets sont redirigés vers la file d'attente lente.
Notez que le seul inconvénient de cette opération est qu’il survit au redémarrage. Je ne pense pas que des scripts d'initialisation soient disponibles pour créer les jeux d'ips à partir de sauvegardes au redémarrage (ils doivent également être créés avant les règles iptables) et je suis certain qu'il n'y a pas de scripts d'initialisation pour réinitialiser les règles de contrôle du trafic lors du redémarrage. Si vous n'êtes pas dérangé, vous pouvez simplement recréer le tout en invoquant un script dans rc.local.