GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo usar iptables o tc para limitar paquetes por cliente.

He hecho esto usando una combinación de TC e iptables hashlimit. Creé un limitador de ancho de banda TC saliente en la interfaz LAN (para apuntar al tráfico de descarga) establecido en 5 Mbits/segundo. Luego utilizo el módulo hashlimit de iptables en la cadena de mangle de salida de la interfaz, de modo que si la velocidad del paquete supera un cierto umbral, entre dos direcciones IP distintas de origen y destino, comienza a clasificar esos paquetes en la clase de modelado de tráfico TC 5 Mbit/s. .

Sin embargo, debe establecer el umbral de paquetes correctamente, y basé el mío en el hecho de que mi MTU es de 1500 bytes, así que usé esto para calcular cuántos paquetes por segundo serían para crear un umbral de 1,5 Mbits por segundo (1000 paquetes/segundo). ). Junto con la configuración del valor de ráfaga más alto posible en el módulo hashlimit iptables (que en mi configuración parece ser 10,000), el resultado de todo esto es que las descargas cortas se ejecutan a toda velocidad, pero las más largas comienzan a ralentizarse a medida que algunos paquetes son pasó a la clase de limitación de ancho de banda TC, lo que obviamente reduce la tasa de paquetes, etc., etc. Es un truco, pero sorprendentemente funciona, y funciona bien. Y debido a que se usa TC, nunca se pierden paquetes, simplemente se retrasan y se ralentizan debido a que se los empuja a la clase TC una vez que se alcanza la tasa de paquetes.

Esto está en una caja de CentOS 6. Creo que las cosas más modernas permiten que el módulo hashlimit admita bytes por segundo, no solo paquetes por segundo, lo que es aún mejor, pero probé esto en mi configuración y simplemente vuelve a usar paquetes por segundo.

Estoy en un teléfono móvil en este momento, así que no puedo pegar ninguna configuración, pero si quieres algunos ejemplos, házmelo saber y editaré esta respuesta. Realmente me gusta esta solución porque la limitación que he elegido se basa en la IP de origen y destino. Entonces, el sistema ve cada combinación distinta de IP src+dst como su propio flujo de paquetes para limitar. El módulo hashlimit también admite puertos de origen y destino (básicamente cualquier combinación de IP de origen, puerto de origen, IP de destino, puerto de destino), por lo que incluso podría limitar por sesión entre IP de origen + puerto e IP de destino + puerto .

ACTUALIZAR

Entonces, a continuación se muestra aproximadamente cómo lo hace; se requerirá experimentación.

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

puede resolver este problema de una manera simple, intente usar un módulo reciente con iptables, realice un seguimiento reciente de la dirección de origen:

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.

ejemplo para bloquear la fuerza bruta ssh:

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. Cómo bloquear la dirección IP en el servidor Linux

  2. Cómo bloquear la dirección IP en el servidor Linux

  3. ¿Cómo acelerar por proceso I/O a un límite máximo?

  4. Cómo usar el comando fuente dentro del script de canalización de Jenkins

  5. ¿Debo limitar la velocidad de los paquetes con iptables?

Cómo configurar y usar el cliente de correo electrónico Nylas N1 en Linux

Cómo usar Wireshark para capturar y analizar paquetes de red

Cómo instalar y usar Wireshark en Ubuntu 21.04

¿Qué es BusyBox en Linux? ¿Cómo usarlo?

Cómo usar IPTables en lugar de firewalld para Fedora 30-31-32

Cómo usar SSH para conectarse a un servidor remoto en Linux o Windows