10.000 entradas no iptables no CentOS 4GB Ran, dual core 2.3ghz?

1

Estou executando uma caixa Linux com o FreePBX / Astrisk instalado. Eu bloqueei a China e Hong Kong usando listas de ip2location. com.br / blockvisitorsbycountry.aspx site. Meu fail2ban estava saindo como a cada 3-9 minutos com blocos e agora eu tenho tentativas muito limitadas geralmente em torno de 8-10 por dia agora. Eu adoraria bloquear mais, mas temo que, se adicionar mais 10k às mesas, eu possa acelerar o sistema de volta às idades da pedra. O que você acha?

    
por Chad Taylor 16.08.2015 / 01:58

3 respostas

9

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.

  1. 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.
  2. 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
    
  3. "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 corrente geofilter é 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.

  4. 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 tenha 192.0.2.128/25 (sim, blocos não realistas, mas a RFC5737 só nos fornece um / 24 para documentação). Você pode agregar isso em 192.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
    
  5. 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 de DROP 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)

    
por 16.08.2015 / 03:06
6

O principal problema com as regras iptables é que elas são executadas em sequência e com um grande conjunto de regras, as probabilidades são algumas regras que precisam ser analisadas antes que um pacote receba acesso ou seja rejeitado.

A resposta da Womble já explica algumas estratégias para reduzir essa penalidade de processamento, ordenando inteligentemente as regras e onde eu concordo O mais importante é o uso de uma configuração de firewall de estado , onde apenas conexões NOVAS são examinadas em relação ao conjunto de regras completo e, uma vez pacote inicial estabelecendo que a conexão foi examinada e aprovada, todos os pacotes subseqüentes nessa mesma conexão recebem acesso.

Supondo que agora você tem várias regras DROP bloqueando visitantes,

# Source: http://www.ip2location.com/free/visitor-blocker
iptables -A INPUT -s 1.0.1.0/24 -j DROP
iptables -A INPUT -s 1.0.2.0/23 -j DROP
iptables -A INPUT -s 1.1.0.0/24 -j DROP
iptables -A INPUT -s 1.1.2.0/23 -j DROP
iptables -A INPUT -s 1.1.8.0/21 -j DROP
iptables -A INPUT -s 119.15.136.0/21 -j DROP
iptables -A INPUT -s 119.16.0.0/16 -j DROP
iptables -A INPUT -s 119.18.192.0/20 -j DROP
iptables -A INPUT -s 119.18.208.0/21 -j DROP

Essas regras podem ser reduzidas a uma regra única do iptables usando ipset utilitário .

Um conjunto de IP é uma lista de endereços de rede e / ou intervalos mantida pelo kernel e a correspondência é muito mais rápida do que as regras de correspondência sequencial em iptables.

Crie primeiro um conjunto de IPs (o manual recomenda o tipo hash:net para tamanhos de blocos aleatórios):

ipset create blacklist-china hash:net hashsize 4096

Adicione os intervalos do CIDR que você deseja bloquear:

ipset add blacklist-china 1.0.1.0/24
ipset add blacklist-china 1.0.2.0/23
ipset add blacklist-china 1.1.0.0/24
ipset add blacklist-china 1.1.2.0/23
ipset add blacklist-china 1.1.8.0/21
ipset add blacklist-china 119.15.136.0/21
ipset add blacklist-china 119.16.0.0/16
ipset add blacklist-china 119.18.192.0/20
ipset add blacklist-china 119.18.208.0/21

Sua configuração de firewall agora está reduzida a:

 iptables -m set --match-set blacklist-china src -j DROP
    
por 16.08.2015 / 14:06
3

Ainda uma outra maneira é usar o módulo iptables ' xt_geoip . Embora eu não tenha testado isso para desempenho em relação a ipsets (se eu entendi a fonte corretamente, xt_geoip usa a pesquisa binária d & c, enquanto ipsets usa hashes). A vantagem disso é provavelmente uma atualização fácil.

Por exemplo, o Ubuntu está enviando isto por padrão em xtables-addons-dkms .

    
por 16.08.2015 / 18:58