IPTables no está hecho para este tipo de trabajo, donde se necesitan analizar muchos paquetes para tomar estas decisiones. ¡IPTables es en parte la respuesta!
La verdadera respuesta a esto es las increíbles y poco utilizadas instalaciones de control de tráfico en Linux. ¡Tenga en cuenta que jugar con esto sin saber lo que está sucediendo puede llevarlo a perder la conectividad de red a la máquina! ¡Usted ha sido advertido!
Suponiendo que eth0 es el dispositivo saliente, necesitará crear una cola de control de tráfico basada en clases que, de forma predeterminada, generará la mayor parte del tráfico a través de la cola 'rápida' y colocará una lista específica de personas en la cola 'lenta'.
Lo bueno de esto es que puede crear una situación en la que permita mucho tráfico saliente para el usuario lento a menos que una clase superior quiera el ancho de banda, pero este ejemplo no lo hace (siempre proporcionará 10 kbps a los usuarios lentos). El sistema de colas se verá así:
Inbound traffic
+
|
|
v
+------------------+
| Class 1:1 |
|------------------|
| Root (all flows)|
| 100mbit |
+-----+-----+------+
| |
| |
| |
| |
| |
+----------+ | | +----------+
| 1:11 +-----+ +-----+ 1:12 |
|----------| |----------|
| Default | | Slow |
|100mb-80kb| | 80kb |
+----------+ +----------+
Para hacer esto, primero deberá configurar la disciplina de colas en el núcleo. Lo siguiente hará esto por usted ... debe ejecutar esto como un script completo
#!/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
El "valor predeterminado 11" es importante ya que le dice al núcleo qué hacer con el tráfico no clasificado.
Una vez hecho esto, puede configurar una regla de iptables para clasificar los paquetes que coinciden con ciertos criterios. Si planea poner a mucha gente en esta regla lenta, una regla de ipset es más apropiada (creo que debería estar disponible en rhel6).
Entonces, cree una base de datos ipset para hacer la comparación contra ...
ipset create slowips hash:ip,port
Luego cree la regla de iptables para hacer el partido.
iptables -t mangle -I OUTPUT -m set --match-set slowips dst,src -j CLASSIFY --set-class 1:12
Esto le indica al núcleo que si hace coincidir la IP de destino con el puerto de origen del conjunto, clasifíquelo en la cola lenta que configura con el control de tráfico.
Ahora, finalmente, cuando quiera reducir la velocidad de una IP, puede usar el comando ipset para agregar la ip al conjunto de la siguiente manera:
ipset add slowips 192.168.1.1,80
ipset add slowips 192.168.1.1,21
...
Puede probar que funciona con el comando "tc -s class show dev eth0" y verá estadísticas que indican que los paquetes se redirigen a la cola lenta.
Tenga en cuenta que el único inconveniente real de esto es hacerlo sobrevivir a los reinicios. No creo que haya secuencias de comandos de inicio disponibles para crear los conjuntos de ip desde los volcados al reiniciar (y también deben crearse antes de las reglas de iptables) y estoy seguro de que no hay secuencias de comandos de inicio para restablecer las reglas de control de tráfico al reiniciar. Si no te molesta, puedes recrear todo esto invocando un script en rc.local.