Limita conexões de entrada usando iptables por IP

4

Eu preciso limitar o acesso a algumas portas por IP. Digamos 5 conexões por minuto - não mais.

Eu vi o iptables recente , connlimit e limit , mas todos eles não estão se encaixando exatamente no que eu preciso.

Suponha que você tenha um cliente tentando se conectar a cada segundo. No meu cenário, preciso permitir 5 pacotes a cada minuto .

recent : Se algum IP tentar se conectar a cada 1 segundo, --hitcount 5 memorizará esse IP e o manterá na lista até que nenhum pacote chegue - em 60 segundos. Então, isso limitará o cliente permanentemente no meu cenário.

limit : Este limita como eu gostaria com --limit 5 / min, mas para todos os IPs - não há como especificar isso por IP.

connlimit : Limita o número de conexões simultâneas, não por algum tempo.

Na verdade, preciso de uma mistura de limite + recente. Quem sabe como fazer isso?

    
por PoltoS 15.06.2014 / 23:04

3 respostas

2

Finalmente consegui fazer isso com o recente:

iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW \
         -m recent --rcheck --seconds 60 --hitcount 5 --name ssh --rsource \
         -j REJECT --reject-with icmp-port-unreachable

iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW \
         -m recent --set --name ssh --rsource

- update irá reiniciar o cronômetro novamente em cada pacote de recebimento, mas --rcheck irá apenas checá-lo. Após 60 segundos, a estrutura é excluída e um novo cronômetro é iniciado novamente.

É assim que eu entendi (eu não estava procurando fontes - com preguiça)

    
por 28.07.2014 / 14:36
1

Use a hashlimit extensão de correspondência:

port=9999
iptables -A INPUT -p tcp --dport $port        \
      -m conntrack --ctstate NEW              \
      -m hashlimit --hashlimit-name SuperUser \
                   --hashlimit-above 5/minute \
                   --hashlimit-mode srcip     \
      -j DROP

Versão de depuração:

#!/bin/sh
dport=9999
limit=2/minute
burst=2

iptables -F
iptables -N SuperUser 2>/dev/null
iptables -N SuperUserLimited 2>/dev/null

# SuperUserLimited
iptables -A SuperUserLimited -j LOG                         \
                                 --log-level info           \
                                 --log-prefix 'SU:dropped '
iptables -A SuperUserLimited -j DROP

# SuperUser
iptables -A SuperUser -j LOG                         \
                          --log-level info           \
                          --log-prefix 'SU:new '
iptables -A SuperUser -m hashlimit                   \
                          --hashlimit-name SuperUser \
                          --hashlimit-above $limit   \
                          --hashlimit-burst $burst   \
                          --hashlimit-mode srcip     \
                      -j SuperUserLimited
iptables -A SuperUser -j LOG                         \
                          --log-level info           \
                          --log-prefix 'SU:accepted '

# main
iptables -A INPUT -p tcp --dport $dport \
                  -m state --state NEW  \
                  -j SuperUser
    
por 20.06.2014 / 22:10
0

Para limitar o número de conexões, use connlimit match. um exemplo:

iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 5 --connlimit-mask 32 -j REJECT --reject-with tcp-reset

que rejeitará conexões acima de 5 de um IP de origem. Se você quiser proteger de um ataque DDoS use hashlimit , você pode limitá-los por IP, por combinação IP + porta, etc. Então, um exemplo para um servidor web será algo como isto

iptables -A INPUT -p tcp --dport 80 -m hashlimit --hashlimit 45/sec --hashlimit-burst 60 --hashlimit-mode srcip --hashlimit-name DDOS --hashlimit-htable-size 32768 --hashlimit-htable-max 32768 --hashlimit-htable-gcinterval 1000 --hashlimit-htable-expire 100000 -j ACCEPT

    
por 23.06.2014 / 14:12

Tags