Tuneando el kernel
Lo primero que tenemos que hacer antes de abordar las reglas como tal es
optimizar el kernel para mitigar los efectos de los ataques DDoS. El siguiente
ejemplo se basa en CentOS 7 ya que esta distro incluye una versin reciente
de iptables y soporta synproxy. Slo hay que ponerla en /etc/sysctl.conf y
aplicar la configuracin con sysctl -p:
kernel.printk = 4 4 1 7
kernel.panic = 10
kernel.sysrq = 0
kernel.shmmax = 4294967296
kernel.shmall = 4194304
kernel.core_uses_pid = 1
kernel.msgmnb = 65536
kernel.msgmax = 65536
vm.swappiness = 20
vm.dirty_ratio = 80
vm.dirty_background_ratio = 5
fs.file-max = 2097152
net.core.netdev_max_backlog = 262144
net.core.rmem_default = 31457280
net.core.rmem_max = 67108864
net.core.wmem_default = 31457280
net.core.wmem_max = 67108864
net.core.somaxconn = 65535
net.core.optmem_max = 25165824
net.ipv4.neigh.default.gc_thresh1 = 4096
net.ipv4.neigh.default.gc_thresh2 = 8192
net.ipv4.neigh.default.gc_thresh3 = 16384
net.ipv4.neigh.default.gc_interval = 5
net.ipv4.neigh.default.gc_stale_time = 120
net.netfilter.nf_conntrack_max = 10000000
net.netfilter.nf_conntrack_tcp_loose = 0
net.netfilter.nf_conntrack_tcp_timeout_established = 1800
net.netfilter.nf_conntrack_tcp_timeout_close = 10
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 10
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 20
net.netfilter.nf_conntrack_tcp_timeout_last_ack = 20
net.netfilter.nf_conntrack_tcp_timeout_syn_recv = 20
net.netfilter.nf_conntrack_tcp_timeout_syn_sent = 20
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 10
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.ip_no_pmtu_disc = 1
net.ipv4.route.flush = 1
net.ipv4.route.max_size = 8048576
net.ipv4.icmp_echo_ignore_broadcasts = 1
net.ipv4.icmp_ignore_bogus_error_responses = 1
net.ipv4.tcp_congestion_control = htcp
net.ipv4.tcp_mem = 65536 131072 262144
net.ipv4.udp_mem = 65536 131072 262144
net.ipv4.tcp_rmem = 4096 87380 33554432
net.ipv4.udp_rmem_min = 16384
net.ipv4.tcp_wmem = 4096 87380 33554432
net.ipv4.udp_wmem_min = 16384
net.ipv4.tcp_max_tw_buckets = 1440000
net.ipv4.tcp_tw_recycle = 0
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_orphans = 400000
net.ipv4.tcp_window_scaling = 1
net.ipv4.tcp_rfc1337 = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_timestamps = 1
net.ipv4.tcp_sack = 1
net.ipv4.tcp_fack = 1
net.ipv4.tcp_ecn = 2
net.ipv4.tcp_fin_timeout = 10
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_intvl = 60
net.ipv4.tcp_keepalive_probes = 10
net.ipv4.tcp_no_metrics_save = 1
net.ipv4.ip_forward = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.all.rp_filter = 1
Muchas guas sobre cmo bloquear los ataques DDoS usando iptables utilizan
la tabla de filtros y la cadena INPUT para las reglas anti-DDoS. El problema con
este enfoque es que la cadena de INPUT slo se procesa despus de las
cadenas PREROUTING y FORWARD y, por lo tanto, slo se aplica si el paquete
no coincide con ninguna de estas dos cadenas. Esto provoca un retraso en el
filtrado de los paquetes que consume recursos.
Por ello, para hacer las reglas ms eficaces, tenemos que hacer que nuestro
anti-DDoS utilice el menor nmero de cadenas posible. La primera cadena que
puede aplicarse a un paquete es la cadena PREROUTING, por lo que lo ideal es
filtrar el mximo de paquetes en esa cadena. Sin embargo, la tabla de filtros o
filter no es compatible con la cadena PREROUTING. Para solucionar este
problema, podemos simplemente utilizar la tabla mangle en lugar de la tabla
de filtros para nuestras reglas de iptables anti-DDoS ya que es compatible con
la mayora, si no todas, las reglas.
Ahora bien, los ataques DDoS son complejos. Hay muchos tipos diferentes de
DDoS y es casi imposible mantener reglas basadas en firmas contra todos
ellos. Pero por suerte hay algo llamado seguimiento de conexiones (el mdulo
del kernel nf_conntrack) que nos puede ayudar a mitigar casi cualquier ataque
DDoS basado en TCP que no utilizan paquetes SYN que parecen legtimos. Esto
incluye todos los tipos de ataques DDoS ACK y SYN-ACK, as como ataques
DDoS que utilizan flags TCP falsos.
Vamos a empezar slo con cinco reglas de iptables sencillas que detendrn
muchos ataques DDoS basados en TCP.
1.- Bloquear paquetes no vlidos: Esta regla bloquea todos los paquetes que
no son un paquete SYN y no pertenecen a una conexin TCP establecida.
2.- Bloquear nuevos paquetes que no son SYN: Esto bloquea todos los
paquetes que son nuevos (no pertenecen a una conexin establecida) y no
utilizan el indicador SYN, complementa la regla anterior.
4.- Bloquear paquetes con flags TCP falsos: el siguiente conjunto de reglas
bloquea paquetes que utilizan indicadores TCP falsos, es decir, flags TCP que
los paquetes legtimos no usaran.
Reglas adicionales
1.- Bloquear de ICMP: Esto descarta todos los paquetes ICMP. ICMP se utiliza
sobretodo para hacer ping a un host para averiguar si todava est vivo. Se
suele utilizar para troubleshooting pero representa una vulnerabilidad que los
atacantes pueden explotar, as que es recomendable bloquear todos los
paquetes ICMP para mitigar Ping de la Muerte (ping flood), ICMP flood y ICMP
fragmentation flood.
3.- Limitar las nuevas conexiones TCP que un cliente puede establecer por
segundo: esto puede ser til contra los ataques de conexin, pero no tanto
contra inundaciones SYN porque suelen usar un sinfn de direcciones IP
diferentes.
5.- Limitar los paquetes TCP RST entrantes: podra mitigar este tipo de
inundaciones pero su efectividad es cuestionable.
Aqu estn las reglas de iptables synproxy que ayudan a mitigar las
inundaciones SYN que omiten las otras reglas:
Estas reglas se aplican a todos los puertos. Si deseas utilizar synproxy slo en
determinados puertos TCP (es recomendable tambin bloquear todos los
puertos TCP que no estn en uso utilizando la tabla mangle y la cadena
PREROUTING), puedes por ejemplo simplemente aadir --dport 80 a cada una
de las reglas si quieres utilizar synproxy en el puerto 80 solamente.
Para verificar que synproxy est funcionando puedes hacer 'watch -n1 cat
/proc/net/stat/synproxy'. Si los valores cambian cuando se establece una
nueva conexin TCP con el puerto que utiliza el synproxy, funciona.
### 10: Limit new TCP connections per second per source IP ###
/sbin/iptables -A INPUT -p tcp -m conntrack --ctstate NEW -m limit
--limit 60/s --limit-burst 20 -j ACCEPT
/sbin/iptables -A INPUT -p tcp -m conntrack --ctstate NEW -j DROP
Las siguientes reglas de iptables son tiles para aumentar la seguridad global
de un servidor Linux.
Conclusin
Las gua de Constantin Oesterling muestra algunos de los mtodos ms
eficaces para detener los ataques DDoS usando iptables. De hecho, dicen
haber mitigado con xito ataques de DDoS que han alcanzado incluso varios
millones de paquetes por segundo utilizando estas reglas de iptables.