Roteador de borda do Thread: fornece acesso à Internet via NAT64

1. Introdução

7299534792dd9439.png

O que é o Thread?

O Thread é um protocolo de rede mesh sem fio de baixo consumo e baseado em IP que permite comunicações seguras entre dispositivos e entre nuvens. As redes de linha de execução podem se adaptar às alterações de topologia para evitar falhas de ponto único.

O que é OpenThread?

O OpenThread lançado pelo Google é uma implementação de código aberto do Thread®.

O que é um roteador de borda do OpenThread?

O roteador de borda do OpenThread (OTBR, na sigla em inglês) lançado pelo Google é uma implementação de código aberto do roteador de borda do Thread.

NAT64

O NAT64 é um mecanismo que permite que hosts em redes somente IPv6 acessem recursos em redes IPv4. O gateway NAT64 é um tradutor entre protocolos IPv4 e IPv6.

O conversor NAT64, como parte do roteador de borda do OpenThread, oferece suporte à conversão de protocolos TCP, UDP e ICMP (ICMPv6).

O que você vai criar

Neste codelab, você vai configurar um roteador de borda do OpenThread e um dispositivo Thread. Depois, vai ativar e verificar a comunicação entre esses dispositivos e os hosts IPv4 na Internet usando esse roteador.

O que você vai aprender

  • Como criar um roteador de borda do OpenThread com recursos NAT64.
  • Como se comunicar com hosts IPv4 de dispositivos finais Thread.

O que é necessário

  • Uma estação de trabalho Linux, para criar e atualizar um NCP Thread, a CLI OpenThread e testar a conectividade IPv4.
  • Um Raspberry Pi 4 com 4 GB de RAM para o roteador de borda Thread. A estação de trabalho do Linux precisa estar acessível por IPv4 neste dispositivo.
  • 2 placas nórdicas nRF52840 DK.

Topologia de rede para este codelab:

c3cd2e081bc052fd.png

2. Configurar roteador de borda do OpenThread

Siga a etapa Configurar o roteador de borda do Thread: conectividade IPv6 bidirecional e descoberta de serviços baseada em DNS para criar o roteador de borda do OpenThread com a seguinte mudança:

Em Build and install OTBR, você precisa instruir o script a ativar o conversor NAT64 no OpenThread, definindo a variável de ambiente NAT64 como 1 e NAT64_SERVICE como openthread. Execute o seguinte comando antes da etapa:

$ export NAT64=1 NAT64_SERVICE=openthread

Continue com o codelab Roteador de borda do Thread: conectividade IPv6 bidirecional e descoberta de serviços baseada em DNS, conforme escrito. Depois de Formar uma rede Thread, é possível verificar se o roteador de borda está publicando um prefixo NAT64 pelos comandos da CLI do OpenThread.

Primeiro, certifique-se de que nosso roteador de borda esteja funcionando e que o NAT64 esteja ativado:

$ sudo ot-ctl state
leader
Done
$ sudo ot-ctl nat64 enable
Done
$ sudo ot-ctl nat64 state
PrefixManager: Active
Translator: Active
Done

Observe que o OTBR está agindo como um líder de Thread e que há um prefixo NAT64 (fd4c:9574:3720:2:0:0::/96, no nosso caso) nos dados da rede Thread:

$ sudo ot-ctl netdata show
Prefixes:
fd4c:9574:3720:1::/64 paos low 0800
Routes:
fd49:7770:7fc5:0::/64 s med 0800
fd4c:9574:3720:2:0:0::/96 sn low 0800
Services:
44970 01 41000500000e10 s 0800
44970 5d fdd20e532b87b93f50ad4eea0450f1bfd11f s 0800
Done

O prefixo NAT64 será usado por dispositivos Thread ao se comunicar com um host IPv4.

3. Configurar dispositivo final Thread

Siga a etapa Configurar os FTDs do codelab Criar uma rede Thread com placas nRF52840 e o codelab OpenThread para criar e atualizar um dispositivo final da CLI nRF52840, com uma mudança na seguinte etapa:

No Build e flash, é necessário anexar -DOT_DNS_CLIENT=ON, -DOT_SRP_CLIENT=ON e -DOT_ECDSA=ON à linha de comando ao chamar script/build:

$ cd ~/src/ot-nrf528xx
$ rm -rf build
$ script/build nrf52840 USB_trans -DOT_JOINER=ON -DOT_COMMISSIONER=ON -DOT_DNS_CLIENT=ON -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON

Continue com o codelab Criar uma rede Thread com placas nRF52840 e o codelab OpenThread, conforme escrito. Depois que atualizar o dispositivo final com a imagem CLI, siga as instruções em Roteador de borda do Thread - Conectividade IPv6 bidirecional e descoberta de serviço baseada em DNS para configurar o dispositivo final do Thread.

Aguarde alguns segundos após configurar o dispositivo final do Thread e verifique se a entrada na rede Thread foi bem-sucedida. Você deve encontrar um prefixo NAT64 nos dados de rede (neste caso, fd4c:9574:3720:2:0:0::/96):

> netdata show
Prefixes:
fd4c:9574:3720:1::/64 paos low 0800
Routes:
fd49:7770:7fc5:0::/64 s med 0800
fd4c:9574:3720:2:0:0::/96 sn low 0800
Services:
44970 01 41000500000e10 s 0800
44970 5d fdd20e532b87b93f50ad4eea0450f1bfd11f s 0800
Done

Verifique se os dados de rede correspondem aos do OTBR.

4. Comunicar-se com hosts IPv4 do dispositivo final Thread

Agora é possível se comunicar com hosts na rede IPv4 do dispositivo final que acabamos de configurar.

Enviar solicitações de eco ICMP para hosts IPv4

Na CLI do nosso dispositivo final Thread:

> ping 8.8.8.8
Pinging synthesized IPv6 address: fd4c:9574:3720:2:0:0:808:808
16 bytes from fd4c:9574:3720:2:0:0:808:808: icmp_seq=15 hlim=119 time=48ms
1 packets transmitted, 1 packets received. Packet loss = 0.0%. Round-trip min/avg/max = 48/48.0/48 ms.
Done

O roteador de borda cria um item de mapeamento NAT64 para o dispositivo pelo comando nat64 mappings:

$ sudo ot-ctl nat64 mappings
|                  | Address                                                     |        | 4 to 6                  | 6 to 4                  |
+------------------+-------------------------------------------------------------+--------+-------------------------+-------------------------+
| ID               | IPv6                                     | IPv4             | Expiry | Pkts     | Bytes        | Pkts     | Bytes        |
+------------------+------------------------------------------+------------------+--------+----------+--------------+----------+--------------+
| 377ee63dd3127f1a |     fd4c:9574:3720:1:1d61:b4c1:494f:f975 |  192.168.255.254 |  7190s |        1 |           16 |        1 |           16 |
|                  |                                                                  TCP |        0 |            0 |        0 |            0 |
|                  |                                                                  UDP |        0 |            0 |        0 |            0 |
|                  |                                                                 ICMP |        1 |           16 |        1 |           16 |
Done

O fd4c:9574:3720:1:1d61:b4c1:494f:f975 precisa ser o endereço IPv6 do dispositivo Thread.

Execute este comando no roteador de borda a qualquer momento para ver como ele conta o tráfego.

Enviar consultas DNS para servidores DNS IPv4

Use dns resolve4 para resolver um nome do host na rede IPv4. O endereço do servidor DNS também pode ser um endereço IPv4:

> dns resolve4 example.com 8.8.8.8
Synthesized IPv6 DNS server address: fd4c:9574:3720:2:0:0:808:808
DNS response for example.com. - fd4c:9574:3720:2:0:0:5db8:d822 TTL:20456 
Done

Comunicar-se via TCP

É possível estabelecer conexões TCP entre o dispositivo final e os hosts na rede IPv4.

Suponha que o endereço IP do seu host IPv4 do Linux seja 192.168.0.2.

No host IPv4 do Linux, use nc para detectar conexões TCP:

$ nc -l 0.0.0.0 12345

No dispositivo final do Thread, estabeleça uma conexão TCP e envie mensagens para o host IPv4 do Linux:

> tcp init
Done
> tcp connect 192.168.0.2 12345
Connecting to synthesized IPv6 address: fd4c:9574:3720:2:0:0:c0a8:2
Done
> tcp send hello

Seu host IPv4 do Linux gera:

hello

Também é possível enviar mensagens do seu host IPv4 do Linux para o dispositivo final do Thread. Digite "world" Pressione Enter no host IPv4 do Linux executando nc. O dispositivo final Thread vai gerar a seguinte resposta:

TCP: Received 6 bytes: world

Comunicar-se via UDP

É possível usar o UDP para a comunicação entre dispositivos Thread e hosts na rede IPv4.

Suponha que o endereço IP do seu host IPv4 do Linux seja 192.168.0.2.

Use nc para detectar conexões UDP:

$ nc -u -l 0.0.0.0 12345

No dispositivo final do Thread, estabeleça uma conexão UDP e envie mensagens para o host IPv4 do Linux:

> udp open
Done
> udp connect 192.168.0.2 12345
Connecting to synthesized IPv6 address: fd4c:9574:3720:2:0:0:c0a8:2
Done
> udp send hello
Done

Seu host IPv4 do Linux gera:

hello

Também é possível enviar mensagens do seu host IPv4 do Linux para o dispositivo final do Thread. Digite "world" Pressione Enter no host IPv4 do Linux executando nc. O dispositivo final Thread vai gerar a seguinte resposta:

6 bytes from fd4c:9574:3720:2:0:0:c0a8:2 12345 world

5. Ativar NAT64 no roteador de borda

Você pode ativar ou desativar o NAT64 quando quiser. Use nat64 disable para desativar o NAT64. E use nat64 state para verificar o estado do NAT64.

$ sudo ot-ctl nat64 disable
Done
$ sudo ot-ctl nat64 state
PrefixManager: Disabled
Translator: Disabled
Done

Após a desativação, o dispositivo não estará mais publicando um prefixo NAT64:

$ sudo ot-ctl netdata show
Prefixes:
fd4c:9574:3720:1::/64 paos low 0800
Routes:
fd49:7770:7fc5:0::/64 s med 0800
Services:
44970 01 41000500000e10 s 0800
44970 5d fdd20e532b87b93f50ad4eea0450f1bfd11f s 0800
Done

Além disso, os dispositivos na rede Thread não podem mais acessar o host IPv4 por esse roteador de borda.

Na CLI do nosso dispositivo final Thread:

> ping 8.8.8.8
Error 13: InvalidState

Use nat64 enable para ativar o NAT64. Pode levar um tempo até que o gerenciador de prefixo comece a divulgar um prefixo NAT64:

$ sudo ot-ctl nat64 enable
Done
$ sudo ot-ctl nat64 state
PrefixManager: Idle
Translator: NotWorking
Done

Após alguns segundos, os componentes do NAT64 estarão prontos para funcionar:

$ sudo ot-ctl nat64 state
PrefixManager: Active
Translator: Active
Done
$ sudo ot-ctl netdata show
Prefixes:
fd4c:9574:3720:1::/64 paos low 0800
Routes:
fd49:7770:7fc5:0::/64 s med 0800
fd4c:9574:3720:2:0:0::/96 sn low 0800
Services:
44970 01 41000500000e10 s 0800
44970 5d fdd20e532b87b93f50ad4eea0450f1bfd11f s 0800
Done

Observe que desativar o NAT64 limpará a tabela de mapeamento:

$ sudo ot-ctl nat64 mappings
|                  | Address                                                     |        | 4 to 6                  | 6 to 4                  |
+------------------+-------------------------------------------------------------+--------+-------------------------+-------------------------+
| ID               | IPv6                                     | IPv4             | Expiry | Pkts     | Bytes        | Pkts     | Bytes        |
+------------------+------------------------------------------+------------------+--------+----------+--------------+----------+--------------+
Done

6. Encaminhar consultas DNS para servidores DNS upstream

Quando o NAT64 estiver ativado no roteador de borda, o OpenThread tentará encaminhar as consultas DNS para domínios da Internet para servidores DNS upstream.

Essa função é suportada pelo servidor DNS-SD interno, portanto, você precisa verificar se o servidor DNS-SD está ativado.

$ sudo ot-ctl srp server state
running
Done

Se não for running, ative-o:

$ sudo ot-ctl srp server enable
Done

Verifique se o proxy DNS upstream está ativado:

$ sudo ot-ctl dns server upstream
Enabled
Done

Se não for Enabled, ative-o:

$ sudo ot-ctl dns server upstream enable
Done

Em dispositivos finais, verifique se o cliente SRP está ativado para enviar consultas DNS ao roteador de borda:

> srp client state
Enabled
Done

Se não for Enabled, ative-o:

> srp client autostart enable
Done

No dispositivo final, verifique se o servidor DNS padrão é o roteador de borda:

> dns config
Server: [fdd2:0e53:2b87:b93f:50ad:4eea:0450:f1bf]:53
ResponseTimeout: 6000 ms
MaxTxAttempts: 3
RecursionDesired: yes
Done

O endereço IPv6 do servidor (fdd2:0e53:2b87:b93f:50ad:4eea:0450:f1bf no exemplo acima) precisa ser um dos endereços do roteador de borda do OpenThread.

Agora é possível enviar consultas DNS para domínios da Internet do dispositivo final:

> dns resolve example.com
DNS response for example.com. - 2606:2800:220:1:248:1893:25c8:1946 TTL:8720 
Done
> dns resolve4 example.com
DNS response for example.com. - fd4c:9574:3720:2:0:0:5db8:d822 TTL:20456 
Done

7. Parabéns

Parabéns! Você configurou um roteador de borda com suporte a NAT64 e o usou para fornecer acesso à Internet aos dispositivos finais Thread.

Leitura adicional

Documentos de referência