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

De Wiki BPF
Ir para: navegação, pesquisa
 
(90 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 1: Linha 1:
'''Índice'''
 
# Introdução
 
# Por que utilizar o 464XLAT ?
 
# Por que utilizar o Jool ?
 
# Topologia
 
# Instalação e Configuração do Ambiente
 
# Implementando o CLAT:
 
# Implementando o PLAT:
 
# Auditoria:
 
# Conclusão:
 
# Referências:
 
 
 
=== Introdução ===
 
=== 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 do [https://www.nicmexico.mx/ NIC México]. Serão abordados conceitos e comandos básicos que podem ser utilizados tanto para Provedores de Acesso a Internet, 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.
+
Este breve artigo tem como objetivo demonstrar o uso do mecanismo de tradução 464XLAT através do software de código aberto Jool, desenvolvido pela equipe de engenheiros, analistas e estudantes do [https://www.nicmexico.mx/ NIC México]. Serão abordados conceitos e comandos básicos que podem ser utilizados tanto para Provedores de Internet (ISP), Universidades, Empresas, como também para quem deseja montar laboratórios de testes iniciais para conhecer a ferramenta Jool e o funcionamento do 464XLAT em redes locais (LAN) ou redes sem fio (WLAN).
  
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 [https://www.lacnic.net/4284/3/lacnic/chamada-da-diretoria-do-lacnic--comunidade-para-favorecer-a-implementac%C3%A3o-do-ipv6 comunicado] à comunidade para favorecer e acelerar a implementação do IPv6 nas redes da região.
+
Com a escassez cada vez mais nos números IP versão 4 (IPv4) e o aumento de dispositivos conectados a 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. Em 2019, a diretoria do LACNIC fez um [https://www.lacnic.net/4284/3/lacnic/chamada-da-diretoria-do-lacnic--comunidade-para-favorecer-a-implementac%C3%A3o-do-ipv6 comunicado] à comunidade para favorecer e acelerar a implementação do IPv6 nas redes na região do LACNIC. Na América Latina, em agosto de 2020, foi [https://prensa.lacnic.net/news/institucional/agotamiento-de-ipv4-lacnic-asigno-el-ultimo-bloque anunciado] a designação do último bloco de IPv4.
  
 
Este estudo faz parte de um trabalho desenvolvido na Universidade Estadual de Campinas ([https://www.unicamp.br 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.
 
Este estudo faz parte de um trabalho desenvolvido na Universidade Estadual de Campinas ([https://www.unicamp.br 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 ? ===
+
=== Por que utilizar o 464XLAT (IPv4aaS) ? ===
  
Inicialmente este estudo começou como 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 distribuir somente endereços IPv6 para todos os dispositivos da rede sem fio da Unidade e assim concluído, atender os usuários famintos por conectividade. Esse estudo 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 traduçã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 Unidade do Campus II - 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 na rede. A ideia foi entregar somente endereços IPv6 na rede sem fio para os usuários famintos por conectividade que passam pelo Campus diariamente (~ 3000 pessoas). 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 foi detectado alguns problemas durante sua convivência na rede:
+
Apesar do seu bom funcionamento e sua crescente utilização, durante o uso do NAT64 foram detectados alguns problemas na rede:
  
* Dispositivos legados de usuários e visitantes que não suportavam o protocolo IPv6.  
+
* Sem conectividade em dispositivos legados de usuários e visitantes que não suportavam o protocolo IPv6.
* Aplicações que ainda utilizavam IP literal.  
+
* Aplicações que ainda utilizavam IP literal. [https://tools.ietf.org/html/rfc6586 (RFC 6586)] Seção 6.1
 
* Dificuldade no mapeamento de pastas e impressoras na rede.
 
* Dificuldade no mapeamento de pastas e impressoras na rede.
  
Uma solução para esses problemas é um outro mecanismo de transição muito similar ao NAT64, chamado de 464XLAT RFC 6877, porém 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 a diferença no mecanismo foi a adição de um tradutor o mais próximo ao cliente chamado de CLAT (customer-side translator) executando a função de tradução de IPv4 par IPv6 chamado de Stateless IP/ICMP Translation Algorithm (SIIT) RFC 7915. Existe um entendimento hoje de chamarem o CLAT como sendo NAT46.
+
Portanto, devido a esses motivos o uso somente de NAT64/DNS64 em um rede deve ser analisado com cuidado.  
  
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 usuário final (CLAT) para que o endereço em IPv6 seja transmitido por uma infraestrutura IPv6 até chegar ao Provedor de Acesso a Internet, 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.
+
Para resolver esses problemas foram realizados testes com outro mecanismo de tradução muito similar ao NAT64, chamado de 464XLAT [https://tools.ietf.org/html/rfc6877 (RFC 6877)]. A diferença é que ao invés de ter somente um endereço IPv6 é entregue 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'') ([https://tools.ietf.org/html/rfc7915 RFC 7915)]. Existe então um entendimento hoje de chamarem o CLAT como SIIT.
 +
 
 +
<pre>
 +
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.
 +
</pre>
  
 
=== Por que utilizar o Jool ? ===
 
=== Por que utilizar o Jool ? ===
  
Escolhemos a ferramenta Jool por ser uma software de código aberto, que pode ser instalado em qualquer distribuição Linux moderno. Além do mais, é um ferramenta que possui uma comunidade ativa, atualizações e correção de problemas frequentes e principalmente é mantido 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. 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.
+
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 ===
 
=== Topologia ===
  
A Figura 1 mostra a topologia de um cenário onde os clientes finais utilizam a rede sem fio para se conectar a Internet. Como ainda não temos um aplicativo cliente para fazer a função de CLAT e que possa ser instalado nos dispositivos, por exemplo, notebooks e smartphones (Windows, iOS e Android), inserimos a VM CLAT na VLAN do controlador da rede sem fio para que a tradução nos clientes sejam realizadas. A VM 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 de Provedores de Acesso estão localizados distantes um do outro. Neste cenário CLAT e PLAT estão no mesmo lugar físico no Data Center, podendo neste caso, estar localizado em um mesmo host até. Por questões didáticas utilizaremos cada tradutor em VM distintas.
+
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 Wi-Fi 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 [https://www.linux-kvm.org/page/Main_Page 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. Até então não encontrei informações ou estudos se a ausência do DNS64 ou o seu uso causaria grandes problemas de performance durante a navegação na Internet.
+
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.
  
 +
[[Arquivo:Top-nat464.jpg|centro|miniaturadaimagem|492x492px|Fig 1. Topologia 464XLAT]]
 
=== Instalação e Configuração do Ambiente ===
 
=== Instalação e Configuração do Ambiente ===
  
Não abordaremos aqui as configurações dos IP nas interfaces de rede e roteamento. Devemos estar ciente que a topologia sugerida e seus IPs precisam estar configurados para o uso da ferramenta Jool.
+
O Linux utilizado é o CentOS 7 que pode ser encontrado no [https://www.centos.org/download/ 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. O software Jool pode ser encontrado no site [https://www.jool.mx/en/download.html Jool] em sua última versão. O download pode ser feito tanto no formato ''tarballs'' como pelo repositório Github.
 
+
<pre>
Alguns outros ajustes necessários em cada VM são:
+
# wget https://github.com/NICMx/Jool/releases/download/v4.1.8/jool-4.1.8.tar.gz
 
 
* 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
+
ou
  
* Desabilitando Offload nas interfaces de rede
+
# git clone https://github.com/NICMx/Jool.git
 +
</pre>
  
ethtool --offload interface lro off ethtool --offload interface gro off
+
Alguns outros ajustes indicados em cada VM são:
  
* Ajustes para melhorar a performance na rede:
+
* Ajustes do [https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/6/html/performance_tuning_guide/s-cpu-irq 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:
 +
<pre>
 +
# sysctl -w net.ipv4.conf.all.forwarding=1
 +
# sysctl -w net.ipv6.conf.all.forwarding=1
 +
</pre>
 +
* Desabilitando o offload nas interfaces de rede:
 +
<pre>
 +
# ethtool --offload interface lro off
 +
# ethtool --offload interface gro off
 +
</pre>
 +
* Ajustes no kernel para melhorar a performance da rede:
 +
<pre>
 
kern.maxfiles=25600  
 
kern.maxfiles=25600  
 
kern.maxfilesperproc=16384  
 
kern.maxfilesperproc=16384  
Linha 66: Linha 68:
 
net.inet.tcp.recvspace=65536  
 
net.inet.tcp.recvspace=65536  
 
net.core.netdev_max_backlog = 65536
 
net.core.netdev_max_backlog = 65536
 +
</pre>
 +
 +
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:<pre>
 +
# /sbin/dkms install jool-4.1.8/
 +
</pre>
 +
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:
 +
<pre>
 +
# cd jool-4.1.8/
 +
# ./configure
 +
# make
 +
# make install
 +
</pre>
 +
 +
==== 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'') [https://tools.ietf.org/html/rfc7757 (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:
 +
<pre>
 +
# jool_siit instance add --netfilter --pool6 64:ff9b::/96
 +
# jool_siit eamt add 192.168.200.0/24 2801:8a:c040:200::
 +
</pre>
 +
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.
 +
<pre>
 +
# jool_siit address query 192.168.200.11
 +
2801:8a:c040:200::b
 +
</pre>
 +
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.
 +
<pre>
 +
# cat /etc/jool_siit.json
 +
{
 +
 +
        "comment": "CLAT Config",
 +
        "instance": "default",
 +
        "framework": "netfilter",
 +
 +
        "global": {
 +
 +
                "pool6": "64:ff9b::/96"
 +
        },
 +
 +
        "eamt": [
 +
                { "ipv6 prefix": "2801:8a:c040:200::", "ipv4 prefix": "192.168.200.0/24" }
 +
        ]
 +
 +
}
 +
</pre>
 +
Para executar o arquivo de configuração JSON use o comando:
 +
<pre>
 +
# jool_siit file handle /etc/jool_siit.json
 +
</pre>
 +
Para facilitar a execução do Jool como serviço do systemd no Linux podemos criar o arquivo jool.service em /usr/lib/systemd/system e adicionar as linhas:
 +
<pre>
 +
[Unit]
 +
Description=Jool Service
 +
ConditionPathExists=/etc/jool_siit.json
 +
After=network.target
 +
 +
[Service]
 +
Type=forking
 +
RemainAfterExit=yes
 +
ExecStartPre=/sbin/modprobe jool_siit
 +
ExecStart=/usr/local/bin/jool_siit file handle /etc/jool_siit.json
 +
ExecStop=/usr/local/bin/jool_siit -f /etc/jool_siit.json instance remove
 +
 +
[Install]
 +
WantedBy=multi-user.target
 +
</pre>
 +
 +
==== 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:
 +
 +
<pre>
 +
# jool instance add --netfilter --pool6 64:ff9b::/96
 +
# jool pool4 add 143.106.230.240
 +
</pre>
 +
Para um melhor ajuste do pool IPv4 e a reservar as portas utilizadas podemos configurar o intervalo que serão adicionados por demanda:
 +
<pre>
 +
# sysctl -w net.ipv4.ip_local_port_range="32768 40000"
 +
 +
# jool pool4 add 143.106.230.240 40001-61000 --tcp
 +
# jool pool4 add 143.106.230.240 40001-61000 --udp
 +
# jool pool4 add 143.106.230.240 40001-61000 --icmp
 +
</pre>
 +
Para que o Jool faça o registro das informações na ''Binding Information Base'' (BIB) para que possamos gerenciar e também realizar o log das sessões de traduções e portas utilizadas, recomenda-se adicionar as seguintes opções:
 +
<pre>
 +
# jool global update logging-bib true
 +
# jool global update logging-session true
 +
</pre>
 +
Exemplo do arquivo JSON para automatizar as configurações de inicialização:
 +
<pre>
 +
# cat /etc/jool.json
 +
{
 +
        "comment": "PLAT Config",
 +
        "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"
 +
                },
 +
        ]
 +
}
 +
</pre>
 +
 +
=== Auditoria ===
 +
 +
O Jool consegue registrar com detalhes no PLAT o registro na BIB (''Mapped)'' e quando uma sessão é criada (''Added''), no arquivo ''messages'' gerado pelo serviço de ''syslog'' do Linux. É recomendado ativar as opções de logging do Jool para o caso de uma análise de incidentes de segurança. Segue abaixo um exemplo do log gerado:
 +
<pre>
 +
[236793.979096] Jool: default 2020/1/30 13:22:38 (GMT) - Added session 2801:8a:c040:200::b#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::b#45399 to 143.106.230.240#43549 (TCP)
 +
</pre>
 +
 +
Onde temos:
 +
<pre>
 +
2801:8a:c040:200::b#45399  --> Endereço IPv6 origem gerado no CLAT/SIIT e porta.
 +
64:ff9b::426e:3120#1443  --> Endereço pool6 para tradução no PLAT/NAT64.
 +
143.106.230.240#43549 --> Endereço IPv4 mascarado de saída no PLAT/NAT64 e porta
 +
66.110.49.32#1443|TCP --> Endereço IPv4 destino, porta e protocolo de transporte.
 +
</pre>
 +
 +
Podemos consultar as informações que estão armazenadas na tabela BIB com relação as conexões TCP utilizando o comando:
 +
<pre>
 +
# jool bib display --tcp --numeric
 +
[Dynamic TCP] 143.106.230.240#52110 - 2801:8a:c040:200::b#47469
 +
[Dynamic TCP] 143.106.230.240#52492 - 2801:8a:c040:200::b#39215
 +
[Dynamic TCP] 143.106.230.240#54461 - 2801:8a:c040:200::b#49340
 +
</pre>
 +
 +
A tabela de sessões estabelecidas e o tempo de expiração podem sem consultadas com o comando:
 +
<pre>
 +
# jool session display --tcp --numeric
 +
---------------------------------
 +
(V4_FIN_RCV) Expires in 0:15:06.168
 +
Remote: 108.174.11.17#443      2801:8a:c040:200::b#38914
 +
Local: 143.106.230.240#59953    64:ff9b::6cae:b11#443
 +
---------------------------------
 +
</pre>
 +
Para melhorar ainda mais o rastreamento do 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:
 +
<pre>
 +
        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-Status-Type = Start
 +
        Acct-Authentic = RADIUS
 +
        User-Name = "user" --> Usuário
 +
        NAS-Identifier = "F0-B0-52-1E-8E-9E"
 +
        Called-Station-Id = "F0-B0-52-1E-8E-9E:FCA6" --> MAC Address do Access Point e SSID
 +
        Calling-Station-Id = "F0-D7-AA-53-82-FC" --> MAC Address do dispositivo
 +
        NAS-IPv6-Address = 2801:8a:c040:fca1::4
 +
</pre>
 +
 +
=== Conclusões ===
 +
 +
Vivemos em um momento que não podemos mais dizer que há ausência de tráfego de pacotes em IPv6 nas redes e deixarmos de lado sua adoçã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 [http://www.nic.br NIC Brasil] no qual tem realizado um belo trabalho no fomento para adoção do IPv6 no Brasil. O [https://www.lacnic.net/ LACNIC] tem promovido além de seus eventos anuais, [https://www.lacnic.net/2465/1/lacnic/webinars Webinars] e [https://campus.lacnic.net/ Cursos] alguns gratuitos sobre o assunto. Porém a procrastinação em IPv6 (palavra difícil que aprendi com o Uesley Corrêa no [https://gtergts.nic.br/evento/gter/48/ 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 (PLAT/NAT64).
 +
* Maior facilidade e rapidez na identificação de um host/usuário no caso de uma auditoria.
 +
* Seus usuários estarão utilizando um protocolo novo [https://tools.ietf.org/html/rfc8200 (RFC 8200)] e experimentando uma navegação mais rápida.
 +
* Possibilidade de atribuir endereços IP a um número maior de equipamentos sem causar uma quebra de conectividade fim-a-fim.
 +
* O ''scanning'' da rede se torna mais complexo.
 +
* Estará menos sujeito a ataques DDoS.
 +
* Você estará contribuindo para o crescimento e desenvolvimento da Internet. ;-)
 +
 +
Espero com esse tutorial, ter auxiliado e incentivado o uso do mecanismo 464XLAT, apresentando a ferramenta Jool como um software simples de configurar na prática. Ainda demonstrar a necessidade de avançarmos na adoção de mecanismos de tradução, rumo a um cenário IPv6-only que espero ser o mais breve possível.
 +
 +
Qualquer dúvida, sugestões, críticas, estou a disposição. [https://www.linkedin.com/in/henri-alves-godoy/ Linkedin]
 +
 +
Autor: [https://wiki.brasilpeeringforum.org/w/Usu%C3%A1rio:Henri.godoy Henri A. Godoy]
 +
 +
=== Referências ===
 +
 +
* [https://www.jool.mx/en/documentation.html Documentação Completa do Jool | NIC.MX]
 +
* [https://www.lacnic.net/innovaportal/file/4756/1/henri-464xlat-lacnic34.pdf 464XLAT en redes inalámbricas utilizando Jool | LACNIC 34/LACNOG 2020]
 +
* [ftp://ftp.registro.br/pub/gter/gter48/12-xlat.pdf Transição para IPv6 com 464XLAT em cenário ISP | GTER48]
 +
* [https://www.lacnic.net/3653/1/lacnic/ Introducción a Jool | Webinar LACNIC]
 +
* [https://www.lacnic.net/3753/1/lacnic/ IPv6 Day | Webinar LACNIC]
 +
* [https://www.lacnic.net/3900/52/evento/#tutorial-ipv6-avanzado Tutoriales IPv6 avanzado | LACNIC 32/LACNOG 2019]
 +
* [https://www.lacnic.net/2467/1/lacnic/ Implementando SIIT/NAT64 usando Jool | Webinar LACNIC]
 +
* [https://www.lacnic.net/innovaportal/file/3207/1/apresentacao-lacnic-henri-v2.pdf Entrega de IPv6-only al usuario final utilizando NAT64 | LACNIC 30/LACNOG 2018]
 +
* [https://youtu.be/ZSMMkYPbX5U Guía para el despliegue de NAT64/464XLAT en redes de operadores y redes empresariales | LACNOG 2019]
 +
* [https://prensa.lacnic.net/news/ipv6/jool-una-herramienta-que-facilita-el-camino-a-ipv6 Jool, una herramienta que facilita el camino a IPv6 | LACNIC News - Abril 2019]
 +
* [http://ipv6.br/pagina/livro-ipv6/ Livro Laboratório de IPv6]
 +
* [https://tools.ietf.org/html/rfc8200 RFC 8200 - Internet Protocol, Version 6 (IPv6) Specification]
 +
* [https://tools.ietf.org/html/rfc8683 RFC 8683 - Additional NAT64/464XLAT Deployment Guidelines in Operator and Enterprise Networks]
 +
* [https://tools.ietf.org/html/rfc8781 RFC 8781 - Discovering PREF64 in Router Advertisements]
 +
* [https://tools.ietf.org/html/rfc8978 RFC 8978 - Reaction of (SLAAC) to Flash-Renumbering Events]
 +
==== Internet-Draft atuais atualizado sobre o assunto ====
 +
 +
* [https://tools.ietf.org/html/draft-ietf-v6ops-transition-comparison-04 Pros and Cons of IPv6 Transition Technologies for IPv4aaS]
 +
* [https://tools.ietf.org/html/draft-ietf-v6ops-ipv6-deployment-10 IPv6 Deployment Status]
 +
* [https://tools.ietf.org/html/draft-palet-v6ops-464xlat-opt-cdn-caches-04 464XLAT Optimization]
 +
* [https://tools.ietf.org/html/draft-palet-v6ops-ipv6-only-05 IPv6-only Terminology Definition]
 +
* [https://tools.ietf.org/html/draft-ietf-6man-mtu-option-15 IPv6 Minimum Path MTU Hop-by-Hop Option]
 +
* [https://tools.ietf.org/html/draft-ietf-6man-ipv6only-flag-05 IPv6 Router Advertisement IPv6-Only Flag]
 +
* [https://datatracker.ietf.org/doc/html/draft-lmhp-v6ops-transition-comparison-06 Pros and Cons of IPv6 Transition Technologies for IPv4aaS]
 +
 +
[[Categoria:Infraestrutura]]
 +
[[Categoria:IPv6]]

Edição atual tal como às 11h17min de 13 de janeiro de 2023

Introdução

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

Com a escassez cada vez mais nos números IP versão 4 (IPv4) e o aumento de dispositivos conectados a 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. Em 2019, a diretoria do LACNIC fez um comunicado à comunidade para favorecer e acelerar a implementação do IPv6 nas redes na região do LACNIC. Na América Latina, em agosto de 2020, foi anunciado a designação do último bloco de IPv4.

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 (IPv4aaS) ?

Inicialmente o estudo começou em uma rede piloto utilizando o mecanismo de traduçã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 Unidade do Campus II - Faculdade de Ciências Aplicadas (FCA), devido a não termos mais IPv4 públicos disponíveis para serem atribuídos na rede. A ideia foi entregar somente endereços IPv6 na rede sem fio para os usuários famintos por conectividade que passam pelo Campus diariamente (~ 3000 pessoas). 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, devido a esses motivos o uso somente de NAT64/DNS64 em um rede deve ser analisado com cuidado.

Para resolver esses problemas foram realizados testes com outro mecanismo de traduçã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 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 então um entendimento hoje de chamarem o CLAT como SIIT.

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 Wi-Fi 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.

Fig 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. O software Jool pode ser encontrado 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.1.8/jool-4.1.8.tar.gz

ou

# 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 o offload nas interfaces de rede:
# ethtool --offload interface lro off 
# ethtool --offload interface gro off
  • Ajustes no kernel para melhorar a performance da 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.1.8/

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.1.8/
# ./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.

# jool_siit address query 192.168.200.11
2801:8a:c040:200::b

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.

# cat /etc/jool_siit.json
{

        "comment": "CLAT 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 use o comando:

# jool_siit file handle /etc/jool_siit.json

Para facilitar a execução do Jool como serviço do systemd no Linux podemos criar o arquivo jool.service em /usr/lib/systemd/system e adicionar as linhas:

[Unit]
Description=Jool Service
ConditionPathExists=/etc/jool_siit.json
After=network.target

[Service]
Type=forking
RemainAfterExit=yes
ExecStartPre=/sbin/modprobe jool_siit
ExecStart=/usr/local/bin/jool_siit file handle /etc/jool_siit.json
ExecStop=/usr/local/bin/jool_siit -f /etc/jool_siit.json instance remove

[Install]
WantedBy=multi-user.target

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:

# jool instance add --netfilter --pool6 64:ff9b::/96
# jool pool4 add 143.106.230.240

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

# sysctl -w net.ipv4.ip_local_port_range="32768 40000"

# jool pool4 add 143.106.230.240 40001-61000 --tcp
# jool pool4 add 143.106.230.240 40001-61000 --udp
# jool pool4 add 143.106.230.240 40001-61000 --icmp

Para que o Jool faça o registro das informações na Binding Information Base (BIB) para que possamos gerenciar e também realizar o log das sessões de traduções e portas utilizadas, recomenda-se adicionar as seguintes opções:

# jool global update logging-bib true
# jool global update logging-session true

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

# cat /etc/jool.json
{
        "comment": "PLAT Config",
        "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 o registro na BIB (Mapped) e quando uma sessão é criada (Added), no arquivo messages gerado pelo serviço de syslog do Linux. É recomendado ativar as opções de 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::b#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::b#45399 to 143.106.230.240#43549 (TCP)

Onde temos:

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

Podemos consultar as informações que estão armazenadas na tabela BIB com relação as conexões TCP utilizando o comando:

# jool bib display --tcp --numeric
[Dynamic TCP] 143.106.230.240#52110 - 2801:8a:c040:200::b#47469
[Dynamic TCP] 143.106.230.240#52492 - 2801:8a:c040:200::b#39215
[Dynamic TCP] 143.106.230.240#54461 - 2801:8a:c040:200::b#49340

A tabela de sessões estabelecidas e o tempo de expiração podem sem consultadas com o comando:

# jool session display --tcp --numeric
---------------------------------
(V4_FIN_RCV) Expires in 0:15:06.168
Remote: 108.174.11.17#443       2801:8a:c040:200::b#38914
Local: 143.106.230.240#59953    64:ff9b::6cae:b11#443
---------------------------------

Para melhorar ainda mais o rastreamento do 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:

        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-Status-Type = Start
        Acct-Authentic = RADIUS
        User-Name = "user" --> Usuário
        NAS-Identifier = "F0-B0-52-1E-8E-9E"
        Called-Station-Id = "F0-B0-52-1E-8E-9E:FCA6" --> MAC Address do Access Point e SSID
        Calling-Station-Id = "F0-D7-AA-53-82-FC" --> MAC Address do dispositivo
        NAS-IPv6-Address = 2801:8a:c040:fca1::4

Conclusões

Vivemos em um momento que não podemos mais dizer que há ausência de tráfego de pacotes em IPv6 nas redes e deixarmos de lado sua adoçã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 (PLAT/NAT64).
  • Maior facilidade e rapidez na identificação de um host/usuário no caso de uma auditoria.
  • Seus usuários estarão utilizando um protocolo novo (RFC 8200) e experimentando uma navegação mais rápida.
  • Possibilidade de atribuir endereços IP a um número maior de equipamentos sem causar uma quebra de conectividade fim-a-fim.
  • O scanning da rede se torna mais complexo.
  • Estará menos sujeito a ataques DDoS.
  • Você estará contribuindo para o crescimento e desenvolvimento da Internet. ;-)

Espero com esse tutorial, ter auxiliado e incentivado o uso do mecanismo 464XLAT, apresentando a ferramenta Jool como um software simples de configurar na prática. Ainda demonstrar a necessidade de avançarmos na adoção de mecanismos de tradução, rumo a um cenário IPv6-only que espero ser o mais breve possível.

Qualquer dúvida, sugestões, críticas, estou a disposição. Linkedin

Autor: Henri A. Godoy

Referências

Internet-Draft atuais atualizado sobre o assunto