Firewall com iptables e nftables: regras, chains e NAT
1. Introdução ao Firewall no Linux
O firewall no Linux é implementado através do subsistema Netfilter, uma arquitetura integrada ao kernel que permite interceptar, inspecionar e modificar pacotes de rede. Os conceitos fundamentais envolvem o tratamento de pacotes IP, a filtragem baseada em critérios como endereços, portas e protocolos, e o rastreamento de estado de conexão (conntrack), que permite políticas stateful — onde decisões são tomadas com base no contexto da conexão.
O Netfilter oferece hooks em pontos estratégicos do stack de rede, como PREROUTING (antes da decisão de roteamento), INPUT (pacotes destinados ao host local), FORWARD (pacotes roteados), OUTPUT (pacotes gerados localmente) e POSTROUTING (após o roteamento). Sobre esses hooks, iptables e nftables constroem suas estruturas de regras.
As diferenças entre iptables (legado) e nftables (moderno) são significativas. O iptables utiliza uma sintaxe com múltiplos comandos separados (iptables, ip6tables, arptables, ebtables), enquanto o nftables unifica todas as famílias de endereços em um único framework, oferece melhor desempenho com conjuntos (sets) otimizados e permite atomicidade na aplicação de regras.
2. Estrutura do iptables: Tables, Chains e Regras
O iptables organiza regras em tables e chains. As principais tables são:
- filter: padrão para filtragem de pacotes
- nat: modificação de endereços (NAT)
- mangle: alteração de cabeçalhos de pacotes
- raw: bypass do rastreamento de conexão
- security: políticas SELinux
Cada table possui chains built-in. Para a table filter, as chains são INPUT, OUTPUT e FORWARD. Para nat, temos PREROUTING, POSTROUTING e OUTPUT. Cada regra segue a anatomia:
iptables -t <table> -A <chain> <match> -j <target>
Os targets comuns incluem ACCEPT (permitir), DROP (descartar silenciosamente), REJECT (rejeitar com mensagem), LOG (registrar) e RETURN (retornar à chain anterior).
3. Criando e Gerenciando Regras com iptables
Comandos básicos para gerenciamento:
# Listar regras da table filter, chain INPUT com numeração
iptables -L INPUT -n -v --line-numbers
# Adicionar regra para permitir SSH (porta 22)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Inserir regra no topo da chain
iptables -I INPUT 1 -p icmp --icmp-type echo-request -j DROP
# Deletar regra específica
iptables -D INPUT -p tcp --dport 22 -j ACCEPT
# Liberar tráfego local (loopback)
iptables -A INPUT -i lo -j ACCEPT
# Bloquear ping externo
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
# Limpar todas as regras
iptables -F
iptables -t nat -F
iptables -t mangle -F
Para persistência, utilize:
# Salvar regras atuais
iptables-save > /etc/iptables/rules.v4
# Restaurar regras
iptables-restore < /etc/iptables/rules.v4
4. NAT (Network Address Translation) com iptables
O NAT modifica endereços de origem (SNAT) ou destino (DNAT) dos pacotes. O MASQUERADE é uma forma especial de SNAT para interfaces com IP dinâmico.
Exemplo de compartilhamento de internet em LAN:
# Habilitar roteamento IP
echo 1 > /proc/sys/net/ipv4/ip_forward
# Configurar MASQUERADE na interface externa (eth0)
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# Permitir tráfego forward da LAN (eth1) para externo
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT
Redirecionamento de porta (DNAT) para servidor interno:
# Redirecionar porta 8080 externa para 80 interno (192.168.1.10)
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.10:80
iptables -A FORWARD -p tcp -d 192.168.1.10 --dport 80 -j ACCEPT
5. Introdução ao nftables: Sintaxe e Estrutura
O nftables substitui o iptables com uma sintaxe unificada e mais clara. Trabalha com famílias de endereços: inet (IPv4+IPv6), ip, ip6, arp, bridge.
A estrutura básica:
nft add table inet firewall
nft add chain inet firewall input { type filter hook input priority 0 \; }
nft add rule inet firewall input tcp dport 22 accept
Diferenças notáveis: as regras podem ser carregadas atomicamente via arquivo, e as chains podem ser base (com hook) ou não-base (para organização).
Exemplo de arquivo completo:
# /etc/nftables.conf
table inet firewall {
chain input {
type filter hook input priority 0; policy drop;
iif lo accept
ct state established,related accept
tcp dport 22 accept
icmp type echo-request accept
}
chain forward {
type filter hook forward priority 0; policy drop;
}
chain output {
type filter hook output priority 0; policy accept;
}
}
Carregar com: nft -f /etc/nftables.conf
6. Regras e Conjuntos (Sets) no nftables
Os sets permitem otimizar regras com listas de IPs ou portas:
table inet firewall {
set allowed_ips {
type ipv4_addr
elements = { 192.168.1.0/24, 10.0.0.5 }
}
set blocked_ports {
type inet_service
elements = { 23, 445, 3389 }
}
chain input {
type filter hook input priority 0; policy drop;
ip saddr @allowed_ips tcp dport 22 accept
tcp dport @blocked_ports drop
}
}
Firewall básico para servidor web e SSH:
table inet firewall {
chain input {
type filter hook input priority 0; policy drop;
iif lo accept
ct state established,related accept
tcp dport { 22, 80, 443 } accept
ip protocol icmp accept
}
}
7. NAT e Roteamento com nftables
SNAT e DNAT em nftables seguem sintaxe específica:
# SNAT (mascaramento)
table ip nat {
chain postrouting {
type nat hook postrouting priority 100;
oif eth0 masquerade
}
}
# DNAT (redirecionamento de porta)
table ip nat {
chain prerouting {
type nat hook prerouting priority -100;
tcp dport 8080 dnat to 192.168.1.10:80
}
}
Comparativo com iptables:
# iptables
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.10:80
# nftables
nft add rule ip nat prerouting tcp dport 8080 dnat to 192.168.1.10:80
Integração com conntrack para políticas stateful:
table inet firewall {
chain input {
type filter hook input priority 0; policy drop;
ct state invalid drop
ct state { established, related } accept
tcp dport 22 accept
}
}
8. Migração de iptables para nftables e Boas Práticas
A ferramenta iptables-translate converte regras individuais:
# Converter regra iptables para nftables
iptables-translate -A INPUT -p tcp --dport 22 -j ACCEPT
# Saída: nft add rule ip filter INPUT tcp dport 22 accept
Para migração completa, use:
# Listar ruleset atual em formato nftables
nft list ruleset > /etc/nftables.conf
Estratégias de migração:
- Gradual: converter regras uma a uma, testando em ambiente de staging
- Híbrida: usar iptables legado enquanto migra serviços críticos
- Completa: substituir todo o ruleset de uma vez, com rollback planejado
Boas práticas essenciais:
- Documentar cada regra com comentários
- Ordenar regras da mais específica para a mais genérica
- Incluir regras de logging para tráfego rejeitado
- Realizar limpeza periódica de regras obsoletas
- Versionar arquivos de configuração em sistemas de controle
# Exemplo de regra com logging
nft add rule inet firewall input tcp dport 23 log prefix "BLOCKED_TELNET: " drop
A migração para nftables oferece benefícios de desempenho, manutenção simplificada e sintaxe mais expressiva, sendo o padrão recomendado para novas implementações em kernels modernos.
Referências
- Documentação Oficial do Netfilter — Documentação completa sobre o framework de filtragem de pacotes do kernel Linux
- nftables Wiki — Wiki oficial com exemplos práticos, sintaxe e guias de configuração
- Iptables Tutorial do O'Reilly — Livro técnico aprofundado sobre firewalls Linux com iptables
- Guia de Migração iptables para nftables (Red Hat) — Documentação oficial da Red Hat sobre estratégias de migração
- Arch Linux Wiki: nftables — Tutorial prático com exemplos de configuração e boas práticas
- DigitalOcean: Como Configurar Firewall com iptables — Guia com comandos essenciais e exemplos reais de iptables
- Linux Foundation: Netfilter Architecture — Artigo técnico sobre a arquitetura do Netfilter e seus hooks