Eu me deparei com uma situação em que um cliente precisa colocar na lista negra um conjunto de pouco menos de 1 milhão de endereços IP individuais (sem sub-redes), e o desempenho da rede é uma preocupação. Embora eu conjecture que as regras do IPTables teriam menos impacto no desempenho do que as rotas, isso é apenas conjectura.
Alguém tem alguma evidência sólida ou outra justificativa para favorecer o IPTables ou o roteamento nulo como solução para colocar listas longas de endereços IP na lista negra? Nesse caso, tudo é automatizado, portanto, a facilidade de uso não é realmente uma preocupação.
EDIT 26-Nov-11
Após alguns testes e desenvolvimento, parece que nenhuma dessas opções é viável. Parece que as pesquisas de rota e as tabelas de ip fazem pesquisas lineares no conjunto de regras e demoram muito tempo para processar essas muitas regras. No hardware moderno, colocar 1 milhão de itens em uma lista negra do iptables reduz o servidor para cerca de 2 dúzias de pacotes por segundo. Portanto, IPTables e rotas nulas estão fora.
ipset
, como recomendado por Jimmy Hedman, seria ótimo, exceto que ele não permite que você rastreie mais de 65536 endereços em um conjunto, por isso não posso nem tentar usá-lo, a menos que alguém tenha alguma idéia.
Aparentemente, a única solução para bloquear tantos IPs é fazer uma pesquisa indexada na camada de aplicação. Não é assim?
Mais Informações:
O caso de uso nesta instância está impedindo que uma lista de endereços IP "ofensores conhecidos" acesse o conteúdo estático em um servidor da web. FWIW, fazer o bloqueio através do Apache Deny from
é igualmente lento (se não mais), como também faz uma varredura linear.
FYI: A solução final de trabalho foi usar o mod_rewrite do apache em conjunto com um mapa de banco de dados de berkeley para fazer pesquisas na lista negra. A natureza indexada dos bancos de dados de berkeley permitiu que a lista fosse dimensionada com o desempenho de O (log N).