As capacidades do netfilter são quase ilimitadas. Nesse eu usaria o módulo limite no iptables. Esteja ciente: não há como limitar as taxas no TCP / IP sem descartar pacotes. Você pode enfileirar os pacotes, mas, eventualmente, quando a fila está cheia, os pacotes são descartados. Então, vamos descartar os pacotes SYN. Eu não tentei isso até agora, provavelmente por causa de tempos limite de tentativas muito longos, ninguém está fazendo isso, ou seja, um navegador pode ficar bloqueado.
limit
This module matches at a limited rate using a token bucket filter. A rule using this extension will match until this limit is reached (unless the '!' flag is used). It can be used in combination with the LOG target to give limited logging, for example.
--limit rate Maximum average matching rate: specified as a number, with an optional '/second', '/minute', '/hour', or '/day' suffix; the default is 3/hour.
--limit-burst number Maximum initial number of packets to match: this number gets recharged by one every time the limit specified above is not reached, up to this number; the default is 5.
- Nós configuramos uma nova cadeia que limita a conexão. Por 4 segundos, ele retornará para a cadeia de chamadas, o restante será descartado.
- Novas conexões para a porta 80 são enviadas para essa nova cadeia.
iptables -N CONNRATELIMIT
iptables -A CONNRATELIMIT -m limit --limit 4/sec -j RETURN
iptables -A CONNRATELIMIT -j DROP
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j CONNRATELIMIT
Eu usei a cadeia secundária apenas para mostrar o conceito. Você também pode fazer isso em um roteador, então você tem que criar uma cadeia por servidor ou entidade que você deseja limitar. E use FORWARD ao invés de INPUT.
Fila
Nesta solução, não há enfileiramento de "longa duração". Você pode jogar com os parâmetros limite e limite-rajada . Também seria possível enviar os pacotes SYN para uma Disciplina de Enfileiramento: a configuração é muito mais complexa e não consigo ver como isso melhora as coisas com relação à eliminação de pacotes SYN.
correspondência de URL
A correspondência de URL também é possível, nesse caso, você descartaria esse pacote e atrasaria a conexão aguardando a retransmissão. Fiz essas coisas com o módulo recente , MAS usei-o para Impeça ataques de força bruta e portscanning. Então eu não me importo com as conexões que estou limitando. O manuseio adequado das conexões será difícil!