Algumas observações úteis para quem se deparar com este problema no futuro:
Primeiro de tudo, não analise nenhum tráfego que você não precise. Se você está bloqueando o tráfego TCP, por exemplo, apenas filtre os pacotes SYN, dessa forma você só acessa o filtro uma vez por conexão. Você pode usar -m state
, se desejar, mas o acompanhamento de conexão tem sua própria sobrecarga que você pode evitar se o desempenho for um problema.
Segundo, colocar um milhão de regras no iptables leva muito tempo: vários minutos. Se você precisa rastrear muitas entidades, provavelmente seria melhor mantê-lo fora do netfliter. O tamanho do conjunto de regras faz a diferença.
Em terceiro lugar, o objetivo é evitar varreduras lineares; mas infelizmente, tanto o iptables quanto o iproute2 são inerentemente lineares. Você pode dividir suas regras em estilo de árvore binária em um grande número de cadeias, o que limita o número de regras que você precisa consultar, mas mesmo assim, o iptables não é adequado para esse tamanho de problema. funcionará , mas é um desperdício de recursos valiosos.
Em quarto lugar, e mais importante, empurrar sua carga de trabalho para o userspace não é uma má idéia. Isso permite que você escreva seu próprio código ou use uma solução pronta para uso ajustada ao seu conjunto de problemas. Minha própria solução para esse problema, como mencionado, era usar pesquisas BDB acionadas através do sistema mod_rewrite do apache. Isso teve o benefício adicional de acionar apenas uma pesquisa por sessão e somente depois que uma solicitação válida foi enviada. Nesse caso, o desempenho foi extremamente rápido e o custo da lista de bloqueio foi quase insignificante.
Você pode fazer manipulação de espaço do usuário semelhante com o iptables usando o -j QUEUE
target em conjunto com libnetfilter_queue
. Essa ferramenta é poderosa, simples e mal documentada. Eu recomendaria ler o máximo possível de quantas fontes você puder encontrar, pois há muitos materiais interessantes espalhados pela Web que não fazem parte de nenhuma documentação oficial.