Limitação de taxa com UFW: definindo limites

19

A página man do UFW menciona que pode configurar a limitação de taxa do iptables para mim:

ufw supports connection rate limiting, which is useful for protecting against brute-force login attacks. ufw will deny connections if an IP address has attempted to initiate 6 or more connections in the last 30 seconds. See http://www.debian-administration.org/articles/187 for details. Typical usage is:

     ufw limit ssh/tcp

Infelizmente, esta é toda a documentação que eu encontrei. Eu gostaria de ficar com o UFW, e não usar comandos mais complicados do iptables (para manter as coisas "descomplicadas").

Como eu usaria o ufw para limitar todo o tráfego de entrada (não de saída) na porta 80 a 20 conexões por 30 segundos? Como desabilitar a limitação de taxa para as portas 30000 a 30005? A limitação de taxa está ativada por padrão para todas as portas?

    
por Tom 11.03.2012 / 13:35

4 respostas

18

O UFW foi projetado para ser "descomplicado", o que, nesse caso, significa que você não tem controle sobre os detalhes da taxa à qual as conexões são limitadas. Se você quer se aprofundar na fonte Python do UFW, você pode descobrir como ajustá-lo. A informação apropriada é (no meu sistema Ubuntu 10.04) em /usr/share/pyshared/ufw/backend_iptables.py

Por isso, deixando de lado a questão do tempo, aqui estão algumas respostas para suas perguntas rápidas no final.

  1. Supondo que 10.10.10.0/24 é sua rede local, isso aplica a regra limitadora padrão à porta 80 / tcp de entrada:

    ufw limit proto tcp from any port 80 to 10.10.10.0/24
    
  2. e 3. A limitação de taxa não está ativada por padrão. Para adicioná-lo a todas as portas (de destino), exceto o intervalo desejado, use esta regra. Observe que as regras (mesmo com intervalos) são unidades atômicas e não podem ser divididas. Você não pode, por exemplo, adicionar uma regra para nenhuma porta, então a regra delete a (inexistente) para um determinado intervalo a fim de removê-la. limit não é um argumento aceitável para ufw default .

    ufw limit from any to any port 0:29999,30006:65535
    
por 12.04.2012 / 22:00
6

Como mencionado no post anterior, você pode personalizar o user.rules. Eu preciso do meu limite de taxa de conexão smtp de até 12 conexões em 6 segundos. Eu adicionei uma regra como mostrado abaixo primeiro. Nota: isso adiciona uma regra de limite permitindo 6 em 30 seg por padrão

ufw limit smtp

e eu editei o /lib/ufw/user.rules (eu mantenho uma cópia personalizada deste arquivo com muitos outros ajustes) como mostrado abaixo ...

### 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
    
por 26.08.2012 / 16:47
5
O

limite de taxa pode ser alterado no arquivo de regras do ufw, que pode ser encontrado em /lib/ufw/user.rules. Por padrão, não há limites habilitados para todas as portas. você deve adicionar manualmente todas as portas ou editando o arquivo user.rules.

    
por 12.04.2012 / 10:50
0

Vale a pena apontar possíveis conseqüências não intencionais do uso do recurso LIMIT do ufw.

Suponha que alguém tenha colocado um limite geral na porta 22 / tcp como a primeira regra do ufw:

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

com a suposição de que qualquer conexão operando abaixo do limite ainda pode ser filtrada seguindo as regras do ufw e finalmente a política padrão de "negar (entrada)".

Pelo menos para ufw 0.35, essa suposição estaria errada. De fato, a lógica LIMIT IN aceita imediatamente qualquer entrada não rejeitada pelo critério de limite.

Em psuedocode, a lógica LIMIT é

if CONDITION then DENY else ACCEPT

enquanto outras regras do ufw parecem ter lógica:

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

Pessoalmente, descobri que esse comportamento é inesperado para o ufw LIMIT, que descobri inesperadamente, encontrando muitas tentativas de login da porta 22 no arquivo de log do sistema, o que nunca deveria ter acontecido devido a filtragem por outras regras do ufw.

Detalhes da confirmação do comportamento

As linhas relevantes do código iptables inseridas pelo ufw são as seguintes:

-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

A listagem acima pode ser criada com

iptables -S | grep ufw-user-limit

As duas primeiras linhas são consecutivas em ufw-user-input , o que pode ser confirmado com

iptables -S | grep ufw-user-input
    
por 31.03.2018 / 21:01