Limitación de velocidad con UFW: establecer límites

22

La página de manual de UFW menciona que puede configurar la limitación de velocidad de iptables para mí:

ufw admite la limitación de la velocidad de conexión, que es útil para proteger contra ataques de inicio de sesión de fuerza bruta. ufw negará conexiones si una dirección IP ha intentado iniciar 6 o más conexiones en los últimos 30 segundos. Ver http://www.debian-administration.org/articles/187 para más detalles. El uso típico es:

     ufw limit ssh/tcp

Lamentablemente, esta es toda la documentación que pude encontrar. Me gustaría seguir con UFW, y no usar comandos iptables más complicados (para mantener las cosas "sin complicaciones").

¿Cómo usaría ufw para limitar todo el tráfico entrante (no saliente) en el puerto 80 a 20 conexiones por 30 segundos? ¿Cómo deshabilitaría la limitación de velocidad para los puertos 30000 a 30005? ¿La limitación de velocidad está habilitada de forma predeterminada para todos los puertos?

Tom
fuente

Respuestas:

21

UFW está diseñado para ser "sencillo", lo que en este caso significa que no tiene control sobre los detalles de la velocidad a la que se limitan las conexiones. Si desea profundizar en la fuente Python de UFW, puede averiguar cómo modificarlo. La información apropiada es (en mi sistema Ubuntu 10.04) en/usr/share/pyshared/ufw/backend_iptables.py

Dejando a un lado el problema del tiempo, por lo tanto, aquí hay algunas respuestas a sus preguntas rápidas al final.

  1. Suponiendo que 10.10.10.0/24 es su red local, esto aplica la regla de limitación predeterminada al puerto 80 / tcp entrante:

    ufw limit proto tcp from any port 80 to 10.10.10.0/24
    
  2. y 3. La limitación de velocidad no está activada de manera predeterminada. Para agregarlo a cada puerto (destino) excepto el rango que desee, use esta regla. Tenga en cuenta que las reglas (incluso con rangos) son unidades atómicas y no se pueden dividir. No puede, por ejemplo, agregar una regla para ningún puerto, luego deleteuna regla (inexistente) para un rango particular para eliminarlo. limittampoco es un argumento aceptable para ufw default.

    ufw limit from any to any port 0:29999,30006:65535
    
bonsaiviking
fuente
¿Esto significa que la tasa nunca se puede establecer?
Tom
2
No sin hackear la fuente, al menos no para UFW 0.30pre1-0ubuntu2, que es actual para Ubuntu 10.04. Desde el aspecto de las cosas en la fuente actual , eso no ha cambiado. Sin embargo, puede poner las reglas de iptables en /etc/ufw/after.rules (o /etc/ufw/before.rules), y también se usarán. Ver man ufw-framework para más información.
bonsaiviking
@bonsaiviking ¿Es posible? Si es así iptable, iptable es backend de ufw.
Nullpointer
6

Como se mencionó en la publicación anterior, puede personalizar las reglas de usuario. Necesito mi límite de velocidad de conexión smtp de hasta 12 conexiones en 6 segundos. Agregué una regla como se muestra a continuación primero. Nota: esto agrega una regla de límite que permite 6 en 30 segundos por defecto

ufw limit smtp

y edité /lib/ufw/user.rules (conservo una copia personalizada de este archivo con muchos otros ajustes) como se muestra a continuación ...

### tuple ### limit tcp 25 0.0.0.0/0 any 0.0.0.0/0 in
-A ufw-user-input -p tcp --dport 25 -m state --state NEW -m recent --set
-A ufw-user-input -p tcp --dport 25 -m state --state NEW -m recent --update --seconds 6 --hitcount 12 -j ufw-user-limit
-A ufw-user-input -p tcp --dport 25 -j ufw-user-limit-accept
Arul Selvan
fuente
Encontré user.rules en / etc / ufw
Otto Kanellis
5

el límite de velocidad puede modificarse en el archivo de reglas ufw que se puede encontrar /lib/ufw/user.rules. de forma predeterminada, no hay límites habilitados para todos los puertos. debe agregar todos los puertos de forma manual o editando el archivo user.rules.

cikuraku
fuente
1

Vale la pena señalar posibles consecuencias no deseadas del uso de la función LIMIT de ufw.

Supongamos que uno coloca un límite general en el puerto 22 / tcp como la primera regla de ufw:

     To                         Action      From
     --                         ------      ----
[ 1] 22/tcp                     LIMIT IN    Anywhere                  
...

con la suposición de que cualquier conexión que opere por debajo del límite aún podría filtrarse siguiendo las reglas de ufw y finalmente la política predeterminada de "denegar (entrante)".

Al menos para ufw 0.35, esa suposición sería incorrecta. De hecho, la lógica LIMIT IN acepta inmediatamente cualquier entrada no rechazada por el criterio de límite.

En psuedocode, la lógica LIMIT es

if CONDITION then DENY else ACCEPT

mientras que otras reglas de ufw parecen tener lógica:

if CONDITION then (DENY|ACCEPT) else continue to next rule.

Personalmente, descubrí que se trataba de un comportamiento inesperado para ufw LIMIT, que solo descubrí al encontrar inesperadamente muchos intentos de inicio de sesión en el puerto 22 en el archivo de registro del sistema, lo que nunca debería haber sucedido debido al filtrado por otras reglas de ufw.

Detalles de confirmación de comportamiento

Las líneas relevantes de código de iptables insertadas por ufw son las siguientes:

-A ufw-user-input -p tcp -m tcp --dport 22 -m conntrack --ctstate NEW -m recent --update --seconds 30 --hitcount 6 --name DEFAULT --mask 255.255.255.255 --rsource -j ufw-user-limit
-A ufw-user-input -p tcp -m tcp --dport 22 -j ufw-user-limit-accept
-A ufw-user-limit -m limit --limit 3/min -j LOG --log-prefix "[UFW LIMIT BLOCK] "
-A ufw-user-limit -j REJECT --reject-with icmp-port-unreachable
-A ufw-user-limit-accept -j ACCEPT

La lista anterior se puede crear con

iptables -S | grep ufw-user-limit

Las dos primeras líneas son consecutivas en las ufw-user-inputque se puede confirmar con

iptables -S | grep ufw-user-input
Craig Hicks
fuente