Guía Completa de Configuración de Seguridad en iptables: Reglas y Registro de Tráfico

Artículos Guías Manuales Sistemas Linux Windows Binario 0

En este artículo se describe una configuración detallada de iptables para una política de seguridad en redes. La configuración tiene como objetivo controlar el tráfico de entrada, salida y reenvío de datos, registrando (logueando) las conexiones no deseadas y garantizando que solo pasen los paquetes que cumplan con las reglas establecidas. A continuación, se analizan las reglas establecidas y su propósito.

# Por defecto, bloquear todo en las cadenas INPUT y FORWARD
-P INPUT DROP
-P FORWARD DROP

# Permitir todo el tráfico saliente
-P OUTPUT ACCEPT

# Bloquear conexiones TCP nuevas que no comiencen con SYN
-A INPUT -i eth0 -p tcp ! --syn -m state --state NEW -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "TCP RST,ACK,FIN"
-A INPUT -i eth0 -p tcp ! --syn -m state --state NEW -j DROP

# Bloquear fragmentos entrantes
-A INPUT -i eth0 -f -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "Fragment Packets"
-A INPUT -i eth0 -f -j DROP

# Bloquear paquetes malformados
-A INPUT -i eth0 -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
-A INPUT -i eth0 -p tcp --tcp-flags ALL ALL -j DROP
-A INPUT -i eth0 -p tcp --tcp-flags SYN,RST SYN,RST -j DROP

# Bloquear NULL packets
-A INPUT -i eth0 -p tcp --tcp-flags ALL NONE -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "NULL Packets"
-A INPUT -i eth0 -p tcp --tcp-flags ALL NONE -j DROP

# Bloquear paquetes "Christmas tree" malformados
-A INPUT -i eth0 -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "XMAS Packets"
-A INPUT -i eth0 -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP

# Bloquear ataques Fin Scan
-A INPUT -i eth0 -p tcp --tcp-flags FIN,ACK FIN -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "Fin Packets Scan"
-A INPUT -i eth0 -p tcp --tcp-flags FIN,ACK FIN -j DROP

# Validar flags TCP
-A INPUT -i eth0 -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP

# Bloquear paquetes inválidos
-A INPUT -m conntrack --ctstate INVALID -j DROP

# Permitir todo en la interfaz loopback
-A INPUT -i lo -j ACCEPT

# Permitir paquetes de conexiones establecidas
-A INPUT -p all -m state --state RELATED,ESTABLISHED -j ACCEPT

# Permitir ping
-A INPUT -p icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT

# Anexo
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP

# Permitir conexiones hacia el puerto 22 (SSH)
-A INPUT -p tcp -d 0.0.0.0/0 --sport 1024:65535 --dport 22 -m state --state NEW -j ACCEPT

# Permitimos la consulta a DNS
-A INPUT -s 0.0.0.0/0 -p udp -m udp --sport 53 -j ACCEPT
-A OUTPUT -d 0.0.0.0/0 -p udp -m udp --dport 53 -j ACCEPT

# Permitir conexiones hacia el puerto 80 y 443 (HTTP y HTTPS)
-A INPUT -p tcp -d 0.0.0.0/0 --sport 1024:65535 --dport 80 -m state --state NEW -j ACCEPT
-A INPUT -p tcp -d 0.0.0.0/0 --sport 1024:65535 --dport 443 -m state --state NEW -j ACCEPT

# Reglas de red
-A INPUT -s 192.168.1.0/24 -d 192.168.20.0/27 -j ACCEPT
-A INPUT -s 192.168.1.0/24 -d 192.168.30.0/27 -j ACCEPT
-A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -i eth1 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -i eth0 -o eth2 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -i eth2 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Loguear y rechazar el resto
-A INPUT -j LOG
-A FORWARD -j LOG
-A INPUT -j DROP

Política predeterminada

  1. INPUT y FORWARD en DROP: Bloquea todas las conexiones entrantes (INPUT) y de reenvío (FORWARD) por defecto, lo que significa que solo se permitirá el tráfico que cumpla con las reglas específicas.

    -P INPUT DROP -P FORWARD DROP
  2. OUTPUT en ACCEPT: Permite todo el tráfico saliente (OUTPUT), lo que permite que la máquina pueda realizar conexiones hacia el exterior sin restricciones.

    -P OUTPUT ACCEPT

Control de paquetes TCP

  1. Bloqueo de conexiones TCP sin SYN: Rechaza nuevas conexiones TCP que no inicien con el flag SYN. Esto evita ataques de paquetes malintencionados que intenten establecer conexiones ilegítimas. Los paquetes son registrados antes de ser descartados.

    -A INPUT -i eth0 -p tcp ! --syn -m state --state NEW -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "TCP RST,ACK,FIN"
    -A INPUT -i eth0 -p tcp ! --syn -m state --state NEW -j DROP

Control de fragmentos y paquetes malformados

  1. Bloqueo de fragmentos: Bloquea todos los fragmentos de paquetes entrantes que pueden ser utilizados para ataques de fragmentación.

    -A INPUT -i eth0 -f -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "Fragment Packets"
    -A INPUT -i eth0 -f -j DROP
  2. Paquetes TCP malformados y flags inválidos: Rechaza paquetes con combinaciones de flags inusuales o malintencionadas, protegiendo contra ataques de escaneo de puertos.

    -A INPUT -i eth0 -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
    -A INPUT -i eth0 -p tcp --tcp-flags ALL ALL -j DROP
    -A INPUT -i eth0 -p tcp --tcp-flags SYN,RST SYN,RST -j DROP

Protección contra escaneos de puertos

  1. NULL packets y XMAS packets: Bloquea paquetes NULL (sin flags) y XMAS (con múltiples flags), que se utilizan en escaneos de puertos. Estos paquetes se registran y luego se bloquean.

    -A INPUT -i eth0 -p tcp --tcp-flags ALL NONE -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "NULL Packets"
    -A INPUT -i eth0 -p tcp --tcp-flags ALL NONE -j DROP
    -A INPUT -i eth0 -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "XMAS Packets"
    -A INPUT -i eth0 -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
  2. Bloqueo de ataques Fin Scan: Rechaza paquetes con el flag FIN activado, característicos de ataques de escaneo de puertos.

    -A INPUT -i eth0 -p tcp --tcp-flags FIN,ACK FIN -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "Fin Packets Scan"
    -A INPUT -i eth0 -p tcp --tcp-flags FIN,ACK FIN -j DROP

Bloqueo de paquetes inválidos

  1. Paquetes inválidos: Bloquea paquetes que no pertenezcan a ninguna conexión válida o estén mal formados.

    -A INPUT -m conntrack --ctstate INVALID -j DROP

Reglas de aceptación específicas

  1. Permitir el tráfico en la interfaz lo: Permite todo el tráfico en la interfaz de loopback lo para la comunicación interna.

    -A INPUT -i lo -j ACCEPT
  2. Conexiones establecidas y relacionadas: Permite tráfico que pertenezca a conexiones ya establecidas o relacionadas, permitiendo así la continuidad de conexiones activas.

    -A INPUT -p all -m state --state RELATED,ESTABLISHED -j ACCEPT
  3. Permitir ping: Permite solicitudes de ping (ICMP tipo 8), lo que facilita la prueba de conectividad.

    -A INPUT -p icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT

Acceso a servicios y puertos específicos

  1. SSH (Puerto 22): Permite conexiones SSH desde puertos de origen altos (1024-65535) para acceso de administración remota.

    -A INPUT -p tcp -d 0.0.0.0/0 --sport 1024:65535 --dport 22 -m state --state NEW -j ACCEPT
  2. DNS: Permite consultas DNS entrantes y salientes (puerto UDP 53) para la resolución de nombres de dominio.

    -A INPUT -s 0.0.0.0/0 -p udp -m udp --sport 53 -j ACCEPT -A OUTPUT -d 0.0.0.0/0 -p udp -m udp --dport 53 -j ACCEPT
  3. HTTP y HTTPS (Puertos 80 y 443): Permite tráfico HTTP y HTTPS, habilitando la navegación web y conexiones a servidores web.

    -A INPUT -p tcp -d 0.0.0.0/0 --sport 1024:65535 --dport 80 -m state --state NEW -j ACCEPT
    -A INPUT -p tcp -d 0.0.0.0/0 --sport 1024:65535 --dport 443 -m state --state NEW -j ACCEPT

Reglas de red y reenvío

  1. Subredes autorizadas: Permite comunicación entre subredes específicas dentro de la red.

    -A INPUT -s 192.168.1.0/24 -d 192.168.20.0/27 -j ACCEPT
    -A INPUT -s 192.168.1.0/24 -d 192.168.30.0/27 -j ACCEPT
  2. Reenvío entre interfaces: Permite tráfico de reenvío entre interfaces de red, siempre que esté relacionado o sea parte de una conexión establecida.

    -A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A FORWARD -i eth1 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A FORWARD -i eth0 -o eth2 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -A FORWARD -i eth2 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Registro de tráfico

  1. Registro (LOG): Utiliza --log-level 4 y --log-prefix para registrar el tráfico no permitido antes de bloquearlo.

    -A INPUT -j LOG -A FORWARD -j LOG

Bloqueo final

  1. Bloqueo por defecto: Descarta todo el tráfico que no cumpla con las reglas especificadas.

    -A INPUT -j DROP

Archivo completo de configuración

-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT
-A INPUT -i eth0 -p tcp ! --syn -m state --state NEW -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "TCP RST,ACK,FIN"
-A INPUT -i eth0 -p tcp ! --syn -m state --state NEW -j DROP
-A INPUT -i eth0 -f -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "Fragment Packets"
-A INPUT -i eth0 -f -j DROP
-A INPUT -i eth0 -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
-A INPUT -i eth0 -p tcp --tcp-flags ALL ALL -j DROP
-A INPUT -i eth0 -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
-A INPUT -i eth0 -p tcp --tcp-flags ALL NONE -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "NULL Packets"
-A INPUT -i eth0 -p tcp --tcp-flags ALL NONE -j DROP
-A INPUT -i eth0 -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "XMAS Packets"
-A INPUT -i eth0 -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
-A INPUT -i eth0 -p tcp --tcp-flags FIN,ACK FIN -m limit --limit 5/m --limit-burst 7 -j LOG --log-level 4 --log-prefix "Fin Packets Scan"
-A INPUT -i eth0 -p tcp --tcp-flags FIN,ACK FIN -j DROP
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -i lo -j ACCEPT
-A INPUT -p all -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp --icmp-type 8 -m conntrack --ctstate NEW -j ACCEPT
-A INPUT -p tcp -d 0.0.0.0/0 --sport 1024:65535 --dport 22 -m state --state NEW -j ACCEPT
-A INPUT -s 0.0.0.0/0 -p udp -m udp --sport 53 -j ACCEPT
-A OUTPUT -d 0.0.0.0/0 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -p tcp -d 0.0.0.0/0 --sport 1024:65535 --dport 80 -m state --state NEW -j ACCEPT
-A INPUT -p tcp -d 0.0.0.0/0 --sport 1024:65535 --dport 443 -m state --state NEW -j ACCEPT
-A INPUT -s 192.168.1.0/24 -d 192.168.20.0/27 -j ACCEPT
-A INPUT -s 192.168.1.0/24 -d 192.168.30.0/27 -j ACCEPT
-A FORWARD -i eth0 -o eth1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -i eth1 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -i eth0 -o eth2 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -i eth2 -o eth0 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -j LOG
-A FORWARD -j LOG
-A INPUT -j DROP