Descripción general de iptables

Guía práctica para la gestión del cortafuegos Linux con iptables.

iptables es la interfaz de línea de comandos estándar para gestionar el firewall netfilter integrado en el kernel de Linux. Todos los comandos de iptables requieren privilegios de root.

Obtén acceso root antes de ejecutar cualquiera de estos comandos: sudo -i en sistemas basados en Debian, o su en los demás.

Visualización de reglas y estado

Muestra todas las reglas con salida detallada:

iptables -L -n -v

Muestra las reglas con números de línea:

iptables -n -L -v --line-numbers

Muestra solo la cadena INPUT o OUTPUT:

iptables -L INPUT -n -v
iptables -L OUTPUT -n -v --line-numbers

Flags:

  • -L — listar reglas
  • -v — salida detallada (interfaz, opciones, sufijos K/M/G)
  • -n — mostrar IPs y puertos como números, sin resolución DNS

Inicio y detención del firewall

Mediante el servicio del sistema:

service ufw stop
service ufw start

Vaciar todas las reglas manualmente:

iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

Flags:

  • -F — vaciar (eliminar) todas las reglas
  • -X — eliminar una cadena
  • -t — seleccionar una tabla (nat, mangle)
  • -P — establecer la política predeterminada

Adición y eliminación de reglas

Elimina una regla por número de línea:

iptables -L INPUT -n --line-numbers    # localiza el número de línea
iptables -D INPUT 3                    # elimina la línea 3

Elimina una regla por IP de origen:

iptables -D INPUT -s 202.54.1.1 -j DROP

Inserta una regla entre las líneas 1 y 2:

iptables -I INPUT 2 -s 202.54.1.2 -j DROP

Guardado y restauración de reglas

iptables-save > /etc/iptables.rules      # guardar
iptables-restore < /etc/iptables.rules  # restaurar

Políticas predeterminadas

Descartar todo el tráfico (denegar todo):

iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

Bloquear el tráfico entrante no solicitado, permitir el saliente:

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT

Bloqueo de IPs y redes

Bloquea una IP específica:

iptables -A INPUT -s 1.2.3.4 -j DROP

Descarta rangos de red privados en una interfaz pública:

iptables -A INPUT -i eth1 -s 192.168.0.0/24 -j DROP
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

Rangos de direcciones privadas:

  • 10.0.0.0/8 (Clase A)
  • 172.16.0.0/12 (Clase B)
  • 192.168.0.0/16 (Clase C)
  • 224.0.0.0/4 (Multicast D)
  • 240.0.0.0/5 (Clase E)
  • 127.0.0.0/8 (Loopback)

Bloqueo de puertos

Bloquea todas las conexiones entrantes en el puerto 80:

iptables -A INPUT -p tcp --dport 80 -j DROP
iptables -A INPUT -i eth1 -p tcp --dport 80 -j DROP

Bloquea el puerto 80 para una IP específica:

iptables -A INPUT -p tcp -s 1.2.3.4 --dport 80 -j DROP

Abre un rango de puertos:

iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 7000:7010 -j ACCEPT

Bloqueo de conexiones salientes por dominio

Busca la IP y el CIDR:

host -t a facebook.com
whois 69.171.228.40 | grep CIDR

Bloquea el rango:

iptables -A OUTPUT -p tcp -d 69.171.224.0/19 -j DROP

Logging

Registra y descarta un paquete:

iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG --log-prefix "IP_SPOOF A: "
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

Logging con limitación de tasa (máx. 7 entradas cada 5 minutos):

iptables -A INPUT -i eth1 -s 10.0.0.0/8 -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix "IP_SPOOF A: "
iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

Consulta el log:

tail -f /var/log/messages
grep -i --color 'IP SPOOF' /var/log/messages

Filtrado por dirección MAC

iptables -A INPUT -m mac --mac-source 00:0F:EA:91:04:08 -j DROP

::: front-promo-main-services
:::

# Permite solo el puerto TCP 22 desde una MAC específica
iptables -A INPUT -p tcp --destination-port 22 -m mac --mac-source 00:0F:EA:91:04:07 -j ACCEPT

Gestión de ICMP (Ping)

Referencia de tipos de mensajes ICMP:

Tipo Descripción
0 Echo reply (respuesta al ping)
3 Destination unreachable
4 Source quench
5 Redirect
8 Echo request (ping)
11 Time-to-live exceeded
12 IP header bad

Configuración recomendada — permite solo los tipos ICMP seguros:

iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 12 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 0 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 3 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 4 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 11 -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type 12 -j ACCEPT

Bloquea todas las solicitudes de ping:

iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

Permite el ping solo desde la subred local:

iptables -A INPUT -s 192.168.1.0/24 -p icmp --icmp-type echo-request -j ACCEPT

Puertos comunes — abrir o cerrar

Sustituye ACCEPT por DROP para bloquear un puerto:

# SSH (puerto 22)
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

# HTTP / HTTPS
iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 443 -j ACCEPT

# SMTP (puerto 25)
iptables -A INPUT -m state --state NEW -p tcp --dport 25 -j ACCEPT

# DNS (puerto 53)
iptables -A INPUT -m state --state NEW -p udp --dport 53 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT

# POP3 (puerto 110)
iptables -A INPUT -m state --state NEW -p tcp --dport 110 -j ACCEPT

# IMAP (puerto 143)
iptables -A INPUT -m state --state NEW -p tcp --dport 143 -j ACCEPT

# MySQL (puerto 3306) — solo red local
iptables -I INPUT -p tcp --dport 3306 -j ACCEPT

# Samba — solo red local
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 137 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 139 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 445 -j ACCEPT

# NTP (puerto 123)
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p udp --dport 123 -j ACCEPT

Límites de conexión

No más de 3 sesiones SSH por IP:

iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT

Limita HTTP a 20 conexiones simultáneas por subred /24:

iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j DROP

Flags:

  • --connlimit-above N — aplica la regla cuando el número de conexiones supera N
  • --connlimit-mask 24 — aplica el límite por subred /24

Rangos de direcciones IP

Permite el acceso al puerto 80 desde un rango de IP específico:

iptables -A INPUT -p tcp --destination-port 80 -m iprange --src-range 192.168.1.100-192.168.1.200 -j ACCEPT

Ayuda

¿Tienes dudas o necesitas ayuda? Escríbenos a través del sistema de tickets — siempre estamos aquí para ayudarte!

¿Necesitas ayuda?Nuestros ingenieros te ayudarán gratuitamente con cualquier pregunta en minutosContáctanos