
Temos um servidor Ubuntu 12.04 com httpd na porta 80 e queremos limitar:
- o máximo de conexões por endereço IP para httpd é 10
- o máximo de novas conexões por segundo para httpd é 150
Como podemos fazer isso com iptables?
Responder1
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 --connlimit-mask 32 -j REJECT --reject-with tcp-reset
Isto 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 caso, 160 novas conexões (pacotes, na verdade) são permitidas antes que o limite de 150 NOVAS conexões (pacotes) por segundo seja aplicado.
Responder2
Você deseja que as seguintes regras 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 -I (conforme a solicitação do OP), temos que fazê-los na ordem inversa, então 'lê-los' de baixo para cima.
Também sugiro considerar a alteração de --connlimit-mask NN 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 classe, como 22 ou 30, dependendo de como você acha que seu serviço pode ser usado.
Dependendo também de como você deseja que o cliente se comporte, vocêpoderdeseja 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 software que usa a porta 80 mostrará o status "não disponível" imediatamente, mas a opção DROP fará com que o cliente espere e tente novamente algumas vezes antes de reportar o site como não disponível. Eu tendo a me inclinar para o DROP, pois ele se comporta mais como uma conexão ruim do que como um servidor offline.
Além disso, se o limite de conexão cair abaixo de 150 (ou 10) enquanto ele ainda estiver tentando novamente, ele finalmente chegará ao seu servidor.
A opção REJECT causará uma fração menos de tráfego em seu site, pois 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 REJECT informará ao controlador do cluster que ele está inativo 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). Isto apenas aceita pacotes adicionais pertencentes a conexões aceitas.
Além disso, --syn diz para ele prestar atenção (ou contar) aos pacotes que configuram uma conexão TCP.
Responder3
Você precisa usar os connlimit
módulos que permitem restringir o número de conexões TCP paralelas a um servidor por endereço IP do cliente (ou bloco de endereço).
/sbin/iptables -I INPUT -p tcp --syn --dport 80 -m connlimit \
--connlimit-above 10 -j DROP