Proteger un servidor de ataques DDoS con Iptables (Parte 1/2)

Proteger un servidor de ataques DDoS con Iptables (Parte 1 de 2).

Tal como adelantamos en un articulo anterior, hoy veremos como configurar Iptables para intentar protegernos de ataques DDos.

Existen varias formulas de frenar ataques DDos, ninguna te puede garantizar una protección absoluta, paro si que iptables te ofrecerá mas fiabilidad que el resto.

Las vemos:

  1. Protección a nivel de PHP: Bloquea acceso total de bots, de modo que no haya excesiva carga. No es una buena solución.
  2. Protección a nivel de Apache: Usando el módulo mod_evasive. Tampoco es una solución efectiva.
  3. Nivel de protección nginx: Excelente solución con la cual podras evitar muchos ataques. Veremos como en un próximo articulo. muchos ataques.
  4. Protección con iptables: Con una configuración apropiada, es una de las soluciones más efectivas y confiables a la hora de proteger un servidor. En este articulo trataremos esta opción.

Proteger un servidor de ataques DDoS con Iptables (Parte 1/2) 1

 

Evitar ataques DDos con iptables

Obtener listado de módulos disponibles en iptables.

ls /lib/modules/$(uname -r)/kernel/net/ipv4/netfilter/

ejemplo…

arptable_filter.ko ipt_MASQUERADE.ko nf_nat_pptp.ko
arp_tables.ko ipt_REJECT.ko nf_nat_proto_gre.ko
arpt_mangle.ko ipt_rpfilter.ko nf_nat_snmp_basic.ko
iptable_filter.ko ipt_SYNPROXY.ko nf_reject_ipv4.ko
iptable_mangle.ko nf_conntrack_ipv4.ko nf_tables_arp.ko
iptable_nat.ko nf_defrag_ipv4.ko nf_tables_ipv4.ko
iptable_raw.ko nf_dup_ipv4.ko nft_chain_nat_ipv4.ko
iptable_security.ko nf_log_arp.ko nft_chain_route_ipv4.ko
ip_tables.ko nf_log_ipv4.ko nft_dup_ipv4.ko
ipt_ah.ko nf_nat_h323.ko nft_masq_ipv4.ko
ipt_CLUSTERIP.ko nf_nat_ipv4.ko nft_redir_ipv4.ko
ipt_ECN.ko nf_nat_masquerade_ipv4.ko nft_reject_ipv4.ko

Si quieres obtener info sobre todos los módulos.

modinfo /lib/modules/$(uname -r)/kernel/net/ipv4/netfilter/*.ko

 

Protegernos contra ataques DDos SYN flood

Es el ataque más común, consiste en el envío de una gran cantidad de paquetes SYN al servidor.

Puedes revisar las conexiones abiertas con netstat. En un articulo anterior puedes ver como…

Bueno… comenzamos a editar.

Debemos establecer tcp_syncookies en 1 (de manera predeterminada tiene ese valor), puedes comprobarlo con:

cat /proc/sys/net/ipv4/tcp_syncookies

# ejemplo
1

Verificamos las conexiones máximas abiertas, tcp_max_syn_backlog (normalmente 1024).
cat /proc/sys/net/ipv4/tcp_max_syn_backlog

Aumentamos el máximo de conexiones.
echo "40000" > /proc/sys/net/ipv4/tcp_max_syn_backlog

Ahora verificamos el tiempo de espera de la conexión, el parámetro a usar es tcp_synack_retries.
cat /proc/sys/net/ipv4/tcp_synack_retries

De manera predeterminada la espera es 5, que equivalen a «180» segundos. El tiempo de espera es excesivo, lo reduciremos a 1 que equivale a 9 segundos.
echo "1" > /proc/sys/net/ipv4/tcp_synack_retries
Verificamos el tcp_fin_timeout, un valor ideal es 30. Si tienes otro valor lo modificas tal como te indico.
cat /proc/sys/net/ipv4/tcp_fin_timeout

# Ejemplo
60

Modificamos el valor a 30.
echo "30" > /proc/sys/net/ipv4/tcp_fin_timeout

Revisamos la opción tcp_keepalive_probes (se usa para que una vez completada la conexión se considerará interrumpida).
cat /proc/sys/net/ipv4/tcp_keepalive_probes

Por defecto es 9, la estableceremos en 5.
echo "5" > /proc/sys/net/ipv4/tcp_keepalive_probes

También reduciremos el tcp_keepalive_intvl.

Verificamos el valor actual, por defecto 75.

cat /proc/sys/net/ipv4/tcp_keepalive_intvl

Aplicamos un valor 15.
echo "15" > /proc/sys/net/ipv4/tcp_keepalive_intvl

Proteger un servidor de ataques DDoS con Iptables (Parte 1/2) 2

 

netdev_max_backlog se usa para especificar el número máximo de paquetes por cola de procesamiento, para que lo entiendas mejor… en caso de ataques DDos la interfaz recibirá los paquetes mucho más rápido de lo que el kernel puede procesar. Lo verificamos.

cat /proc/sys/net/core/netdev_max_backlog

Por defecto 1000, lo aumentaremos a 20.000.
echo "20000" > /proc/sys/net/core/netdev_max_backlog

El número máximo de sockets abiertos esperando una conexión, también debe ser aumentado a 20.000.
echo "20000" > /proc/sys/net/core/somaxconn

Modificamos el tcp_syncookies.
echo 1 > /proc/sys/net/ipv4/tcp_syncookies

 

Ya tenemos gran parte de nuestro servidor protegido (continua en el siguiente articulo), pero claro… las reglas de iptables no son permanentes, por tanto en el momento que reiniciemos el servidor se perderán.

Hacemos que sean permanentes:

nano /etc/rc.local

Copia y pega lo siguiente…
echo "20000" > /proc/sys/net/ipv4/tcp_max_syn_backlog
echo "1" > /proc/sys/net/ipv4/tcp_synack_retries
echo "30" > /proc/sys/net/ipv4/tcp_fin_timeout
echo "5" > /proc/sys/net/ipv4/tcp_keepalive_probes
echo "15" > /proc/sys/net/ipv4/tcp_keepalive_intvl
echo "20000" > /proc/sys/net/core/netdev_max_backlog
echo "20000" > /proc/sys/net/core/somaxconn

Guarda y cierra el editor.

Añadimos las restricciones a iptables.

iptables -N syn_flood

iptables -A INPUT -p tcp --syn -j syn_flood

iptables -A syn_flood -m limit --limit 500/s --limit-burst 2000 -j RETURN

iptables -A syn_flood -j DROP

Hemos establecido un limite para los nuevos paquetes SYN (500 por segundo), y al usar el límite de 2000, los nuevos paquetes serán bloqueados.

 

Continua en el articulo siguiente.

4 Comentarios

  1. Juan Carlos Felipe Villaggi
    23/03/2019
    • sololinux
      23/03/2019
  2. Jhon Ramírez Pérez
    04/09/2019
    • sololinux
      04/09/2019

Agregar comentario