Configuración del firewall básico de Linux iptables¶
En este artículo
iptables es el marco integrado para filtrar y gestionar el tráfico de red en el kernel de Linux. Permite un control flexible sobre las conexiones entrantes, salientes y de tránsito basándose en reglas.
Nota
iptables viene preinstalado en casi todas las distribuciones de Linux.
En sistemas más recientes (RHEL 8+, Ubuntu 20.04+), el predeterminado puede ser nftables (el comando nft), pero iptables sigue siendo compatible a través de la interfaz legacy iptables-legacy.
Para servidores en la nube o VPS, configurar iptables es críticamente importante para la seguridad.
Conceptos básicos¶
Tres cadenas (chains)¶
| Cadena | Propósito |
|---|---|
INPUT | Tráfico entrante al servidor (SSH, HTTP, etc.) |
OUTPUT | Tráfico saliente desde el servidor (actualizaciones, solicitudes API) |
FORWARD | Tráfico que atraviesa el servidor (solo cuando hay enrutamiento/NAT) |
Nota
¡Tenga cuidado con INPUT!
Bloquear el puerto 22 sin precaución puede desconectarlo del servidor. Revise siempre las reglas antes de aplicarlas.
Cómo funciona¶
- Un paquete entra en la cadena apropiada
INPUT,OUTPUT,FORWARD. - Las reglas se evalúan en orden: tan pronto como se encuentra una coincidencia, se realiza la acción especificada.
- Si no se encuentra ninguna coincidencia, se aplica la política predeterminada
policy.
Acciones (targets)¶
| Acción | Comportamiento | Recomendación |
|---|---|---|
ACCEPT | Permitir el paquete | Para servicios de confianza (SSH, HTTP) |
DROP | Descartar silenciosamente el paquete (sin respuesta) | ****Mejor opción para la seguridad**** — oculta la existencia del puerto |
REJECT | Rechazar con un error ICMP (p. ej., port-unreachable) | Úselo si necesita retroalimentación (p. ej., para depuración) |
Nota
Regla de seguridad
De forma predeterminada: denegar todo, luego permitir solo lo necesario.
Sintaxis básica de comandos¶
Opciones principales:¶
| Opción | Propósito |
|---|---|
-A | Agregar una regla al final de la cadena |
-I | Insertar una regla al principio (o en un número específico: -I INPUT 1) |
-D | Eliminar una regla (por número o copiando la línea) |
-L | Listar reglas |
-F | Borrar todas las reglas de la cadena |
-P | Establecer política predeterminada ACCEPT, DROP) |
Criterios de uso frecuente:¶
| Opción | Ejemplo | Descripción |
|---|---|---|
-p tcp/udp/icmp | -p tcp | Protocolo |
--dport N | --dport 22 | Puerto de destino |
-s IP/MÁSCARA | -s 192.168.1.5<br-s 203.0.113.0/24 | Origen (IP o subred) |
-i interfaz | -i eth0 | Interfaz entrante |
-m state --state NEW,ESTABLISHED | -m state --state NEW | Estado de la conexión |
-m connlimit | --connlimit-above 5 | Límite de conexiones |
Visualización y solución de problemas¶
Mostrar todas las reglas (legible):¶
--n: no resolver nombres (más rápido); - -v: salida detallada; - --line-numbers: mostrar números de regla (útil para la eliminación). 
Ver políticas predeterminadas:¶
Ejemplos prácticos de reglas¶
1. Configuración básica segura (¡recomendada!)¶
# 1. Permitir todo el tráfico en loopback
sudo iptables -A INPUT -i lo -j ACCEPT
# 2. Permitir conexiones ya establecidas (¡importante!)
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 3. Permitir SSH (¡reemplace 22 con su puerto si lo ha cambiado!)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 4. Permitir HTTP/HTTPS
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 5. Descartar todo lo demás de forma predeterminada
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT # ← generalmente permitir salida
2. Restricción de acceso¶
# Permitir MySQL (3306) solo desde una IP
sudo iptables -A INPUT -s 203.0.113.15 -p tcp --dport 3306 -j ACCEPT
# Bloquear todo el tráfico desde una IP sospechosa
sudo iptables -A INPUT -s 198.51.100.77 -j DROP
3. Protección contra ataques¶
# Bloquear paquetes malformados/inválidos
sudo iptables -A INPUT -m state --state INVALID -j DROP
# Proteger contra SYN‑flood
sudo iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
sudo iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j DROP
# Limitar conexiones a HTTP (no más de 20 simultáneas desde una IP)
sudo iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 32 -j DROP
4. Registro (Logging)¶
# Registrar intentos de conexión a puertos cerrados (los primeros 5 por minuto)
sudo iptables -A INPUT -p tcp -m multiport --dports 22,3389,5900 \
-m limit --limit 5/min -j LOG --log-prefix "PORT-SCAN: " --log-level 4
# Luego descartar
sudo iptables -A INPUT -p tcp -m multiport --dports 22,3389,5900 -j DROP
Guardar reglas después del reinicio¶
Las reglas de iptables no se guardan automáticamente: solo residen en la memoria del kernel.
Para RHEL / CentOS 7 y anteriores:¶
Para Debian / Ubuntu:¶
Instale el paquete de persistencia:
Durante la instalación, el sistema le pedirá que guarde las reglas actuales: elija "Yes".Actualizar las reglas guardadas más tarde:
Nota
Antes de reiniciar, verifique las reglas:
La marca-t es solo para verificar la sintaxis, no se aplica nada. Eliminar reglas¶
Eliminar por número (vea --line-numbers):¶
Eliminar por coincidencia exacta:¶
Borrar una cadena:¶
Restablecer políticas predeterminadas:¶
Información
- Pruebe las reglas localmente o a través de la consola (¡no por SSH!), especialmente al cambiar
INPUT. - Use
screenotmuxpara no perder la sesión en caso de error. -
Considere migrar a herramientas más modernas: