iptables
A interface de firewall Linux mais usada historicamente — arquitetura, tabelas, chains, NAT e por que hoje roda como camada de compatibilidade sobre o nftables.
Nesta página
1. Contexto histórico e normativo
O iptables é a ferramenta de linha de comando para configurar o netfilter, o subsistema de filtragem de pacotes do kernel Linux introduzido no Linux 2.4 (2001), sucedendo o ipchains (Linux 2.2) e o ipfwadm (Linux 2.0). Embora tenha sido a interface dominante por duas décadas, o nftables (Linux 3.13, 2014) foi projetado como seu sucessor, e as distribuições modernas adotaram o iptables-nft — uma camada de compatibilidade que traduz a sintaxe clássica do iptables para o backend nftables.
A relevância do iptables hoje está na enorme base instalada de scripts, documentação e conhecimento operacional, além de sua presença em sistemas legados e embarcados. Para novos projetos, recomenda-se nftables, mas compreender iptables continua essencial para administrar sistemas em produção.
2. Arquitetura netfilter
O netfilter insere hooks no stack de rede do kernel em cinco pontos de decisão:
- NF_IP_PRE_ROUTING — pacote entra na máquina.
- NF_IP_LOCAL_IN — pacote destinado ao próprio host.
- NF_IP_FORWARD — pacote atravessando a máquina (roteador).
- NF_IP_LOCAL_OUT — pacote gerado pelo próprio host.
- NF_IP_POST_ROUTING — pacote prestes a sair.
Cada hook está associado a uma ou mais tabelas e chains. O conntrack (connection tracking) é o mecanismo que permite ao kernel reconhecer pacotes de conexões já estabelecidas, permitindo regras baseadas em estado (ESTABLISHED, RELATED, NEW, INVALID).
3. Tabelas e chains
| Tabela | Função | Chains principais |
|---|---|---|
| filter | Permitir/bloquear pacote | INPUT, OUTPUT, FORWARD |
| nat | Tradução de endereço | PREROUTING, POSTROUTING, OUTPUT |
| mangle | Alteração de cabeçalho (QoS, TTL) | PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING |
| raw | Exceções ao conntrack | PREROUTING, OUTPUT |
4. Sintaxe básica de regra
iptables -A INPUT -p tcp --dport 22 -s 203.0.113.0/24 -j ACCEPT
# │ │ │ │ │ │
# │ │ │ │ │ └─ ação (target)
# │ │ │ │ └─ origem restrita
# │ │ │ └─ porta de destino
# │ │ └─ protocolo
# │ └─ chain
# └─ -A (append) / -I (insert) / -D (delete)
Ordem importa: as regras são avaliadas sequencialmente; a primeira que casar decide.
5. Exemplo real — proteção de servidor RADIUS/NOC
#!/bin/bash
# firewall-radius.sh — protege servidor FreeRADIUS + gerência
iptables -F
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# Loopback
iptables -A INPUT -i lo -j ACCEPT
# Conexões já estabelecidas
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# RADIUS: auth (1812), accounting (1813), CoA/PoD (3799) — só NAS conhecidos
iptables -A INPUT -p udp --dport 1812 -s 10.0.0.0/24 -j ACCEPT
iptables -A INPUT -p udp --dport 1813 -s 10.0.0.0/24 -j ACCEPT
iptables -A INPUT -p udp --dport 3799 -s 10.0.0.0/24 -j ACCEPT
# SSH de gerência — só rede interna do NOC
iptables -A INPUT -p tcp --dport 2200 -s 10.10.0.0/24 -j ACCEPT
# Log antes de descartar
iptables -A INPUT -j LOG --log-prefix "IPTABLES-DROP: " --log-level 4
6. NAT — MASQUERADE, DNAT, SNAT
# MASQUERADE — NAT dinâmico (IP de saída pode mudar)
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# SNAT — NAT com IP de saída fixo (mais eficiente quando aplicável)
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 203.0.113.5
# DNAT — redireciona porta pública para serviço interno
iptables -t nat -A PREROUTING -p tcp --dport 8443 -j DNAT --to-destination 10.0.0.10:80
7. Persistência de regras
apt install iptables-persistent
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6
iptables-restore < /etc/iptables/rules.v4
8. Verificação e teste
iptables -L -n -v --line-numbers
iptables -L INPUT -n -v # ver contadores
iptables -D INPUT 3 # remover regra específica
Sempre teste com plano de reversão agendado (ex.: at now + 5 minutes para resetar regras).
9. Monitoramento e métricas
Os contadores de cada regra podem ser coletados e expostos a sistemas de monitoramento como Zabbix ou PRTG. Exemplo de script que verifica se o firewall está ativo:
#!/bin/bash
# check_iptables.sh
if iptables -L INPUT -n | grep -q "DROP"; then
echo "OK: firewall ativo"
exit 0
else
echo "CRITICAL: firewall sem regras"
exit 2
fi
10. Boas práticas de segurança
- Política padrão
DROPem INPUT e FORWARD. - Sempre permitir
ESTABLISHED,RELATEDantes de regras restritivas. - Restringir SSH de gerência a redes específicas.
- Logar pacotes descartados para auditoria.
- Usar
conntrackpara regras baseadas em estado.
11. Comparação com nftables
| Característica | iptables | nftables |
|---|---|---|
| Sintaxe | Verbosa, específica por protocolo | Declarativa, unificada |
| IPv4 + IPv6 | Ferramentas separadas (iptables/ip6tables) | Unificado (uma regra serve para ambos) |
| Substituição atômica | Regra por regra | Bloco inteiro de uma vez |
| Status | Legado, camada de compatibilidade | Sucessor oficial |
12. Troubleshooting
Provável falta da regra ESTABLISHED,RELATED ou porta de gerência bloqueada. Use plano de reversão agendado.
Checar contadores (-v). Se não incrementam, o pacote não está casando — geralmente ordem errada.
Faltou iptables-persistent + iptables-save (seção 7).
13. Glossário
14. Referências
- Projeto netfilter/iptables — documentação oficial (netfilter.org).
- RFC 768 — User Datagram Protocol (UDP), relacionado a portas de RADIUS.
- RFC 2865/2866 — RADIUS (portas 1812/1813, contexto do exemplo).
- Páginas relacionadas: nftables, pfSense.
Conteúdo técnico independente, baseado em conhecimento consolidado e estável da ferramenta. Nenhum trecho é cópia literal de fonte de terceiro.