Por favor tenga en cuenta que soyNOpreguntando cómo proteger el servidor deDDoS. Lo que quiero decir es que si alguien ejecuta siege -c 1000 www.example.com
su VPS. Eso hará que mi servidor atienda miles de solicitudes y se ralentice. Si ejecuto un asedio dirigido a, por ejemplo, alojamiento compartido, no veo la caída extrema en la capacidad de respuesta (de 60 ms a 2000 ms/solicitud) que veo en mi máquina. No espero poder mitigar grandes DDoS, pero me gustaría estar a salvo del primer asedio de descubrimiento de scripts para niños :) Por otro lado, estoy de acuerdo con el hecho de que cuando grandes cantidades de tráfico provienen de fuentes legítimas, la respuesta puede ser más lenta.
Respuesta1
Puede utilizar un firewall para limitar el número de conexiones simultáneas y la tasa de nuevas conexiones provenientes de una red (por ejemplo, un /32 para IPv4 y un /64 para IPv6). Ejemplo de cómo se vería usando iptables
:
# Limit number of concurrent connections
-A INPUT -i eth0 -p tcp --syn -m connlimit --connlimit-above 50 -j DROP
# Limit rate of new connections
-A INPUT -i eth0 -p tcp --syn -m hashlimit --hashlimit-name tcp --hashlimit-mode srcip --hashlimit-above 3/sec --hashlimit-burst 7 --hashlimit-srcmask 32 -j DROP
(Lo mismo ip6tables
excepto agregar --connlimit-mask 64
al primero y cambiar --hashlimit-srcmask
al 64
segundo).
También puede limitar la tasa de solicitudes HTTP, por ejemplo con elmódulo limit_req de nginx.
Respuesta2
Aparte de algunos firewalls básicos, confiamos en haproxy para realizar el trabajo pesado de TCP. Hemos descubierto que funciona en círculos alrededor de una instancia Apache HTTPd lista para usar en lo que respecta a cualquier tipo de ataque lento.
-A INPUT -p tcp -m tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j SYNFLOOD
-A INPUT -p tcp -m tcp --dport 80 -m state --state NEW -j HTTPDGUARD
-A INPUT -p tcp -m tcp --dport 443 -m state --state NEW -j HTTPDGUARD
-A HTTPDGUARD -m connlimit --connlimit-above 25 --connlimit-mask 32 -j HTTPDENY
-A HTTPDENY -j LOG --log-prefix "HTTP Flood: "
-A HTTPDENY -p tcp -m tcp -j REJECT --reject-with tcp-reset
-A SYNFLOOD -m state --state NEW -m recent --set --name SYNRATE --rsource
-A SYNFLOOD ! -s 150.156.24.0/24 -m state --state NEW -m recent --update \
--seconds 5 --hitcount 200 --name SYNRATE --rsource -j DROP
-A INPUT -p tcp -m tcp --dport 80 -m state --state NEW -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -m state --state NEW -j ACCEPT
Pero básicamente, necesitas bloquear el ataque, arreglar el exploit o hacer ambas cosas.
Respuesta3
falla2banes una de las muchas herramientas que están diseñadas para manejar tal situación. fail2ban funcionó para mí para detener un par de ataques de fuerza bruta en ssh. Supongo que su servidor es Linux.