464XLAT utilizando a ferramenta Jool

De Wiki BPF
Revisão de 11h06min de 31 de janeiro de 2020 por Henri.godoy (discussão | contribs)
Ir para: navegação, pesquisa

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

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.

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 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 (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 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:

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

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 para IPv6 chamado de Stateless IP/ICMP Translation Algorithm (SIIT) 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 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.

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

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 em redes WiFi e que possa ser instalado nos dispositivos, por exemplo, notebooks e smartphones (Windows, iOS e Android) ou a implementação da funcionalidade CLAT massiva em CPEs, 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.

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ção ou estudos se a ausência do DNS64 causaria grandes problemas de performance durante a navegação na Internet.

Instalação e Configuração do Ambiente

O ambiente no qual será instalado o Jool utiliza como Sistema Operacional o CentOS 7 que pode ser encontrada no repositório da distribuição. Não abordaremos aqui a instalação e configuração do Linux CentOS 7.

A ferramenta Jool pode ser encontrada no site Jool NIC.MX 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

Foram criadas duas máquinas virtuais (VM) com o CentOS 7. Uma VM com a função CLAT, a ser utilizada mais próxima ao cliente final e outra VM chamada de PLAT, a ser localizado mais próximo do Provedor de Internet como já vimos acima.

Não abordaremos aqui as configurações dos IPs 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. Alguns outros ajustes necessários 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 atualizada, 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 sequencia 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 enderecos chamada de Explicit Address Mapping Specification (EAMT) RFC 7757 descreve como diferentes endereços devem ser traduzidos. No Jool todos os registros são bidirecionais e para executarmos devemos informar o pool de endereços IPv6 e IPv4 privado 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 auxilia a entender o mecanismo de 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 para 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 intervalo de portas a serem entregues 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 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 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 algum incidente 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 --> Endereco IPv4 destino, porta e protocolo de transporte.

Somente isso não é suficiente para rastrear o usuário que realizou a conexão. Para complementar a auditoria, todo usuário da rede sem fio passa por um Captive Portal que em conjunto com o radius se autentica em uma base de usuários. Abaixo temos um exemplo 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  --> IPv6 Temporário
        Framed-IPv6-Prefix = 2801:8a:c040:200::/64 --> Prefixo IPv6 
        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 que não existe tráfego de pacotes suficientes em IPv6 para deixarmos de lado sua implementação. A adoção tanto por Provedores de Acesso a Internet e conteúdo quanto Operadoras de Telecom nem que seja utilizando pilha dupla IPv4/IPv6 é 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 que todos os Sistemas Autônomos (AS) participem configurando seus equipamentos de forma correta.

Reforço novamente, 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.BR 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 praticado. 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.

Além do mais, quanto mais endereços IPv6 configurado em dispositivos 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.

Referências

Internet-Draft interessantes atualmente discutidos:

Autor: Henri Godoy