Eu gostaria de saber se as cadeias longas no iptables podem causar um problema de desempenho. Aqui, uma longa cadeia pode ser > 2.500 banimentos de IP individuais.
Minha preocupação é que meu conhecimento limitado de iptables sugere que isso resultará em 2.500 regras sendo verificadas para cada pacote que o servidor recebe.
Meu caso de uso é este:
Estou usando o iptables para bloquear IPs repetidamente cutucando meu servidor de maneiras que não deveriam (por exemplo, logins SSH repetidos com falha). Estou usando um script python semelhante ao fail2ban .
Mais recentemente, esses "ataques" começaram a ser mais inteligentes, diminuindo a velocidade do ataque. Suspeito que eles tenham invertido o loop aninhado de IP/nome de usuário para nome de usuário/IP. Então, para combater isso, tive que estender massivamente o tempo de banimento. Eu tomo uma atitude bastante robusta em relação a isso, então meu novo tempo de banimento é de 1 ano ou o dobro se eles tentarem novamente durante um período de experiência de dois meses.
Encontrei evidências anedóticas de que esse tipo de banimento resultou em aproximadamente 2.500 banimentos. Se eu pegasse a taxa de novos banimentos atualmente, seria mais de 8.000, mas espero que essa taxa diminua à medida que o servidor começar a bloquear com mais precisão o tráfego malicioso.
Um total de 2500 regras seria um grande esforço para a CPU/largura de banda no caso de afetar cada pacote. Se, por exemplo, você enviar 10.000 pacotes, você estaria analisando 25.000.000 regras, isso daria muito trabalho. Seria muito mais preciso e seguro bloquear todo o tráfego de entrada (exceto o estabelecido e o relacionado), e então começar a abrir os serviços que precisarão fazer NOVAS conexões ao seu lado.
No caso de querer adicionar uma lista negra de IP você pode usar o ipset que pode criar esse tipo de lista em uma única regra e também atualizar regras sem supor uma grande penalidade para o seu desempenho. Por exemplo, se você está bloqueando 2200 IPs individuais, você pode armazená-los em uma lista e verificá-los a partir de uma única regra, o que exigiria muito menos esforço em termos de CPU.