Dia 10: NAT — SNAT, DNAT, PAT e NPTv6 para IPv6
O Network Address Translation (NAT) é uma das técnicas mais fundamentais e simultaneamente mais debatidas no mundo das redes. Permite que múltiplos dispositivos com endereços privados partilhem um único endereço IP público para aceder à Internet, mas também introduz complexidade que quebra a comunicação extremo-a-extremo. Neste décimo dia do Curso de Redes, exploramos as variantes SNAT, DNAT e PAT (masquerade), a configuração com iptables e nftables, e ainda o NAT64 e o NPTv6 para IPv6.
Artigos anteriores: Dia 2 — IPv4: Classes, Subnetting, CIDR e VLSM e Dia 3 — IPv6: Endereçamento, Tipos e Transição Dual-Stack. Próximo: Dia 11 — Firewalls (em breve).
Neste artigo
- 1. Introdução ao NAT
- 2. SNAT e DNAT
- 3. PAT — Masquerade no Linux
- 4. NAT com iptables
- 5. NAT com nftables
- 6. NAT64 e NPTv6 para IPv6
- 7. Erros Comuns e Lista de Verificação
ℹ O NAT permite que múltiplos dispositivos partilhem um único IP público — fundamental para o funcionamento do IPv4.
1. Introdução ao NAT
O Network Address Translation (NAT), definido na RFC 3022, é um mecanismo que modifica os endereços IP nos cabeçalhos dos pacotes de rede enquanto estes atravessam um router ou firewall. O objectivo principal é permitir que dispositivos numa rede privada (usando endereços não-encaminháveis como 192.168.0.0/24) comuniquem com a Internet pública, onde apenas são aceites endereços encaminháveis.
O NAT tornou-se essencial devido ao esgotamento dos endereços IPv4. Sem NAT, cada dispositivo precisaria de um endereço IP público único — algo impossível com apenas 4 mil milhões de endereços disponíveis no espaço IPv4 de 32 bits. O NAT resolve este problema através de um mapeamento entre endereços privados e públicos, realizado num dispositivo de fronteira (router, firewall, gateway).
Existem três tipos principais de NAT, consoante a direcção e o tipo de tradução:
| Tipo | Tradução | Uso típico |
|---|---|---|
| SNAT | IP de origem | Saída para Internet |
| DNAT | IP de destino | Redireccionamento de portos / servidores internos |
| PAT (Masquerade) | IP + porto de origem | Partilha de um IP público entre múltiplos dispositivos |
O NAT opera em diferentes fases do processamento de pacotes no kernel Linux. A tabela nat do Netfilter (a infraestrutura por trás do iptables) intercepta pacotes em três pontos: PREROUTING (antes do encaminhamento, para DNAT), POSTROUTING (depois do encaminhamento, para SNAT) e OUTPUT (pacotes gerados localmente, antes do encaminhamento).
⚠ O NAT quebra a comunicação extremo-a-extremo e complica protocolos como SIP, FTP activo e IPsec — preferir IPv6 quando possível.
2. SNAT e DNAT
SNAT (Source NAT) modifica o endereço IP de origem dos pacotes. É usado quando os dispositivos numa rede privada precisam de aceder à Internet. O router substitui o endereço privado (ex.: 192.168.1.50) pelo endereço público do router (ex.: 203.0.113.1), e guarda o mapeamento numa tabela de tradução. Quando a resposta regressa, o router reverte a tradução e entrega o pacote ao dispositivo interno correcto.
O SNAT exige que o endereço público seja conhecido e estático. Se o IP público for dinâmico (como numa ligação doméstica com DHCP), usa-se a variante MASQUERADE, que é uma forma de SNAT que detecta automaticamente o IP de saída.
DNAT (Destination NAT) faz o inverso: modifica o endereço IP de destino. É usado para redireccionar tráfego que chega a um porto público para um servidor interno. Por exemplo, pedidos HTTP no porto 80 do IP público podem ser redireccionados para um servidor web interno em 192.168.1.100:8080. Isto permite publicar serviços internos sem expor directamente os servidores à Internet.
O fluxo de um pacote através do NAT envolve estas etapas:
- O pacote chega à interface externa do router.
- PREROUTING (DNAT): o IP de destino é traduzido para o endereço interno do servidor.
- O kernel decide o encaminhamento com base no novo IP de destino.
- POSTROUTING (SNAT): o IP de origem é traduzido para que a resposta regresse pelo router.
- O pacote é entregue no destino final. A resposta percorre o caminho inverso, revertendo as traduções.
Um caso comum que combina SNAT e DNAT é o reencaminhamento de porto: o DNAT redirecciona o tráfego que chega a um porto público para um servidor interno, e o SNAT (masquerade) garante que a resposta volta pelo mesmo router.
3. PAT — Masquerade no Linux
PAT (Port Address Translation), também conhecido como masquerade, NAT de sobrecarga ou NAT overload, é a forma mais comum de NAT em redes domésticas e pequenas empresas. Em vez de mapear cada IP privado para um IP público único (o que exigiria tantos IPs públicos quantos os dispositivos internos), o PAT mapeia múltiplos IPs privados para um único IP público, distinguindo as ligações pelo número de porto de origem.
O processo funciona assim: quando um dispositivo interno (ex.: 192.168.1.50:5000) envia um pacote, o router substitui o IP de origem pelo IP público e atribui um porto de origem único (ex.: 203.0.113.1:40001). Esta entrada é guardada numa tabela de tradução. Quando outro dispositivo envia um pacote, recebe um porto diferente (ex.: 203.0.113.1:40002). O router consegue assim distinguir as ligações e reencaminhar as respostas correctas.
No Linux, o PAT é implementado pela regra MASQUERADE. Ao contrário do SNAT que requer um IP estático, o MASQUERADE detecta automaticamente o IP da interface de saída em cada pacote, tornando-o ideal para ligações com IP dinâmico (DHCP, PPPoE, ligações móveis).
A tabela de traduções NAT pode ser consultada no ficheiro /proc/net/nf_conntrack. Cada entrada mostra o protocolo, os endereços e portos originais e traduzidos, e o tempo de vida restante. O número máximo de ligações simultâneas é controlado por nf_conntrack_max, que por defeito é proporcional à memória do sistema.
O PAT tem limitações práticas: o espaço de portos TCP/UDP é de 16 bits (até 65 535 portos por IP público). Embora cada ligação consuma um porto, na prática o limite é atingido em redes com milhares de ligações simultâneas. Em ambientes empresariais, isto pode justificar múltiplos IPs públicos ou a adopção de IPv6.
4. NAT com iptables
O iptables é a ferramenta clássica para configurar NAT no Linux. As regras NAT são colocadas na tabela nat, que tem três cadeias: PREROUTING (DNAT), POSTROUTING (SNAT/MASQUERADE) e OUTPUT (DNAT de pacotes locais). Antes de qualquer regra NAT, é obrigatório activar o encaminhamento de pacotes no kernel.
# Activar encaminhamento de pacotes
echo 1 > /proc/sys/net/ipv4/ip_forward
# NAT com iptables
# SNAT — traduz IP de origem
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 203.0.113.1
# MASQUERADE (PAT) — para IP dinâmico
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
# DNAT — redireccionar porto
iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to-destination 192.168.1.100:8080
# Reencaminhamento de porto
iptables -t nat -A PREROUTING -p tcp --dport 2222 -i eth0 -j DNAT --to-destination 192.168.1.50:22
# Verificar regras NAT
iptables -t nat -L -n -v
# NPTv6 para IPv6
ip6tables -t mangle -A POSTROUTING -o eth0 -j NPT --src-prefix 2001:db8:1::/48 --dst-prefix 2001:db8:2::/48
Para que o DNAT funcione correctamente, é necessário garantir que o tráfego de retorno também passa pelo router. Se o servidor interno puder responder directamente ao cliente (sem voltar pelo router), a tradução falha. A solução é adicionar uma regra de SNAT para o tráfego redireccionado, garantindo que a resposta volta pelo router:
# DNAT + SNAT para garantir caminho de retorno
iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to-destination 192.168.1.100:8080
iptables -t nat -A POSTROUTING -d 192.168.1.100 -p tcp --dport 8080 -j SNAT --to-source 192.168.1.1
# Guardar regras (Debian/Ubuntu)
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6
# Restaurar regras no arranque
iptables-restore < /etc/iptables/rules.v4
Para tornar as regras persistentes após reiniciar, usa-se o pacote iptables-persistent (Debian/Ubuntu) ou um script de inicialização com iptables-save e iptables-restore.
5. NAT com nftables
O nftables é o sucessor moderno do iptables, disponível desde o kernel 3.13 e recomendado em todas as distribuições recentes (Debian 10+, Fedora 32+, Ubuntu 20.04+). Oferece uma sintaxe unificada, melhor performance e suporte nativo para IPv4, IPv6, ARP e bridge numa única infraestrutura.
# Activar encaminhamento de pacotes
echo 1 > /proc/sys/net/ipv4/ip_forward
# Criar tabela nat
nft add table ip nat
# SNAT — traduzir IP de origem
nft add chain ip nat postrouting '{ type nat hook postrouting priority 100 ; }'
nft add rule ip nat postrouting ip saddr 192.168.1.0/24 oif eth0 snat to 203.0.113.1
# MASQUERADE (PAT) — para IP dinâmico
nft add rule ip nat postrouting ip saddr 192.168.1.0/24 oif eth0 masquerade
# DNAT — redireccionar porto
nft add chain ip nat prerouting '{ type nat hook prerouting priority -100 ; }'
nft add rule ip nat prerouting iif eth0 tcp dport 80 dnat to 192.168.1.100:8080
# Reencaminhamento de porto
nft add rule ip nat prerouting iif eth0 tcp dport 2222 dnat to 192.168.1.50:22
# Verificar regras
nft list ruleset
# Guardar regras persistentes
nft list ruleset > /etc/nftables.conf
O nftables usa o conceito de cadeias (chains) que são ligadas a hooks do kernel, com uma prioridade numérica. As cadeias prerouting (prioridade -100) e postrouting (prioridade 100) correspondem às mesmas fases do iptables. A sintaxe é mais legível e permite operações em conjunto, como aplicar SNAT e DNAT na mesma regra.
Uma vantagem significativa do nftables é a capacidade de definir conjuntos de endereços e portos, reduzindo o número de regras necessárias:
# Definir conjunto de redes internas
nft add set ip nat redes_internas '{ type ipv4_addr; flags interval ; }'
nft add element ip nat redes_internas '{ 192.168.1.0/24, 10.0.0.0/8 }'
# MASQUERADE para todas as redes internas
nft add rule ip nat postrouting ip saddr @redes_internas oif eth0 masquerade
# DNAT para múltiplos portos
nft add rule ip nat prerouting iif eth0 tcp dport { 80, 443 } dnat to 192.168.1.100
O ficheiro /etc/nftables.conf é carregado pelo serviço nftables no arranque. A activação do serviço garante a persistência: systemctl enable nftables.
6. NAT64 e NPTv6 para IPv6
O IPv6, com o seu vasto espaço de endereçamento (128 bits), foi desenhado para eliminar a necessidade de NAT. Cada dispositivo pode ter um endereço público único, restaurando a comunicação extremo-a-extremo. No entanto, durante a transição de IPv4 para IPv6, existem dois mecanismos de tradução que merecem atenção: NAT64 e NPTv6.
NAT64 (definido na RFC 6146) permite que dispositivos apenas com IPv6 comuniquem com servidores apenas com IPv4. O NAT64 traduz pacotes IPv6 em pacotes IPv4 e vice-versa, incluindo a tradução de cabeçalhos. Um servidor DNS64 complementa o NAT64, traduzindo consultas DNS para registos IPv4 (A) em registos IPv6 (AAAA) sintéticos que apontam para o prefixo de tradução do NAT64. Este mecanismo é usado por operadores móveis que oferecem IPv6-only aos clientes mas precisam de manter compatibilidade com a Internet IPv4.
NPTv6 (Network Prefix Translation for IPv6, RFC 6296) é uma forma de NAT para IPv6 que traduz apenas o prefixo de rede, mantendo o identificador de interface intacto. Ao contrário do NAT64, o NPTv6 opera exclusivamente entre redes IPv6 e não envolve tradução de protocolo. É usado em cenários onde uma organização muda de provedor e precisa de traduzir o prefixo interno sem renumerar todos os dispositivos, ou onde políticas internas exigem um prefixo estável independentemente do provedor.
A diferença fundamental entre NPTv6 e o NAT tradicional é que o NPTv6 é stateless (sem estado) — não mantém uma tabela de traduções. A tradução é determinística e bidirecional: um prefixo 2001:db8:1::/48 é mapeado para 2001:db8:2::/48 mediante uma operação matemática simples (XOR de 1-bit), preservando a correspondência. Isto evita os problemas de estado e tempo limite do NAT tradicional.
# NPTv6 com ip6tables (tabela mangle)
# Traduzir prefixo de origem na saída
ip6tables -t mangle -A POSTROUTING -o eth0 -j NPT --src-prefix 2001:db8:1::/48 --dst-prefix 2001:db8:2::/48
# Traduzir prefixo de destino na entrada
ip6tables -t mangle -A PREROUTING -i eth0 -j NPT --src-prefix 2001:db8:2::/48 --dst-prefix 2001:db8:1::/48
# Verificar regras NPTv6
ip6tables -t mangle -L -n -v
É importante notar que o NPTv6 é considerado uma solução de transição e não deve ser usado como solução permanente. A IETF recomenda a adopção de endereçamento IPv6 nativo sempre que possível, reservando o NPTv6 para cenários específicos onde a renumeração é inviável.
ℹ O NAT64 combinado com DNS64 é a estratégia preferida para redes IPv6-only acederem a serviços IPv4-only, sem necessidade de dual-stack nos clientes.
7. Erros Comuns e Lista de Verificação
A configuração de NAT é propícia a erros que podem impedir a comunicação ou criar falhas de segurança. Estes são os problemas mais frequentes:
| Problema | Causa | Solução |
|---|---|---|
| Clientes não acedem à Internet | IP forward desactivado | echo 1 > /proc/sys/net/ipv4/ip_forward |
| DNAT não funciona | Resposta não volta pelo router | Adicionar regra SNAT para o tráfego redireccionado |
| Regras perdem-se após reiniciar | Sem persistência configurada | iptables-persistent ou nftables.conf + systemctl enable |
| FTP activo falha através de NAT | NAT não inspeciona canal de dados FTP | Carregar módulo nf_conntrack_ftp |
| Ligações caem aleatoriamente | Tabela conntrack cheia | Aumentar nf_conntrack_max |
| SIP não regista através de NAT | NAT não traduz payload SIP/SDP | Usar SIP ALG ou desactivar se problemático |
Lista de verificação para configuração de NAT:
- ✓ Encaminhamento activo: Confirmar
cat /proc/sys/net/ipv4/ip_forwarddevolve 1. - ✓ Regras na tabela correcta: SNAT/MASQUERADE em POSTROUTING, DNAT em PREROUTING.
- ✓ Interface de saída correcta: Especificar
-o eth0(saída) ou-i eth0(entrada) consoante a cadeia. - ✓ Caminho de retorno garantido: Para DNAT, verificar que a resposta passa pelo router (adicionar SNAT se necessário).
- ✓ Persistência: Regras guardadas em
/etc/iptables/rules.v4ou/etc/nftables.conf. - ✓ Módulos de acompanhamento: Carregar
nf_conntracke módulos de protocolo (FTP, SIP) se necessário. - ✓ Capacidade conntrack: Verificar
/proc/sys/net/netfilter/nf_conntrack_maxem redes com muito tráfego. - ✓ Teste de conectividade: Confirmar com
tcpdumpque os pacotes são traduzidos correctamente. - ✓ Segurança: Não expor portos desnecessários via DNAT; usar firewall para filtrar tráfego redireccionado.
- ✓ IPv6 preferido: Sempre que possível, usar IPv6 nativo em vez de NAT para evitar problemas de extremo-a-extremo.
O NAT é uma ferramenta poderosa que resolveu o problema do esgotamento de IPv4, mas introduz complexidade e limitações. Compreender as variantes SNAT, DNAT e PAT, saber configurá-las com iptables e nftables, e reconhecer as alternativas IPv6 (NAT64, NPTv6) é essencial para qualquer administrador de redes. No próximo artigo, o Dia 11 — Firewalls (em breve), exploraremos como proteger as redes com regras de filtragem de pacotes.
Artigos relacionados deste curso: Dia 2 — IPv4: Classes, Subnetting, CIDR e VLSM · Dia 3 — IPv6: Endereçamento, Tipos e Transição Dual-Stack