Limite de conexões máximas por endereço IP e novas conexões por segundo com iptables

34

Temos um servidor Ubuntu 12.04 com httpd na porta 80 e queremos limitar:

  • as conexões máximas por endereço IP para httpd para 10
  • o máximo de novas conexões por segundo para o httpd para 150

Como podemos fazer isso com o iptables?

    
por evachristine 26.06.2014 / 08:58

3 respostas

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

Isso rejeitará conexões acima de 15 de um IP de origem.

iptables -A INPUT -m state --state RELATED,ESTABLISHED -m limit --limit 150/second --limit-burst 160 -j ACCEPT  

Neste, 160 novas conexões (pacotes realmente) são permitidas antes que o limite de 150 novas conexões (pacotes) por segundo seja aplicado.

    
por 04.07.2014 / 17:59
7

Você deseja que as regras a seguir em seu iptables respondam aos dois requisitos da sua pergunta:

iptables -t filter -I INPUT -p tcp --dport 80 -j ACCEPT

iptables -t filter -I INPUT -p tcp --dport 80 -m state \
  --state RELATED,ESTABLISHED -j ACCEPT

# Adjust "--connlimit-above NN" to limit the maximum connections per IP
#   that you need.
iptables -t filter -I INPUT -p tcp --syn --dport 80 -m connlimit \
  --connlimit-above 10 --connlimit-mask 32 -j DROP

# Adjust "--connlimit-above NNN" to the maximum total connections you
#   want your web server to support
iptables -t filter -I INPUT -p tcp --syn --dport 80 -m connlimit \
  --connlimit-above 150 -j DROP

Como estamos usando o -I (de acordo com a solicitação do OP), precisamos fazê-lo na ordem inversa, para que "leiamos" de baixo para cima.

Eu também sugiro considerar a alteração do NN --connlimit-mask de 32 para 24. Isso limitará uma rede Classe-C completa (máximo de 256 endereços IP no mesmo intervalo) a 10 conexões. Você também pode usar qualquer outro número sem classes, como 22 ou 30, dependendo de como você acha que seu serviço pode ser usado.

Também dependendo de como você quer que o cliente se comporte, você pode querer usar "-j REJECT --reject-with tcp-reset" em vez de "-j DROP" nas duas regras acima, ou mesmo apenas na regra máxima de 150 conexões.

Se você REJEITAR a conexão, o navegador ou o software que usa a porta 80 exibirá um status "não disponível" imediatamente, mas a opção DROP fará com que o cliente aguarde e tente novamente algumas vezes antes de relatar o site como indisponível. Eu tendem a me inclinar para o DROP, pois ele se comporta mais como uma conexão ruim do que um servidor off-line.

Além disso, se o limite de conexão cair abaixo de 150 (ou 10) enquanto ele ainda estiver tentando, ele finalmente chegará ao seu servidor.

No entanto, a opção REJECT causará uma fração menor de tráfego ao seu site, pois o DROP fará com que ele envie pacotes adicionais enquanto tenta novamente. Provavelmente não é tão relevante.

Se, por outro lado, o tráfego da porta 80 fizer parte de um cluster, então o REJECT informará ao controlador de cluster que ele está inoperante e para parar de enviar tráfego para ele durante o tempo limite de nova tentativa.

A regra RELATED, ESTABLISHED existe sob a suposição de que sua regra padrão é bloquear todo o tráfego (iptables -t filter -P INPUT DROP). Isso só aceita mais pacotes pertencentes a conexões aceitas.

Também --syn diz para prestar atenção (ou contar) os pacotes que configuram uma conexão TCP.

    
por 10.07.2014 / 11:09
5

Você precisa usar os módulos connlimit , que permitem restringir o número de conexões TCP paralelas a um servidor por endereço IP do cliente (ou bloco de endereços).

/sbin/iptables -I INPUT -p tcp --syn --dport 80 -m connlimit \
      --connlimit-above 10 -j DROP
    
por 26.06.2014 / 10:56