464XLAT utilizando a ferramenta Jool

De Wiki BPF
Revisão de 10h54min de 13 de janeiro de 2023 por Henri.godoy (discussão | contribs)
Ir para navegação Ir para pesquisar

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