Pregunta IPTABLES - Tasa límite de una IP entrante específica


No deseo limitar la tarifa de un servicio específico. Mi objetivo es limitar la tasa únicamente en función de la dirección IP entrante. Por ejemplo usando una pseudo regla:

john.domain.local (192.168.1.100) can only download from our httpd/ftp servers at "10KB/s" (instead of 1MB/s)

¿Cómo podría calificar el límite utilizando IPTables en función de las direcciones IP entrantes?


101
2018-04-28 21:09


origen




Respuestas:


IPTables no está hecho para este tipo de trabajo, donde se deben analizar muchos paquetes para tomar estas decisiones. Sin embargo, ¡IPTables es en parte la respuesta!

La respuesta real a esto es la increíble e infrautilizada capacidad de control de tráfico en Linux. ¡Tenga en cuenta que si se entretiene con esto sin saber lo que sucede, puede perder la conectividad de red con 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 clase que, de manera predeterminada, generará la mayor parte del tráfico a través de la cola "rápida" y pondrá una lista específica de personas en la cola "lenta".

La belleza 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 dominante desee el ancho de banda, pero este ejemplo no lo hace (siempre proporcionará 10kbps a los usuarios lentos). El sistema de cola se verá algo 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 kernel. Lo siguiente hará esto por ti .. debes 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 cumplan con ciertos criterios. Si planea poner mucha y mucha gente en esta regla lenta, una regla de ipset es más apropiada (que debería estar disponible en rhel6, creo).

Entonces, crea una base de datos ipset para hacer la comparación contra ...

ipset create slowips hash:ip,port

Luego crea la regla de iptables para hacer la coincidencia.

iptables -t mangle -I OUTPUT -m set --match-set slowips dst,src -j CLASSIFY --set-class 1:12

Esto le indica al kernel 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 a la configuración como esta:

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 allí indicando que los paquetes se redirigen a la cola lenta.

Tenga en cuenta que el único inconveniente real de esto es hacer que sobreviva a los reinicios. No creo que haya ningún script de inicio disponible para crear los conjuntos de ipsets desde volcados al reiniciar (y también deben crearse antes de reglas de iptables) y estoy seguro de que no hay scripts 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.


165
2018-04-28 23:35



Bueno, no puedo agradecerte lo suficiente. Esto es muy descriptivo y muy informativo. Más tarde me di cuenta de que se requeriría un conocimiento de TC y desde entonces comencé a estudiar esto. ¡Gracias de nuevo! - James
Ah y en cuanto a perder la conexión. Me estoy asegurando de tener la configuración abajo antes de pasar de mi VPS al equipo host. Además, tengo acceso VPN a la red privada en ETH0. Solo estaré trabajando en ETH1, así que en teoría no tendré el problema. Pero la advertencia escuchada! - James
No puedo decir cuántas veces he leído tutoriales similares, este es el primero que tiene sentido - RC1140
Como una nota al margen, por lo general es más apropiado hacer una limitación de recursos como esta en los grupos de control (de nuevo, también es posible y también está muy infrautilizada), ya que puede definir límites por aplicación en CPU, memoria, IO y red en un almacén de políticas centralizado. '. Pero aún no he visto una pregunta como esta para ofrecer una respuesta. - Matthew Ife
Si no te gusta el tc sintaxis que podrías dar tcng Un intento que añade un lenguaje un poco más fácil de usar que genera tc comandos Me ha gustado esto en shell scripts: echo '... multi line tcng configuration ...' | tcng | sh. - Mattias Wadman


Es tan simple como tomar una regla de limitación de velocidad y agregar la -s cambiar. los -s el interruptor coincide con las direcciones IP entrantes. Por ejemplo iptables -A INPUT -s 1.1.1.1 y luego terminar con su método preferido de limitación de tasa para esa regla.


5
2018-04-28 21:12



Gracias por tu pronta respuesta. Lamentablemente mi principal problema es la segunda mitad. He investigado en --limit y no he visto nada que me permita limitar en función de KB / s - ¿Alguna dirección en la que pueda señalarme? - James
@James te hubiera vuelto a llamar pero tuve que salir a la casa de un amigo. Acabo de regresar y veo que MIfe ha hecho un buen trabajo. =) - Wesley