Não se preocupe, na pior das hipóteses, será o desempenho da idade do ferro. (sorriso)
Um grande número de regras do netfilter, que o kernel tem que percorrer para cada pacote, terá um impacto negativo no desempenho do sistema e no consumo de recursos (CPU e memória). O bom é que há vários truques que você pode empregar para minimizar os problemas.
- Regras de "curto-circuito" para casos comuns: 90 +% dos pacotes recebidos farão parte de uma conexão estabelecida ou relacionada existente. Assim, você pode evitar ter que colocar todos esses pacotes em sua longa lista de filtros com uma regra
-m state --state ESTABLISHED,RELATED -j ACCEPT
de qualquer uma das regras da lista de filtros. -
Filtre apenas determinadas portas: se você estiver executando um servidor da Web, mas estiver realmente preocupado apenas com ataques de força bruta de SSH, poderá evitar a necessidade de processar todo o tráfego HTTP na lista de filtros, colocando a lista de filtros em uma cadeia separada e, em seguida, enviando apenas o tráfego da porta 22 por meio do filtro, desta forma:
iptables -N geofilter iptables -I geofilter -s <ip range> -j DROP [etc etc etc] iptables -I INPUT -p tcp --dport 22 -j geofilter
-
"Estrutura de árvore" suas regras de filtro: você pode ter 10.000 regras de filtragem, mas apenas uma delas será igual. Assim, você pode usar uma estrutura em árvore para reduzir o número de regras pelas quais um pacote tem que passar, colocando todas as regras para, digamos, cada / 8 em sua própria cadeia. Estendendo-se no exemplo anterior de
geofilter
:iptables -N geofilter_1 iptables -N geofilter_2 [etc etc etc all the way to geofilter_223] iptables -I geofilter -s 1.0.0.0/8 -j geofilter_1 iptables -I geofilter -s 2.0.0.0/8 -j geofilter_2 [etc etc etc] iptables -I geofilter_1 -s 1.2.3.0/24 -j DROP iptables -I geofilter_1 -s 1.5.9.0/18 -j DROP [etc etc etc for all rules in 1/8] iptables -I geofilter_2 -s 2.42.0.0/16 -j DROP [etc etc etc for all rules in 2/8] [continue pattern for all /8s]
Isso significa que qualquer pacote que precise passar pelas regras de filtragem precisará, no máximo, percorrer 223 regras (todas as regras
geofilter
), mas, no entanto, muitas regras estão em qualquer uma das 8 listas de filtros . (Por que há 223, não 254, 255 ou 256 regras na correntegeofilter
é deixado como um exercício para o leitor astuto). Você pode tornar isso ainda mais eficiente ao ter vários níveis de árvore: dividir em / 4, depois em / 8, depois em / 12 ou algo parecido. Você pode adicionar quantos níveis quiser para se adequar à sua relação custo / benefício. Você pode até fazer diferente para diferentes cadeias: comece com um único nível dividido em / 4, depois qualquer cadeia com mais de algumas centenas de regras, divida isso em / 8 e qualquer cadeia que ainda tem mais de algumas centenas de regras, divididas em / 12. -
Regras agregadas: gostaria de colocar uma ideia razoável de que as listas de endereços que você está usando não foram otimamente agregadas. Mesmo que eles tenham sido para um único país, uma vez que você tenha as listas de vários países juntos, pode haver blocos adjacentes vindos de diferentes países que você poderia juntar. Por exemplo, digamos que alguém na China tenha
192.0.2.0/25
e alguém em Hong Kong tenha192.0.2.128/25
(sim, blocos não realistas, mas a RFC5737 só nos fornece um / 24 para documentação). Você pode agregar isso em192.0.2.0/24
e salvar uma regra para você mesmo.Depois de começar a fazer isso, muitas vezes você pode reduzir o número de regras na sua lista significativamente . (Combinado com a próxima regra, você pode reduzir sua lista de regras pela metade ou mais.) Implementar a agregação é fácil; a ferramenta
netmask
receberá uma lista arbitrária de blocos e retornará uma lista mínima de blocos CIDR:netmask -c 192.0.2.0/25 192.0.2.128/25 192.0.3.0/24 192.0.1.0/25 192.0.1.0/25 192.0.2.0/23
-
Regras negativas: muitas vezes, você verá que um grande número de pequenos blocos é agregado em um único bloco muito maior, exceto por um pequeno bloco no meio. Em alguns casos, quase um / 8 ou / 10 inteiro é alocado para um país, exceto por alguns poucos / 22s pouco complicados que de alguma forma escaparam para outra parte do mundo. Nesse caso, você pode colocar as regras
ACCEPT
para esses poucos blocos de lista branca, seguidos por uma regra deDROP
para o bloco maior de cobertura. Trabalhar os blocos ótimos exigirá algum grau de programação, mas não é ciência de foguetes.
Uma coisa a notar: os blocos de IP mudam sua localização geográfica regularmente, especialmente nestes "tempos finais" do IPv4. Certifique-se de não apenas ignorar e esquecer este conjunto de regras. Obtenha cópias atualizadas das listas geográficas e recrie sua lista de filtros com base nelas. Caso contrário, um dia você verá que um bloco que você filtrou foi aceito pelo seu próprio provedor, e você se bloqueará do seu próprio servidor porque um endereço IP que você bloqueou anteriormente foi atribuído a você. (História verdadeira)