El ataque DDOS al servidor http e iptables no ayuda (tengo access_log)

El ataque DDOS al servidor http e iptables no ayuda (tengo access_log)

Estoy bajo un ataque DDOS dirigido al servidor http, pruebo iptables y otras medidas, pero nada parece funcionar. Aquí está parte de access_log:

https://pastebin.com/6JFKmUi8

Muchas conexiones pero iptables no detendrá el ataque, ahí están mis reglas de 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

Cualquier consejo será bienvenido. Intento todo pero nada funciona.

Respuesta1

Hable con su proveedor (parece OVH) sobre sus protecciones anti-DDOS en su sistema. No todos, pero la mayoría de los proveedores acreditados tienen formas de ayudarle con esto. Aparte de eso, podría considerar crear una elegante regla fail2ban que observe los registros de su servidor web para detectar cualquier cliente que acceda a esa URL del foro y simplemente agregar automáticamente una regla IPTables para ellos. Aparte de eso, puedes poner algo allí... ¿quizás un archivo muy pequeño de 1 byte? O coloque su servidor web detrás de algo como Cloudflare o algún otro servicio CDN. La mayor parte de ese tráfico se puede gestionar de varias maneras y no debería suponer tanta tensión para su servidor ni para usted. ¡Sin embargo, tenga cuidado con los archivos de registro que llenan su sistema de archivos! Eso puede crear otro problema completamente diferente que nadie quiere.

Consulte esto para obtener más información sobre el uso de fail2ban para proteger Apache de ataques DoS:https://apache.tutorials24x7.com/blog/protect-apache-from-brute-force-and-ddos-attacks-using-fail2ban

Respuesta2

El problema se resolvió con este simple iptables (tal vez las otras reglas eran demasiado 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

Los ataques siguen llegando pero no colapsan el servidor.

Respuesta3

Me vienen a la mente un par de cosas:

  1. Podrías usar string-match con iptables:

iptables -A ENTRADA -m cadena --algo bm --cadena "GET /foro" -j DROP

o si es posible en su sistema, con TARPIT

iptables -A ENTRADA -m cadena --algo bm --cadena "GET /foro" -j TARPIT

  1. En lugar de utilizar fail2ban, cree su propio script que busque registros de las últimas 1000 líneas, por ejemplo, y bloquee las coincidencias con ipsets. Agregue esto a su script de iptables:
  • ipset destruye el inodoro
  • ipset -N inodoro iphash
  • inodoro con descarga ipset

Luego use su secuencia de comandos para agregar las direcciones IP que desea bloquear al archivo de texto. Al final, sólo necesitarás enlazar todas las direcciones IP a esa lista de baños.

  • ipset -Un baño "$direcciónip"

Usar ipset y especialmente máscaras es una forma mucho más eficiente que bloquear direcciones IP. Tengo unas 20.000 direcciones bloqueadas y unas 200 redes.

Quizás obtengas algunas ideas de mi guión muy, muy desordenado. https://pastebin.com/4v5se0kh

Sé que es complicado, pero a mí me funciona mucho más rápido y es mucho más fácil que fail2ban. Llamé a ese script suc2ban. Sólo necesita encontrar sus propias coincidencias para su archivo de registro (probablemente tenga apache access.log, en lugar de mi ejemplo que usa auth.log).

información relacionada