iptables en Linux: Configurar Firewall con Reglas Prácticas
El iptables es el firewall estándar del kernel Linux. Presente en prácticamente todas las distribuciones, inspecciona y filtra cada paquete de red que entra, sale o pasa por el sistema. Entender iptables es fundamental para proteger servidores en producción, configurar redes y aprobar certificaciones como LPIC-2 y CompTIA Linux+.
En esta guía aprenderás la sintaxis, las principales reglas y los casos de uso más comunes — con ejemplos listos para usar.
Cómo funciona iptables: tablas y chains
El iptables organiza las reglas en tablas, cada una con un propósito diferente:
| Tabla | Uso |
|---|---|
filter | Filtrado de paquetes (predeterminada — usada en la mayoría de las reglas) |
nat | Traducción de direcciones (NAT, masquerade, port forwarding) |
mangle | Modificación de encabezados de paquetes (QoS, TTL) |
raw | Control de seguimiento de conexión (conntrack) |
Cada tabla tiene chains (cadenas) que determinan cuándo se evalúan las reglas:
| Chain | Cuando se evalúa |
|---|---|
INPUT | Paquetes destinados al propio servidor |
OUTPUT | Paquetes generados por el propio servidor |
FORWARD | Paquetes que pasan por el servidor (enrutamiento) |
PREROUTING | Antes del enrutamiento (nat/mangle) |
POSTROUTING | Después del enrutamiento (nat/mangle) |
Comandos básicos de iptables
# Listar regras com detalhes (números de linha, contadores)
iptables -L -n -v --line-numbers
# Listar regras de uma tabela específica
iptables -t nat -L -n -v
# Adicionar regra no final da chain (-A = append)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Inserir regra em posição específica (-I = insert)
iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT
# Deletar regra pelo número da linha
iptables -D INPUT 3
# Deletar regra pela especificação
iptables -D INPUT -p tcp --dport 80 -j ACCEPT
# Limpar todas as regras de uma chain (-F = flush)
iptables -F INPUT
# Limpar todas as regras de todas as chains
iptables -F
# Definir política padrão de uma chain
iptables -P INPUT DROP
Targets (objetivos) más comunes
| Target | Comportamiento |
|---|---|
ACCEPT | Acepta el paquete |
DROP | Descarta silenciosamente (sin respuesta) |
REJECT | Descarta y envía mensaje de error al remitente |
LOG | Registra el paquete en syslog y continúa |
RETURN | Vuelve a la chain que llamó a esta |
MASQUERADE | NAT dinámico (tabla nat) |
DNAT | Redirige a otro IP/puerto (tabla nat) |
Ejemplos prácticos
1. Configuración básica de servidor: política DROP + excepciones
El enfoque más seguro: bloquea todo por defecto y permite solo lo necesario.
# Salva as regras atuais antes de começar
iptables-save > /tmp/iptables_backup.rules
# Define política padrão: DROP em INPUT e FORWARD, ACCEPT em OUTPUT
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# Permite tráfego loopback (necessário para o sistema funcionar)
iptables -A INPUT -i lo -j ACCEPT
# Permite conexões já estabelecidas e relacionadas
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Libera SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Libera HTTP e HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
2. Permitir puerto para IP específica únicamente
# Permite SSH apenas do escritório (192.168.1.100)
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.100 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
# Libera acesso ao banco de dados apenas do servidor de aplicação
iptables -A INPUT -p tcp --dport 3306 -s 10.0.1.50 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -j DROP
3. Bloquear IP o rango de IPs
# Bloquear IP específico
iptables -A INPUT -s 203.0.113.99 -j DROP
# Bloquear faixa de IPs (CIDR)
iptables -A INPUT -s 203.0.113.0/24 -j DROP
# Bloquear e registrar tentativas antes de dropar
iptables -A INPUT -s 203.0.113.0/24 -j LOG --log-prefix "BLOCKED: "
iptables -A INPUT -s 203.0.113.0/24 -j DROP
4. Proteger contra ataques comunes
# Bloquear pacotes inválidos
iptables -A INPUT -m state --state INVALID -j DROP
# Limitar tentativas de conexão SSH (anti-brute force)
iptables -A INPUT -p tcp --dport 22 -m state --state NEW \
-m recent --set --name SSH_BRUTE
iptables -A INPUT -p tcp --dport 22 -m state --state NEW \
-m recent --update --seconds 60 --hitcount 4 --name SSH_BRUTE -j DROP
# Limitar ping (ICMP) para evitar flood
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
# Bloquear pacotes SYN suspeitos (SYN flood)
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
5. NAT y compartir internet (Masquerade)
Para que máquinas en la red interna accedan a internet a través del servidor Linux:
# Habilitar IP forwarding no kernel
echo 1 > /proc/sys/net/ipv4/ip_forward
# Para tornar permanente, adicione no /etc/sysctl.conf:
# net.ipv4.ip_forward = 1
# Masquerade: toda saída pela interface eth0 usa o IP do servidor
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# Permite o tráfego entre as interfaces
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
6. Port forwarding (redireccionamiento de puerto)
# Redirecionar porta 80 pública para porta 8080 interna
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
# Redirecionar para outro servidor interno
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.10:80
iptables -A FORWARD -p tcp -d 192.168.1.10 --dport 80 -j ACCEPT
7. Registrar paquetes para debug
# Registrar e depois aceitar
iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH-ENTRADA: " --log-level 4
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Ver logs em tempo real
tail -f /var/log/syslog | grep "SSH-ENTRADA"
# ou
journalctl -f | grep "SSH-ENTRADA"
Guardar y restaurar reglas
Las reglas de iptables se pierden al reiniciar. Para hacerlas persistentes:
# Salvar regras atuais
iptables-save > /etc/iptables/rules.v4 # Debian/Ubuntu
iptables-save > /etc/sysconfig/iptables # CentOS/RHEL
# Restaurar manualmente
iptables-restore < /etc/iptables/rules.v4
# No Ubuntu/Debian: instalar o pacote que restaura automaticamente no boot
apt install iptables-persistent
netfilter-persistent save
# No CentOS/RHEL: usar o serviço
systemctl enable iptables
systemctl start iptables
Verificar reglas y diagnóstico
# Listar tudo com contadores (quantos pacotes cada regra processou)
iptables -L -v -n
# Listar com números de linha (útil para deletar por posição)
iptables -L INPUT --line-numbers
# Zerar contadores sem apagar regras
iptables -Z
# Ver regras da tabela NAT
iptables -t nat -L -n -v
iptables vs nftables
El nftables es el sustituto moderno de iptables, disponible desde el kernel 3.13. En distros más recientes (Debian 10+, Ubuntu 20.04+, RHEL 8+) ya es el estándar por debajo, con el comando iptables siendo un wrapper sobre nftables.
# Ver se você está usando iptables-legacy ou nftables
iptables --version
# iptables v1.8.7 (nf_tables) ← já usa nftables por baixo
# iptables v1.8.2 (legacy) ← iptables clássico
# Equivalente nftables de uma regra iptables:
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
nft add rule inet filter input tcp dport 22 accept
Para fines de certificación LPIC-2, el contenido evaluado aún es iptables clásico. Para instalaciones nuevas, considera aprender nftables.
Referencia rápida
# Ver regras
iptables -L -n -v --line-numbers
# Regra básica de servidor seguro
iptables -P INPUT DROP && iptables -P FORWARD DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# Anti-brute force SSH
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
# NAT simples
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# Salvar (Debian/Ubuntu)
iptables-save > /etc/iptables/rules.v4
Eso fue solo una pieza. El curso enseña el camino completo — desde tu primer comando hasta el día del examen.