fail2ban análise de log muito lento em Raspberry Pi - opções?

4

Estou executando o fail2ban em um Raspberry Pi a 950 MHz, o qual não posso fazer overclock ainda mais.

O Pi está ocasionalmente sujeito a inundações SYN em portas específicas. Eu configurei o iptables para limitar a taxa de SYNs na porta de interesse; quando os limites de aceleração são excedidos, os hosts que enviam SYNs são descartados na cadeia REJECT e o pacote SYN específico que excedeu o limite é registrado.

O fail2ban vigia esses SYNs registrados e, depois de ver alguns, bane temporariamente o host por um curto período de tempo (esse é um problema temporário no aplicativo com o qual estou trabalhando).

O problema é que as inundações SYN podem ocasionalmente atingir taxas que são muito rápidas para o fail2ban acompanhar; Vou ver 20-40 mensagens de log por segundo e, eventualmente, o fail2ban fica para trás e se torna ineficaz. Para adicionar insulto à injúria, ele continua consumindo MUITO CPU enquanto tenta recuperar o atraso.

Eu verifiquei que pacotes DROP encadeados de hosts já banidos pelo fail2ban não são não registrados e, portanto, não aumentam sua carga.

Quais são minhas opções aqui? Tenho algumas ideias, mas não tenho um caminho claro.

  1. Eu poderia tornar a regex log-parse "mais fácil", por isso, leva menos ciclos? Usando o iptables --log-prefix para colocar um token próximo ao início da mensagem de log e / ou simplificando / alterando a ajuda do regex fail2ban? Aqui está a linha de configuração atual do fail2ban que contém um regex:
    failregex = kernel:.*?SRC=(?:::f{4,6}:)?(?P<host>[\w\-.^_]+) DST.*?SYN

  2. Existe uma maneira mais rápida de o fail2ban observar os pacotes excedendo os limites da análise do kern.log?

  3. Poderia o fail2ban ser executado sob o PyPy em vez do CPython com um mínimo de magia não padrão (o SO é o Raspbian 7, portanto, principalmente o Debian 7)?

  4. Existe algo melhor que o fail2ban que eu poderia usar para observar os pacotes que excedem os limites SYN, e depois que N exceder em X segundos, coloque temporariamente o IP ofensivo no bucket DROP do iptables e retire-o quando o temporizador de proibição expira? Novamente, eu prefiro muito mais uma solução que use tanto software disponível no Debian quanto possível, embora eu possa construir pacotes Debian em um piscar de olhos.

por Gordon Morehouse 28.10.2013 / 01:10

2 respostas

1

Um pouco fora do assunto da sua pergunta, mas os cookies SYN podem ser uma atenuação adequada e simples quando confrontados com inundações SYN moderadas.

# echo 1 > /proc/sys/net/ipv4/tcp_syncookies

Google algumas razões pelas quais isso pode ser uma boa ou má idéia.

Como alternativa, já que você já tem um firewall de kernel configurado, você pode usar o módulo iptables "recente" como limitador contornando o fail2ban inteiramente:

# iptables -A INPUT -p tcp -m state --state NEW -m recent --name ftp_limit --update --seconds 60 --hitcount 20 -j DROP
# iptables -A INPUT -p tcp -m state --state NEW -m recent --set --name ftp_limit -m tcp --dport 21 -j ACCEPT

Essas regras limitam a taxa de solicitações SYN (novas conexões) de um IP a 20 por minuto (linha 1) para endereços IP na lista chamada ftp_limit e DROP quaisquer solicitações adicionais. A linha 2 adicionará o endereço IP de origem à lista ftp_limit sempre que uma nova conexão estiver sendo estabelecida na porta 21 (ftp).

Você corre o risco de bloquear o tráfego legítimo originado de redes por trás do NAT, já que elas parecem ter origem em um único endereço IP. E talvez você queira colocar na lista de permissões algumas redes confiáveis também.

    
por 28.10.2013 / 16:23
0

Como eu disse nos meus comentários.

Mude para o CSF, ele tem uma área de memória maior, mas se eu tivesse que escolher entre o alto uso de CPU do ARM e o alto uso geral de memória, eu escolheria o último.

Outra alternativa seria abandonar usando qualquer software de firewall e mudar para as regras do iptables. Mova o servidor para uma porta não padrão (8030, 24544, etc.) e use o iptables para descartar conexões em todas as outras portas.

Se você estiver por trás do NAT, poderá usar seu roteador para desabilitar o encaminhamento de porta em todas as portas, exceto a do servidor da Web (supondo que você o configurou para atender em outra porta).

    
por 28.10.2013 / 02:03