Servidor Laggy, parece que o iptables está fazendo a carga

5

Adicionei alguns milhares de IPs em várias / 24 classes a uma caixa do CentOS e, por causa disso, estou sendo digitalizado dia e noite. Como este servidor será um cavalo de batalha e só precisará estar disponível no SSH (porta SSH alterada) e http / s, acabei bloqueando as portas de email e as respostas de ping. Isso resolveu o alto tempo de resposta sobre http / s, mas o iptables aumentou a carga no servidor.

Estou recebendo:

top - 22:01:30 up 2 days, 10:17,  3 users,  load average: 1.99, 2.23, 2.07
Tasks: 198 total,   2 running, 195 sleeping,   0 stopped,   1 zombie
Cpu(s):  1.0%us,  5.1%sy,  0.0%ni, 85.0%id,  0.0%wa,  0.0%hi,  8.8%si,  0.0%st
Mem:  16638532k total,  2692948k used, 13945584k free,   206992k buffers
Swap:  8193140k total,        0k used,  8193140k free,  2093204k cached

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 7091 root      23   0 25704  23m  512 R 72.5  0.1   0:02.26 iptables
28507 root      15   0 10236 3308 2684 S  4.5  0.0   0:51.00 sshd

Como posso resolver esse problema, já que o servidor é muito lento ao fazer coisas básicas, como aceitar um comando via SSH? Eu vou estar olhando para um firewall de hardware nos próximos meses, mas até então o problema tem que ser resolvido com uma solução de software.

    
por petru 02.01.2013 / 21:12

2 respostas

3

Adicione um firewall de hardware. O MIkrotik tem ótimos novos - SERIAMENTE, 2 núcleos para cada porta de rede, rodando a 1.2ghz.

Nesse meio tempo, você pode tentar otimizar suas regras de iptable. É praticamente isso - se o processamento de regras levar muito tempo, otimize-os para serem mais rápidos.

    
por 02.01.2013 / 21:15
10

Existem algumas coisas que você pode fazer para otimizar seus iptables:

  1. Remova as regras que não fazem nada. Qualquer regra sem um destino ( -j <something> ) não faz nada ao pacote, portanto, a menos que você esteja usando essas regras para contabilidade, elas são inúteis e devem ser removidas.

  2. Dividir regras em cadeias. Um pacote tem que ser comparado com todas as regras até encontrar um alvo ou o fim da cadeia onde ele usa a política. Se você criar cadeias para grupos de IPs que podem ser combinados com uma regra simples, você poderá reduzir drasticamente o número de regras que devem ser comparadas para cada pacote. Algo parecido com isto:

    :group0 ACCEPT [0:0]
    :group1 ACCEPT [0:0]
    :group2 ACCEPT [0:0]
    :group3 ACCEPT [0:0]
    :group4 ACCEPT [0:0]
    -A INPUT -d 10.0.0.0/24 -j group0
    -A INPUT -d 10.0.0.1/24 -j group1
    -A INPUT -d 10.0.0.2/24 -j group2
    -A INPUT -d 10.0.0.3/24 -j group3
    -A INPUT -d 10.0.0.4/24 -j group4
    -A group0 -d 10.0.0.1 -i ! lo -p tcp -m tcp --sport 80
    ...etc 
    

    Em seguida, coloque todas as regras para 10.0.0.0/24 na cadeia group0 . Supondo que você tenha uma regra para cada um dos 65.536 endereços IP em 10.0.0.0/16 , o número de comparações de piores casos que um pacote teria que passar nessa configuração é 512. Muito melhor que as 65.536 comparações a cada pacote tem que passar se eles estão todos na mesma cadeia. Não precisa ser o intervalo de IP de destino que você divide, pode ser o número da porta ou qualquer outro aspecto de um pacote que o IPTables possa corresponder.

  3. Se você estiver usando isso para fins de contabilidade, use uma porta de espelhamento no seu switch para enviar uma cópia de todo esse tráfego para uma caixa separada. Faça com que o firewall de roteamento principal seja executado com o número mínimo de regras que atinge suas metas de segurança. (Também pode haver uma maneira melhor de lidar com contabilidade que não seja iptables, mas essa não é a minha área.)

  4. Coloque os alvos em todas as regras. A menos que você deseje que corresponda a todas as três regras a seguir, é melhor que você tenha um -j ACCEPT em todas as regras. Se você quiser combinar todos eles, tenha o ACCEPT no último. Dessa forma, você não precisa fazer comparações para regras que nunca serão iguais.

    -A acctboth -s 93.xyx.40.250 -i ! lo -p tcp -m tcp --dport 80
    -A acctboth -s 93.xyx.40.250 -i ! lo -p tcp
    -A acctboth -s 93.xyx.40.250 -i ! lo
    
  5. Consolidar regras. Como a lógica do seu firewall é muito simples, você poderia substituir a coisa toda por cerca de 10 regras - apenas aquelas com -j TARGET .

  6. Remova regras duplicadas e redundantes. Essas regras não parecem muito bem ordenadas ou organizadas. Eu ficaria surpreso se você não tivesse regras duplicadas em algum lugar. Eu também ficaria surpreso se, com alguns milhares de IPs, algumas das regras que você tem são para IPs que você não tem mais. Encontre e remova-os.

  7. Não combine as correntes para INPUT e OUTPUT. Coloque as regras -s <IP> na cadeia OUTPUT e as regras -d <IP> na cadeia INPUT e livre-se das regras -j acctboth e da corrente acctboth . Novamente, isso reduz o número de regras que devem ser verificadas antes de uma correspondência ser encontrada.

  8. Ordene as regras para que as metas correspondidas com mais frequência sejam listadas primeiro. Você pode ver contagens legíveis com iptables -L -nv e números brutos com iptables -L -nvx . Se você tiver pacotes que se beneficiam mais de baixa latência (como pacotes na porta 22), coloque-os mais cedo na lista do que pacotes que se beneficiam menos (como a porta 25).

por 03.01.2013 / 11:34