Usando o iptables para bloquear os IPs que solicitaram um recurso HTTP específico

1

No momento, estou sendo inundado por solicitações para /wpad.dat - de uma maneira que faz com que pareça ser um ataque.

Agora, o que eu gostaria de fazer é disparar o iptables para cada IP que requisitar o /wpad.dat e depois adicioná-lo a uma lista negra. Existe uma maneira de fazer isso? Isso significa que o IP poderá enviar uma solicitação de inundação e, em seguida, nenhuma.

Alguma maneira simples de fazer isso de forma eficiente?

    
por Sandman 24.05.2013 / 15:18

2 respostas

2

Você pode considerar que existem outras maneiras de bloquear endereços IP. Por exemplo, Fail2ban foi projetado para verificar arquivos de log para determinados padrões e temporariamente bloquear IPs.

Como mencionado nos comentários, você pode estar adicionando milhares de IPs à sua lista negra. Enquanto iptables funciona, cada regra adicional pode aumentar o tempo de processamento de cada solicitação. Você pode usar ipset como alternativa, o que parece ser muito mais rápido quando há muitos IPs adicionados. É preciso uma abordagem hash para acelerar as partidas. Consulte Endereços IP de bloqueio em massa com o ipset para obter detalhes e comparação entre iptables e ipset .

Se você quiser usar iptables , provavelmente dependerá de como o seu servidor da web está configurado. Supondo que você use o apache ou o nginx, você pode configurá-lo para acionar um script cgi de algum tipo para ser executado quando wpad.dat for solicitado.

Por exemplo, se o seu site já usa php, você pode usar uma reescrita interna para acionar um script php (ou ruby / python / java, dependendo do idioma que você usa normalmente).

Quando o script for executado, basta executá-lo para executar algo assim na linha de comando:

iptables -I INPUT -s {IP-HERE} -j DROP

O script precisa ser executado como root, e provavelmente não é uma boa idéia dar privilégios root ao usuário da web, assim você pode empacotá-lo como um script de shell, chown it como root e usar setuid disso.

Grande aviso: você pode bloquear-se acidentalmente se visitar esse recurso, portanto, convém definir --dport na porta 80 ou algo do tipo. Isso evita pelo menos bloquear o seu protocolo ssh, então se você conseguir se bloquear, você pode ssh em seu servidor e se auto-bloquear.

Expiry: Como bloquear permanentemente muitos endereços IP raramente é uma boa ideia, talvez você queira controlar o endereço IP bloqueado (talvez anexá-lo em um arquivo de log) e criar um cron job para excluir esses endereços IP periodicamente. Você só precisa executar algo como:

iptables -D INPUT -s 192.168.1.100 -j DROP
    
por 24.05.2013 / 15:34
1

Bloquear automaticamente não é exatamente trivial com iptables, mas você pode limitar as conexões para não sobrecarregar todos os seus recursos adicionando esta regra:

iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m limit --limit 50/minute --limit-burst 200 -j ACCEPT

    
por 24.05.2013 / 15:37