Mudanças entre as edições de "464XLAT utilizando a ferramenta Jool"

De Wiki BPF
Ir para navegação Ir para pesquisar
Linha 9: Linha 9:
 
=== Por que utilizar o 464XLAT ? ===
 
=== Por que utilizar o 464XLAT ? ===
  
Inicialmente o estudo começou em uma rede piloto utilizando o mecanismo de transição NAT64 em conjunto com o DNS64 em uma rede sem fio para atender os alunos, docentes e visitantes que chegam na Universidade, mais especificamente na Faculdade de Ciências Aplicadas ([https://www.fca.unicamp.br/portal/pt-br/ FCA]), devido a não termos mais IPv4 públicos disponíveis para serem atribuídos. A ideia inicial foi entregar somente endereços IPv6 na rede sem fio para os usuários famintos por conectividade diariamente. Esse estudo completo está disponível [https://www.lacnic.net/innovaportal/file/3207/1/apresentacao-lacnic-henri-v2.pdf aqui] para quem desejar obter mais detalhes.
+
Inicialmente o estudo começou em uma rede piloto utilizando o mecanismo de transição NAT64 em conjunto com o DNS64 em uma rede sem fio para atender os alunos, docentes e visitantes que chegam na Universidade, mais especificamente na Faculdade de Ciências Aplicadas ([https://www.fca.unicamp.br/portal/pt-br/ FCA]), devido a não termos mais IPv4 públicos disponíveis para serem atribuídos. A ideia foi entregar somente endereços IPv6 na rede sem fio para os usuários famintos por conectividade diariamente. Esse estudo completo está disponível [https://www.lacnic.net/innovaportal/file/3207/1/apresentacao-lacnic-henri-v2.pdf aqui] para quem desejar obter mais detalhes.
  
 
Apesar do seu bom funcionamento e sua crescente utilização, durante o uso do NAT64 foram detectados alguns problemas na rede:
 
Apesar do seu bom funcionamento e sua crescente utilização, durante o uso do NAT64 foram detectados alguns problemas na rede:
Linha 19: Linha 19:
 
Portanto, o uso somente de NAT64/DNS64 em um rede não é uma solução viável.  
 
Portanto, o uso somente de NAT64/DNS64 em um rede não é uma solução viável.  
  
Para resolver esses problemas foram realizados testes com outro mecanismo de transição muito similar ao NAT64, chamado de 464XLAT RFC 6877. A diferença é que ao invés de ter somente um endereço IPv6 é entregue também um endereço IPv4 privado. Com isso podemos atender os dispositivos legados que não possuem suporte a IPv6. De maneira geral é adicionado um tradutor próximo ao cliente chamado de CLAT (''Customer-side Translator'') executando a função de tradução de IPv4 para IPv6 chamado de SIIT (''Stateless IP/ICMP Translation Algorithm'') RFC 7915. Existe um entendimento hoje de chamarem o CLAT como NAT46.
+
Para resolver esses problemas foram realizados testes com outro mecanismo de transição muito similar ao NAT64, chamado de 464XLAT RFC 6877. A diferença é que ao invés de ter somente um endereço IPv6 é entregue também um endereço IPv4 privado. Com isso podemos atender os dispositivos legados que não possuem suporte a IPv6. De maneira geral é adicionado um tradutor próximo ao cliente chamado de CLAT (''Customer-side Translator'') executando a função de tradução de IPv4 para IPv6 conhecido como SIIT (''Stateless IP/ICMP Translation Algorithm'') RFC 7915. Existe um entendimento hoje de chamarem o CLAT como NAT46.
  
Exemplo: Um dispositivo que tenha recebido somente um IPv4 privado e deseja acessar um endereço também em IPv4, sofrerá um primeira tradução de endereços no CLAT para que o endereço em IPv6 seja transmitido por uma infraestrutura IPv6 até chegar ao ISP, onde será realizada uma segunda tradução, agora para IPv4 novamente, chegando ao seu destino. Chamados essa segunda tradução de PLAT (''Provider-side Translator'') que nada mais é que um NAT64, já conhecido. Quando o destino for um endereço IPv6 seu trânsito será realizado diretamente pela rede IPv6 sem a necessidade de traduções pelo PLAT.
+
Exemplo: Um dispositivo que tenha recebido somente um IPv4 privado e deseja acessar a Internet tendo como destino um endereço em IPv4, sofrerá uma primeira tradução de endereços no CLAT para que o endereço em IPv6 seja transmitido por uma infraestrutura IPv6 até chegar ao ISP, onde será realizada uma segunda tradução, agora para IPv4 novamente, chegando ao seu destino. Chamados essa segunda tradução de PLAT (''Provider-side Translator'') que nada mais é que um NAT64, já conhecido. Quando o destino for um endereço IPv6 seu trânsito será realizado diretamente pela rede IPv6 sem a necessidade de traduções pelo PLAT.
  
 
=== Por que utilizar o Jool ? ===
 
=== Por que utilizar o Jool ? ===
Linha 168: Linha 168:
 
=== Auditoria ===
 
=== Auditoria ===
  
O Jool consegue registrar com detalhes quando uma tradução é criada e finalizada utilizando o arquivo gerado pelo syslog. É recomendado ativar o logging do Jool para o caso de uma análise de incidentes de segurança. Segue abaixo um exemplo do log gerado:
+
O Jool consegue registrar com detalhes no PLAT quando uma tradução é criada (''Added''), mapeada (''Mapped'') e finalizada (''Forgot'') utilizando o arquivo ''messages'' gerado pelo ''syslog''. É recomendado ativar o logging do Jool para o caso de uma análise de incidentes de segurança. Segue abaixo um exemplo do log gerado:
 
<pre>
 
<pre>
 
[236793.979096] Jool: default 2020/1/30 13:22:38 (GMT) - Added session 2801:8a:c040:200::a#45399|64:ff9b::426e:3120#1443|143.106.230.240#43549|66.110.49.32#1443|TCP
 
[236793.979096] Jool: default 2020/1/30 13:22:38 (GMT) - Added session 2801:8a:c040:200::a#45399|64:ff9b::426e:3120#1443|143.106.230.240#43549|66.110.49.32#1443|TCP

Edição das 07h50min de 3 de fevereiro de 2020

Introdução

Este breve artigo tem como objetivo demonstrar o uso do mecanismo de transição 464XLAT através da ferramenta de código aberto Jool, desenvolvido pela equipe de programadores do NIC México. Serão abordados conceitos e comandos básicos que podem ser utilizados tanto para Provedores de Acesso a Internet (ISP), Universidades, Empresas, como também quem deseja montar um laboratórios de testes iniciais para conhecer a ferramenta e o funcionamento do 464XLAT em redes locais e sem fio.

Com a escassez cada vez mais nos números IP versão 4 (IPv4) e a necessidade de conexão de cada vez mais dispositivos na Internet, a adoção do IP versão 6 (IPv6) é a solução mais viável até o momento para que possamos crescer e expandir novos serviços de conexão a Internet. Recentemente a diretoria do LACNIC fez um comunicado à comunidade para favorecer e acelerar a implementação do IPv6 nas redes da região. Na América Latina, o esgotamento completo do IPv4 está previsto para o mês de agosto de 2020.

Este estudo faz parte de um trabalho desenvolvido na Universidade Estadual de Campinas (UNICAMP) de forma a acelerar e adequar os sistemas computacionais a conviver com o protocolo IPv6 e oferecer uma Internet cada vez melhor a toda comunidade na promoção do ensino, pesquisa e extensão.

Por que utilizar o 464XLAT ?

Inicialmente o estudo começou em uma rede piloto utilizando o mecanismo de transição NAT64 em conjunto com o DNS64 em uma rede sem fio para atender os alunos, docentes e visitantes que chegam na Universidade, mais especificamente na Faculdade de Ciências Aplicadas (FCA), devido a não termos mais IPv4 públicos disponíveis para serem atribuídos. A ideia foi entregar somente endereços IPv6 na rede sem fio para os usuários famintos por conectividade diariamente. Esse estudo completo está disponível aqui para quem desejar obter mais detalhes.

Apesar do seu bom funcionamento e sua crescente utilização, durante o uso do NAT64 foram detectados alguns problemas na rede:

  • Sem conectividade em dispositivos legados de usuários e visitantes que não suportavam o protocolo IPv6.
  • Aplicações que ainda utilizavam IP literal. RFC 6586 Seção 6.1
  • Dificuldade no mapeamento de pastas e impressoras na rede.

Portanto, o uso somente de NAT64/DNS64 em um rede não é uma solução viável.

Para resolver esses problemas foram realizados testes com outro mecanismo de transição muito similar ao NAT64, chamado de 464XLAT RFC 6877. A diferença é que ao invés de ter somente um endereço IPv6 é entregue também um endereço IPv4 privado. Com isso podemos atender os dispositivos legados que não possuem suporte a IPv6. De maneira geral é adicionado um tradutor próximo ao cliente chamado de CLAT (Customer-side Translator) executando a função de tradução de IPv4 para IPv6 conhecido como SIIT (Stateless IP/ICMP Translation Algorithm) RFC 7915. Existe um entendimento hoje de chamarem o CLAT como NAT46.

Exemplo: Um dispositivo que tenha recebido somente um IPv4 privado e deseja acessar a Internet tendo como destino um endereço em IPv4, sofrerá uma primeira tradução de endereços no CLAT para que o endereço em IPv6 seja transmitido por uma infraestrutura IPv6 até chegar ao ISP, onde será realizada uma segunda tradução, agora para IPv4 novamente, chegando ao seu destino. Chamados essa segunda tradução de PLAT (Provider-side Translator) que nada mais é que um NAT64, já conhecido. Quando o destino for um endereço IPv6 seu trânsito será realizado diretamente pela rede IPv6 sem a necessidade de traduções pelo PLAT.

Por que utilizar o Jool ?

A ferramenta Jool foi escolhida por ser uma software de código aberto, que pode ser instalado em qualquer distribuição Linux moderno. Além do mais, é uma ferramenta que possui uma comunidade ativa, atualizações e correções de problemas frequentes e principalmente é mantida pelo equipe de desenvolvedores do NIC México, altamente receptivos a qualquer dúvida ou sugestões. É uma ferramenta estável, simples, fácil de usar, possui uma boa performance e não exige muita CPU e Memória RAM. Outro detalhe que chama atenção é com relação aos logs de tradução gerado com detalhes, importante hoje em dia durante uma análise de incidentes de segurança. Seria impossível abordar nesse tutorial todas as sintaxes de comando que o Jool oferece e sua flexibilidade nas configurações e ajustes finos para adequar a cada cenário. A documentação completa e detalhada pode ser acessada no site do Jool.

Topologia

A Figura 1 mostra a topologia de um cenário onde os clientes finais utilizam a rede sem fio para se conectarem a Internet. Como ainda não temos um aplicativo cliente para fazer a função de CLAT em redes WiFi e que possam ser instalados nos dispositivos, por exemplo, notebooks e smartphones (Windows, iOS e Android) ou a implementação da funcionalidade CLAT massiva em CPEs, inserimos uma máquina virtual (VM) chamada CLAT na VLAN do controlador da rede sem fio para que a tradução nos clientes sejam realizadas. Uma outra VM chamada PLAT deve estar localizada na saída do tráfego IPv6 para a Internet no Provedor. A conexão entre o CLAT e PLAT é exclusivamente utilizando IPv6 e no caso dos ISPs estão localizados distantes um do outro. Neste cenário, as máquinas virtuais CLAT e PLAT estão no mesmo lugar físico no Data Center, podendo neste caso, estarem localizados em um mesmo host até. Por questões didáticas utilizaremos cada tradutor em VM distintas.

Enquanto em um cenário utilizando IPv6-only e NAT64 o uso do DNS64 é fundamental para o funcionamento, já no 464XLAT é opcional. Neste tutorial não estaremos configurando e utilizando o DNS64. A ausência do DNS64 não causa grandes problemas de performance durante a navegação na Internet, mesmo sabendo que nesse caso o CLAT estará trabalhando sempre, pois não guardará os estados das conexões.

Figura 1 - Topologia 464XLAT

Instalação e Configuração do Ambiente

O Linux utilizado é o CentOS 7 que pode ser encontrado no repositório da distribuição e deverá ser instalado em ambas as VM para que o Jool possa ser compilado. Não abordaremos aqui a instalação e configuração do Linux CentOS 7 como também as configurações dos IPs nas interfaces de rede e o roteamento. A ferramenta Jool pode ser encontrada no site Jool em sua última versão. O download pode ser feito tanto no formato tarballs como pelo repositório Github.

wget https://github.com/NICMx/Jool/releases/download/v4.0.7/jool-4.0.7.tar.gz
git clone https://github.com/NICMx/Jool.git

Alguns outros ajustes indicados em cada VM são:

  • Ajustes do smp_affinity que podem ser consultada em /proc/interrupts para um melhor uso da CPU com a interrupção do driver de rede Ethernet. Parece uma coisa boba mas faz muita diferença.
  • Habilitar o ip forwarding no Kernel:
sysctl -w net.ipv4.conf.all.forwarding=1 
sysctl -w net.ipv6.conf.all.forwarding=1
  • Desabilitando Offload nas interfaces de rede:
ethtool --offload interface lro off 
ethtool --offload interface gro off
  • Ajustes para melhorar a performance na rede:
kern.maxfiles=25600 
kern.maxfilesperproc=16384 
net.inet.tcp.sendspace=65536 
net.inet.tcp.recvspace=65536 
net.core.netdev_max_backlog = 65536

Desde a versão 4.0.x a instalação dos módulos do Jool devem ser feitas através do suporte de módulo de kernel Dinâmico (DKMS), fazendo com que a cada nova versão do Kernel atualizado, todos os módulos DKMS são recompilados automaticamente. A instalação do Jool devem ser realizadas em ambas as VM. Após o download executar o comando:

/sbin/dkms install jool-4.0.7/

Os arquivos executáveis da aplicação Jool devem ser instaladas de forma separada aos do módulo do Kernel executando para isso a sequência de comandos:

cd jool-4.0.7/
./configure
make
make install

Implementando o CLAT

A primeira tradução (Stateless Translation) acontece quando um endereço IPv4 privado não roteável é traduzido para IPv6 antes de chegar ao PLAT. Uma tabela de mapeamento de endereços chamada de EAMT (Explicit Address Mapping Specification) RFC 7757 descreve como diferentes endereços devem ser traduzidos. No Jool todos os registros são bidirecionais e para executarmos devemos informar o prefixo pool6 para tradução de endereços IPv4 para IPv6 a serem utilizados de acordo com o cenário proposto, digitando os comandos:

jool_siit instance add --netfilter --pool6 64:ff9b::/96
jool_siit eamt add 192.168.200.0/24 2801:8a:c040:200::

Desde a versão 4.0.6 é possível fazer uma consulta da tabela EAMT através do comando address query o qual nos auxilia a entender a tradução.

[root@clat ~]# jool_siit address query 192.168.200.11
2801:8a:c040:200::b
[root@clat ~]#

O Jool permite utilizar um arquivo de configuração no formato JSON como uma maneira prática de guardar as configurações atuais podendo ser adicionados como um script de inicialização e a cada reboot iniciá-lo automaticamente.

[root@clat ~]# cat /etc/jool_siit.json
{

        "comment": "SIIT Config",
        "instance": "default",
        "framework": "netfilter",

        "global": {

                "pool6": "64:ff9b::/96"
        },

        "eamt": [
                { "ipv6 prefix": "2801:8a:c040:200::", "ipv4 prefix": "192.168.200.0/24" }
        ]

}

Para executar o arquivo de configuração JSON:

[root@clat ~]# jool_siit file handle /etc/jool_siit.json

Implementando o PLAT

A segunda tradução (Stateful Translation) acontece logo em seguida quando o pacote chega a VM PLAT. Para habilitar a tradução devemos digitar o comando:

[root@plat ~]# jool instance add --netfilter --pool6 64:ff9b::/96
[root@plat ~]# jool pool4 add 143.106.230.240

Para um melhor ajuste do pool IPv4 e as portas utilizadas podemos configurar o seu intervalo que serão adicionados por demanda.

[root@plat ~]# sysctl -w net.ipv4.ip_local_port_range="32768 40000"

[root@plat ~]# jool pool4 add 143.106.230.240 40001-61000 --tcp
[root@plat ~]# jool pool4 add 143.106.230.240 40001-61000 --udp
[root@plat ~]# jool pool4 add 143.106.230.240 40001-61000 --icmp

Para que o Jool faça o log das traduções realizadas e das portas utilizadas, recomenda-se adicionar as seguintes opções:

[root@plat ~]# jool global update logging-bib true
[root@plat ~]# jool global update logging-session true

Exemplo do arquivo JSON para automatizar as configurações de inicialização:

{
        "comment": "Config NAT64",
        "instance": "default",
        "framework": "netfilter",
        "global": {
                "pool6": "64:ff9b::/96",
                "logging-bib": true,
                "logging-session": true
        },

        "pool4": [

                {
                        "protocol": "TCP",
                        "prefix": "143.106.230.240",
                        "port range": "40001-61000"
                }, {
                        "protocol": "UDP",
                        "prefix": "143.106.230.240",
                        "port range": "40001-61000"
                }, {
                        "protocol": "ICMP",
                        "prefix": "143.106.230.240",
                        "port range": "40001-61000"
                }, 
        ]
}

Auditoria

O Jool consegue registrar com detalhes no PLAT quando uma tradução é criada (Added), mapeada (Mapped) e finalizada (Forgot) utilizando o arquivo messages gerado pelo syslog. É recomendado ativar o logging do Jool para o caso de uma análise de incidentes de segurança. Segue abaixo um exemplo do log gerado:

[236793.979096] Jool: default 2020/1/30 13:22:38 (GMT) - Added session 2801:8a:c040:200::a#45399|64:ff9b::426e:3120#1443|143.106.230.240#43549|66.110.49.32#1443|TCP
[236793.979148] Jool: default 2020/1/30 13:22:38 (GMT) - Mapped 2801:8a:c040:200::a#45399 to 143.106.230.240#43549 (TCP)

Onde temos:

2801:8a:c040:200::a#45399  --> Endereço IPv6 origem gerado no NAT46/CLAT e porta.
64:ff9b::426e:3120#1443  --> Endereço pool6 para tradução no NAT64/PLAT.
143.106.230.240#43549 --> Endereço IPv4 mascarado de saída no NAT64/PLAT e porta
66.110.49.32#1443|TCP --> Endereço IPv4 destino, porta e protocolo de transporte.

Somente isso não é suficiente para rastrear o usuário que realizou a conexão. É necessário a combinação de vários logs de sistemas para complementar a auditoria. Por isso, todo usuário da rede sem fio passa por um Captive Portal que se autentica em uma base de usuários utilizando o FreeRADIUS. Segue abaixo uma parte do log do radius de uma conexão do usuário:

Thu Jan 30 10:22:36 2020
        Acct-Session-Id = "5E32D87D-BDBC3E02"
        Framed-IP-Address = 192.168.200.10 --> IPv4 Privado a ser traduzido no CLAT
        Framed-Interface-Id = 40d9:cda9:1952:7fe6  --> Temporary IPv6 Address
        Framed-IPv6-Prefix = 2801:8a:c040:200::/64 --> IPv6 Network
        Acct-Multi-Session-Id = "f0b0521e8e9ef0d7aa5382fc5e32d87d1ccd"
        Acct-Status-Type = Start
        Acct-Authentic = RADIUS
        User-Name = "henri.godoy" --> Usuário
        NAS-Identifier = "F0-B0-52-1E-8E-9E"
        Called-Station-Id = "F0-B0-52-1E-8E-9E:FCA6"
        Calling-Station-Id = "F0-D7-AA-53-82-FC" --> MAC Address do dispositivo
        NAS-Port-Type = Wireless-802.11
        Connect-Info = "CONNECT 802.11a/n"
        Event-Timestamp = "Jan 30 2020 10:22:30 -03"
        NAS-IPv6-Address = 2801:8a:c040:fca1::4
        FreeRADIUS-Acct-Session-Start-Time = "Jan 30 2020 10:22:36 -03"

Conclusões

Vivemos em um momento que não podemos mais falar sobre a ausência de tráfego de pacotes em IPv6 e deixarmos de lado sua implementação. A adoção tanto por ISPs quanto Operadoras de Telecom é necessária para que a Internet continue crescendo e que todos sintam o benefício e a experiência de uma melhor navegação na Internet, pois dependemos da ajuda de todos os Sistemas Autônomos (AS) para que ativem o protocolo IPv6 em seus equipamentos.

Reforçando mais uma vez, não existem motivos para não adotar o IPv6 hoje em dia. Existem uma grande quantidade de materiais, treinamentos, eventos e tutoriais disponíveis pelo NIC Brasil no qual tem realizado um belo trabalho no fomento para adoção do IPv6 no Brasil. O LACNIC tem promovido além de seus eventos anuais, Webinars e Cursos alguns gratuitos sobre o assunto. Porém a procrastinação em IPv6 (palavra difícil que aprendi com o Uesley Corrêa no GTER48) tem sido muito praticada. Quem realiza esse ato está praticando uma espécie de auto-sabotagem diariamente e isso tem interferido no bom funcionamento da Internet no qual somos todos corresponsáveis.

Por fim, quanto mais endereços IPv6 configurado nas redes temos:

  • Menos traduções são realizadas nos equipamentos.
  • Facilita e agiliza a identificação de um host/usuário no caso de uma auditoria.
  • O scanning da rede se torna mais complexo.
  • Você estará contribuindo para o crescimento e desenvolvimento da Internet. ;-)

Espero com esse tutorial ter auxiliado e incentivado o uso do 464XLAT, apresentando o Jool como ferramenta prática. Qualquer dúvida, sugestões, críticas, estou a disposição.

Autor: Henri A. Godoy

Referências

Internet-Draft atuais sobre o assunto