Diferencia entre revisiones de «Entendiendo iptables hashlimit»
Sin resumen de edición |
Sin resumen de edición |
||
Línea 1: | Línea 1: | ||
Cuando nos proponemos limitar el ancho de banda o las conexiones a o desde Internet, hay algunas opciones a tener en cuenta. De forma general, todo el mundo te recomienda leer el [http://lartc.org/ lartc] y tienen razón. Es bastante complicado hacerlo bien y algunos han hecho herramientas como '''Wondershaper'''. Esta ha quedado obsoleta ([https://www.bufferbloat.net/projects/bloat/wiki/Wondershaper_Must_Die/]) y no funciona correctamente. Otra alternativa es echar mano de IPtables y su extensión hashlimit. | |||
Antes de empezar, voy a suponer un caso real sobre el que voy a explicar las alternativas: Tenemos un aula con unos 25 pcs y algunos móviles conectados por Wifi. Todos pasan por un Ubuntu server que hace de router. La conexión al exterior es relativamente buena, pero si algunos alumnos usan mucho el youtube o otros servicios de streaming, comienza a ir lento. Nos proponemos limitar el ancho de banda de la forma más respetuosa posible y sin dañar a los que quieren trabajar. | Antes de empezar, voy a suponer un caso real sobre el que voy a explicar las alternativas: Tenemos un aula con unos 25 pcs y algunos móviles conectados por Wifi. Todos pasan por un Ubuntu server que hace de router. La conexión al exterior es relativamente buena, pero si algunos alumnos usan mucho el youtube o otros servicios de streaming, comienza a ir lento. Nos proponemos limitar el ancho de banda de la forma más respetuosa posible y sin dañar a los que quieren trabajar. | ||
[[Iptables]] tiene una extensión llamada '''hashlimit'''. Esta es parecida a otra llamada '''limit'''. La diferencia es que ''hashlimit'' directamente puede trabajar con múltiples IPs de origen y de destino y ''limit'' es para toda la tarjeta de red. | |||
El funcionamiento es el siguiente: | El funcionamiento es el siguiente: | ||
Línea 15: | Línea 13: | ||
Para solucionar este problema, hashlimit cuenta con la opció '''--hashlimit-burst''' que permite una conexión rápida durante una cantidad máxima de datos. | Para solucionar este problema, hashlimit cuenta con la opció '''--hashlimit-burst''' que permite una conexión rápida durante una cantidad máxima de datos. | ||
== Entorno de pruebas == | |||
Para probar el funcionamiento voy a usar containers [[LXD]]. Estos serian los comandos para crear un container que hace de cortafuegos y uno que se conecta a través de él a Internet: | |||
# lxc launch ubuntu:16.04 firewall | |||
# lxc launch ubuntu:16.04 cliente | |||
# lxc profile create clientes | |||
# lxc profile apply cliente clientes | |||
# echo -e "\n\nauto switch1\niface switch1 inet static\naddress 192.168.99.1\nnetmask 255.255.255.0\nbridge-ports none" >> /etc/network/interfaces | |||
# brctl addbr switch1 | |||
# lxc config device add cliente eth1 nic nictype=bridged parent=switch1 name=eth1 | |||
# lxc config device add firewall eth1 nic nictype=bridged parent=switch1 name=eth1 | |||
== Ejemplos con paquetes == | == Ejemplos con paquetes == |
Revisión del 23:03 6 nov 2017
Cuando nos proponemos limitar el ancho de banda o las conexiones a o desde Internet, hay algunas opciones a tener en cuenta. De forma general, todo el mundo te recomienda leer el lartc y tienen razón. Es bastante complicado hacerlo bien y algunos han hecho herramientas como Wondershaper. Esta ha quedado obsoleta ([1]) y no funciona correctamente. Otra alternativa es echar mano de IPtables y su extensión hashlimit.
Antes de empezar, voy a suponer un caso real sobre el que voy a explicar las alternativas: Tenemos un aula con unos 25 pcs y algunos móviles conectados por Wifi. Todos pasan por un Ubuntu server que hace de router. La conexión al exterior es relativamente buena, pero si algunos alumnos usan mucho el youtube o otros servicios de streaming, comienza a ir lento. Nos proponemos limitar el ancho de banda de la forma más respetuosa posible y sin dañar a los que quieren trabajar.
Iptables tiene una extensión llamada hashlimit. Esta es parecida a otra llamada limit. La diferencia es que hashlimit directamente puede trabajar con múltiples IPs de origen y de destino y limit es para toda la tarjeta de red.
El funcionamiento es el siguiente:
- Hashlimit registra cada conexión entre ips de origen y de destino.
- Si esta supera el límite de conexiones por segundo o de velocidad, ejecuta la regla. (Posiblemente DROP)
- Cuando pasa un tiempo, permite de nuevo conectar, pero si se supera la velocidad, vuelve a cortar.
Aquí hay un problema: Muchas conexiones pueden ir muy rápido pero no ser muy pesadas. Podríamos estar cortando conexiones sin parar sólo por la velocidad de la red o del servidor remoto.
Para solucionar este problema, hashlimit cuenta con la opció --hashlimit-burst que permite una conexión rápida durante una cantidad máxima de datos.
Entorno de pruebas
Para probar el funcionamiento voy a usar containers LXD. Estos serian los comandos para crear un container que hace de cortafuegos y uno que se conecta a través de él a Internet:
- lxc launch ubuntu:16.04 firewall
- lxc launch ubuntu:16.04 cliente
- lxc profile create clientes
- lxc profile apply cliente clientes
- echo -e "\n\nauto switch1\niface switch1 inet static\naddress 192.168.99.1\nnetmask 255.255.255.0\nbridge-ports none" >> /etc/network/interfaces
- brctl addbr switch1
- lxc config device add cliente eth1 nic nictype=bridged parent=switch1 name=eth1
- lxc config device add firewall eth1 nic nictype=bridged parent=switch1 name=eth1
Ejemplos con paquetes
Ejemplos con velocidad
Vamos a analizar esta regla:
# iptables -A FORWARD -m hashlimit --hashlimit-above 3000kb/s --hashlimit-burst 5mb --hashlimit-mode srcip,dstip --hashlimit-name bwlimit -j DROP
Aquí estamos permitiendo conexiones a velocidades menores de 3000kb/s. Si se detecta una descarga a más velocidad, enviará sus paquetes al DROP. Pero no corta la conexión, ya que después de un poco de tiempo, vuelve a permitirla. Se reanuda y si vuelve a esa velocidad volverá a eliminar los paquetes.
Pero si las descargas son menores a 5mb no se aplica la regla, ya que tiene un hashlimit-burst de 5mb. Esto permite que funcione correctamente en webs poco pesadas.
El funcionamiento en detalle se puede analizar observando el fichero /proc/net/ipt_hashlimit/bwlimit en él se detallan todas las conexiones detectadas. Vamos a fijarnos en esta línea. Ha aparecido mientras se descargaba un archivo de la 10.20.2.2:
45 192.168.9.100:0->10.20.2.2:0 4194304000 2 65534
El primer número es un contador de 60 segundos hacia atrás. Cuando se produce una conexión a esa velocidad se registra. Si esa conexión se acaba, el contador va hacia atrás hasta que es 0 y desaparece. Mientras existe el contador, los paquetes a más velocidad que superen el burst se eliminarán. Mientras continue la conexión y se supere el límite, el contador se refrescará a 60. Después de las IP, va un número que és el número máximo de bytes permitidos antes de empezar a hacer DROP, es decir: el burst. En este caso es de 4mb.
Enlaces
http://poorlydocumented.com/2017/08/understanding-iptables-hashlimit-module/
http://tlfabian.blogspot.com.es/2014/06/how-does-iptables-hashlimit-module-work.html