A apresentação de Dan Wing na Google IPv6 Implementors Conference [1] sobre o NAT66 despertou-me a curiosidade sobre este mecanismo de tradução de endereços.
Se alguém me perguntasse até há bem pouco tempo atrás sobre o que pensava sobre a implementação de NAT em IPv6 (NAT66) essa pessoa assistiria provavelmente uma reacção quase furiosa. Admito que o meu “relacionamento” com o actual NAT não é nada bom…: Podem consultar um post anterior sobre o assunto. Se o NAT66 alguma vez vier a pretender replicar o que se faz actualmente em IPv4 não terei dúvidas em rejeita-lo frontalmente.
Mas o NAT em IPv6 de que fala Dan Wing e o IETF Draft de M. Wasserman e F. Baker [2] promete ter poucas semelhanças com o NAT44, pelo que, resolvi dar tréguas ao meu “preconceito” e dar o benefício da dúvida a este mecanismo em IPv6 tendo em conta a documentação produzida por estes senhores, e assim apresento um resumo daquilo que eu entendi sobre a proposta actual de funcionamento do NAT66:
1 - O que não pretende fazer:
- Partilhar endereços IP: Nem faz sentido em IPv6, cada máquina tem 64 bits reservados para definir o seu endereço.
- Usar ou alterar portos TCP ou UDP: Não interfere directamente com o L4 pois não existe alteração de portos (PAT), mas…
- Manter uma tabela de ligações por portos ou por máquina. É stateless: A alteração é algorítmica e é sempre a mesma para todos os pacotes: Apenas troca no IP de um prefixo “x” por um prefixo “y” ou “z”e vice-versa.
-Impedir uma ligação directa entre IPs endereços globais (internet) e endereços locais: Não existe interferência na conectividade global “end-to-end”, uma máquina numa rede local está tão directamente contactável do exterior como numa rede IPv6 sem NAT66, mas alguns poderão assumir que o NAT66 fornece a mesma falsa protecção do NAT44. A segurança (em IPv4 ou IPv6) deverá ser assegurada implementando e configurando de forma adequada firewalls, SOs e aplicações e a não assentar em princípios de “obscuridade” da rede local.
2 - Como funciona:
Exemplo:
Rede Global: 2A01:666:C73E:/48
----------------------------------
|
---------
| NAT66 |
---------
|
--------------------------------
Rede Local: FD01:A33:FACE:/48
No sentido Rede Local --> Rede Global o endereço de origem é reescrito com a troca o prefixo do FD01:A33:FACE:/48 pelo 2A01:666:C73E:/48. No sentido Rede Global --> Rede Local a troca de prefixo é inversa, mas agora no endereço de destino.
Outro cenário interessante:
Rede Global #1 Rede Global #2
2001:A:BES7:1/48 2A01:666:C73E:/48
------------------------ -------------------------
| |
+---------+ +---------+
NAT66#1 NAT66#2
+---------+ +---------+
| |
--------------------------------------
Rede Local: FD01:A33:FACE:/48
Neste cenário poderemos estar a usar dois operadores em simultâneo (para diferentes serviços, ou como securização) ou a fazer load balancing(?). [2]
3 – Argumentos para implementar:
- IPv6 Provider Independent (PI) addresses. Independência do endereçamento IP (e das todas as configurações a ele associadas: ACLs, LOGs, etc) de uma rede face ao endereçamento do ISP (endereçamento global).
- Facilita o multihoming: Existem falhas no suporte ao SAS \ DAS (Source \ Destination Address Selection): Este mecanismo pode alterar o prefixo em função do destino ou ISP que se pretende usar. Alguns equipamentos não lidam muito bem com vários prefixos na mesma interface, podendo enviar pacotes com um prefixo inválido para um ISP (o que levará à perda do pacote nas regras de segurança do ISP) ou ao regresso do pacote por caminho diferente daquele que foi usado no envio (levando ao eventuais problemas de segurança, jitter, perdas de pacotes, etc.)
- Facilita a resolução de problemas relacionados com “Split-Zone DNS” e aceitação de “Next-hop route selection”
4- Problemas:
- Interfere indirectamente com os mecanismos de correcção de erros do L4. Não existe checksum no cabeçalho IPv6, mas a alteração dos endereços (prefixos) implica a existência de uns mecanismos de acerto do endereço nos últimos 16 bits (49 a 64) dos prefixos, de modo a que o checksum do pacote IP no L4 não seja alterado.
- O ponto anterior implica que o ISP terá de fornecer uma rede \48 ou maior … o que de certo modo significa desperdiçar 16 bits no uso deste mecanismo, bem como reservar para este uso os mesmos 16bits no endereçamento na rede local.
- A alteração do prefixo interfere com o cabeçalho do IP (manipulado pelo AH no IPSec) pelo que pode impedir a encriptação “end-to-end” assim como interfere com aplicações que transportem informação sobre o IP (obrigando ao uso de ALGs).
- Incompatibilidades como o HIP (Host Identity Protocol): Protocolo que pretende atribuir um endereço único global seguro, e que pode ter um importante papel na mobilidade IP ao permitir que o L4 (transporte TCP ou UDP) se abstraia do endereço L3 (IP) (fica entre estas duas camadas). [3]
- Aumento da complexidade de configuração.
5 – Conclusões
O NAT mesmo na sua versão simplificada em IPv6 introduz complexidade, desperdício de endereçamento, incompatibilidades, limitações e ainda penso que ainda existe o risco de uma provável tendência para os saudosistas tentarem implementar um NAT à imagem do que se faz em IPv4. Como diz Dan Wing temos de evitar usar NAT66, mas se não forem introduzidos melhorias em alguns aspectos do IPv6 o seu uso poderá vir a ser necessário
Por aquilo que entendi considero que o NAT66 não é nem uma solução isenta de problemas complexos, nem uma aberração que pretente deturpar os principos da conectividade em IPv6. O seu uso deveria ser evitado, mas se resolver muitos mais problemas do que aqueles que vai criar…talvez possa ser considerado tolerável e exequível em situações pontuais, até porque a limitação do ISP ter de fornecer pelo menos um prefixo \48 vai certamente limitar muito o seu uso.
Fontes
[1] Conferencia Google
- PDF (slides): ipv6implementors/03_Wing_avoiding-nat66.pdf
- Video: http://www.youtube.com
[2] Draft IETF: http://tools.ietf.org/html/draft-mrw-behave-nat66-02
[3] Trabalho de Zhangyi Yuan sobre NAT66: http://www.asiafi.net/meeting/2010/winterschool/asiafi-papers/afiwinter2010_Zhangyi_Yuan.pdf