%20.png)
Estou sob um ataque DDOS direcionado ao servidor http, tento iptables e outras medidas, mas nada parece funcionar. Aqui está parte do access_log:
Muitas conexões, mas o iptables não impedirá o ataque, existem minhas regras do iptables:
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -s 147.135.37.113 -j ACCEPT
iptables -A INPUT -f -j DROP
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -N LOG_AND_DROP
iptables -N PORT21
iptables -A PORT21 -m recent --set --name lp21
iptables -A PORT21 -m recent --update --seconds 30 --hitcount 3 --name lp21 -j DROP
iptables -A PORT21 -m recent --update --seconds 300 --hitcount 10 --name lp21 -j LOG_AND_DROP
iptables -N PORT22
iptables -A PORT22 -m recent --set --name lp22
iptables -A PORT22 -m recent --update --seconds 30 --hitcount 3 --name lp22 -j DROP
iptables -A PORT22 -m recent --update --seconds 300 --hitcount 10 --name lp22 -j LOG_AND_DROP
iptables -N PORT80
iptables -A PORT80 -m recent --set --name lp80
iptables -A PORT80 -m recent --update --seconds 30 --hitcount 20 --name lp80 -j LOG_AND_DROP
iptables -N PORT443
iptables -A PORT443 -m recent --set --name lp433
iptables -A PORT443 -m recent --update --seconds 30 --hitcount 20 --name lp443 -j LOG_AND_DROP
iptables -N PORT10000
iptables -A PORT10000 -m recent --set --name lp10000
iptables -A PORT10000 -m recent --update --seconds 30 --hitcount 20 --name lp10000 -j LOG_AND_DROP
iptables -N PORT6900
iptables -A PORT6900 -m recent --set --name lp6900
iptables -A PORT6900 -m recent --update --seconds 30 --hitcount 10 --name lp6900 -j LOG_AND_DROP
iptables -A PORT6900 -m recent --update --seconds 50 --hitcount 20 --name lp6900 -j LOG_AND_DROP
iptables -N PORT6121
iptables -A PORT6121 -m recent --set --name lp6121
iptables -A PORT6121 -m recent --update --seconds 30 --hitcount 10 --name lp6121 -j LOG_AND_DROP
iptables -A PORT6121 -m recent --update --seconds 50 --hitcount 20 --name lp6121 -j LOG_AND_DROP
iptables -N PORT5121
iptables -A PORT5121 -m recent --set --name lp5121
iptables -A PORT5121 -m recent --update --seconds 30 --hitcount 10 --name lp5121 -j LOG_AND_DROP
iptables -A PORT5121 -m recent --update --seconds 50 --hitcount 20 --name lp5121 -j LOG_AND_DROP
iptables -A INPUT -p icmp --icmp-type echo-request -m hashlimit --hashlimit-name pings --hashlimit-mode srcip --hashlimit 10/min --hashlimit-burst 10 --hashlimit-htable-expire 30000 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 5/min -j LOG --log-prefix "[Pings]"
iptables -A INPUT -p icmp -j DROP
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -m state --state NEW -j PORT21
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j PORT22
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j PORT80
iptables -A INPUT -p tcp --dport 443 -m state --state NEW -j PORT443
iptables -A INPUT -p tcp --dport 10000 -m state --state NEW -j PORT10000
iptables -A INPUT -p tcp --dport 6900 -m state --state NEW -j PORT6900
iptables -A INPUT -p tcp --dport 6121 -m state --state NEW -j PORT6121
iptables -A INPUT -p tcp --dport 5121 -m state --state NEW -j PORT5121
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -m hashlimit --hashlimit-name p80 --hashlimit-mode srcip --hashlimit 50/min --hashlimit-burst 100 --hashlimit-htable-expire 10000 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -m hashlimit --hashlimit-name p443 --hashlimit-mode srcip --hashlimit 50/min --hashlimit-burst 100 --hashlimit-htable-expire 10000 -j ACCEPT
iptables -A INPUT -p tcp --dport 10000 -m hashlimit --hashlimit-name p10000 --hashlimit-mode srcip --hashlimit 50/min --hashlimit-burst 100 --hashlimit-htable-expire 10000 -j ACCEPT
iptables -A INPUT -p tcp --dport 6900 -j ACCEPT
iptables -A INPUT -p tcp --dport 6121 -j ACCEPT
iptables -A INPUT -p tcp --dport 5121 -j ACCEPT
iptables -A LOG_AND_DROP -m limit --limit 10/min -j LOG --log-prefix "[Log]"
iptables -A LOG_AND_DROP -j DROP
#iptables -A INPUT -m limit --limit 10/min -j LOG --log-prefix "[Default]"
iptables -A INPUT -d 147.135.37.113 -j DROP
Qualquer conselho será bem-vindo. Eu tento de tudo, mas nada funciona.
Responder1
Fale com o seu provedor (parecido com a OVH) sobre as proteções anti-ddos no seu sistema. Nem todos, mas a maioria dos fornecedores confiáveis tem maneiras de ajudá-lo com isso. Além disso, você pode considerar fazer uma regra fail2ban sofisticada que monitora os logs do seu servidor web para qualquer cliente que acesse esse URL foro e apenas adicionar automaticamente uma regra IPTables para eles. Além disso, você pode colocar algo lá... talvez um arquivo bem pequeno de 1 byte? Ou coloque seu servidor web atrás de algo como cloudflare ou algum outro serviço CDN. A maior parte desse tráfego pode ser tratada de várias maneiras e não deve sobrecarregar tanto o seu servidor ou você. Cuidado com os arquivos de log que preenchem seu sistema de arquivos! Isso pode criar um outro problema que ninguém deseja.
confira isto para obter mais informações sobre como usar o fail2ban para proteger o Apache contra ataques DoS:https://apache.tutorials24x7.com/blog/protect-apache-from-brute-force-and-ddos-attacks-using-fail2ban
Responder2
O problema foi resolvido com este simples iptables (talvez as outras regras fossem muito confusas)
iptables -A INPUT -i eno1 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eno1 -m state --state INVALID -j DROP
iptables -A INPUT -i eno1 -p tcp -m tcp --dport 22 -m state --state NEW -j ACCEPT
iptables -A INPUT -i eno1 -p tcp -m tcp --dport 21 -m state --state NEW -j ACCEPT
iptables -A INPUT -i eno1 -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT
iptables -A INPUT -i eno1 -p tcp -m tcp --dport 443 -m state --state NEW -j ACCEPT
iptables -A INPUT -i eno1 -p icmp -j ACCEPT
iptables -A INPUT -i eno1 -j DROP
Os ataques continuam chegando, mas não colapsam o servidor.
Responder3
Algumas coisas me vêm à mente:
- Você poderia usar string-match com iptables:
iptables -A INPUT -m string --algo bm --string "GET /foro" -j DROP
ou se possível no seu sistema, com TARPIT
iptables -A INPUT -m string --algo bm --string "GET /foro" -j TARPIT
- Em vez de usar fail2ban, crie seu próprio script que verifica os logs das últimas 1000 linhas, por exemplo, e bloqueia correspondências com ipsets. Adicione isto ao seu script iptables:
- ipset destruir banheiro
- ipset -N banheiro iphash
- vaso sanitário com descarga ipset
Em seguida, use seu script para adicionar endereços IP que você deseja bloquear no arquivo de texto. Eventualmente, você só precisa fazer um loop de todos os endereços IP para essa lista de banheiros.
- ipset -A banheiro "$ipaddress"
Usar ipset e especialmente máscaras é uma forma muito mais eficiente do que bloquear endereços IP. Tenho cerca de 20.000 endereços bloqueados e cerca de 200 redes.
Você pode ter algumas idéias do meu roteiro muito confuso. https://pastebin.com/4v5se0kh
Eu sei que é confuso, mas funciona para mim muito mais rápido e é muito mais fácil que o fail2ban. Chamei esse script de suc2ban. Você só precisa encontrar suas próprias correspondências para o seu arquivo de log (você provavelmente tem o apache access.log, em vez do meu exemplo que usa auth.log).