1. Introdução

O que é o Thread?
O Thread é um protocolo de rede mesh sem fio de baixo consumo energético baseado em IP que permite comunicações seguras entre dispositivos e entre dispositivos e a nuvem. As redes Thread podem se adaptar a mudanças na topologia para evitar falhas em um único ponto.
O que é o 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 OpenThread (OTBR, na sigla em inglês) lançado pelo Google é uma implementação de código aberto do roteador de borda 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 tradutor NAT64, como parte do roteador de borda OpenThread, é compatível com a tradução dos protocolos TCP, UDP e ICMP (ICMPv6).
O que você vai criar
Neste codelab, você vai configurar um roteador de borda OpenThread (OTBR) e um dispositivo Thread. Em seguida, vai ativar e verificar a comunicação entre dispositivos Thread e hosts IPv4 na Internet usando o roteador de borda OpenThread.
O que você vai aprender
- Como criar um roteador de borda 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 RCP Thread, a CLI OpenThread e testar a conectividade IPv4.
- Um Raspberry Pi para o roteador de borda do Thread. Sua estação de trabalho Linux precisa estar acessível por IPv4 neste dispositivo.
- 2 dongles USB nRF52840 da Nordic Semiconductor (um para o RCP e um para o dispositivo final da Thread).
A topologia de rede para este codelab:

2. Configurar o roteador de borda OpenThread
A maneira mais rápida de configurar um OTBR é seguindo o Guia de configuração do OTBR.
Depois que a configuração do OTBR for concluída, use ot-ctl para validar se o serviço NAT64 está ativado no roteador de borda:
> nat64 state PrefixManager: Active Translator: Active Done
Um roteador de borda do Thread publica o prefixo NAT64 nos dados da rede Thread:
> netdata show Prefixes: fd16:a3d:e170:1::/64 paros low f800 Routes: ::/0 s med f800 fd16:a3d:e170:2:0:0::/96 sn low f800 Services: 44970 5d fd4db3e59738319339c4ee02ca9e2b1dd120 s f800 0 Contexts: fd16:a3d:e170:1::/64 1 sc Commissioning: 60365 - - - Done
O prefixo NAT64 aparece como uma entrada de rota com a flag n. No exemplo acima, fd16:a3d:e170:2:0:0::/96 é o prefixo NAT64.
O prefixo NAT64 será usado por dispositivos Thread ao se comunicarem 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 OpenThread" para criar e atualizar um dispositivo final da CLI nRF52840, com uma mudança na seguinte etapa:
Em Build and flash, anexe -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_DNS_CLIENT=ON -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON
Continue com o codelab Build a Thread network with nRF52840 boards and OpenThread (em inglês) conforme escrito. Depois que o dispositivo final for atualizado com a imagem da CLI, siga as instruções em Conectar o segundo nó à rede Thread para adicionar o dispositivo Thread à rede Thread.
Aguarde alguns segundos após configurar o dispositivo final do Thread e verifique se a conexão à rede Thread foi bem-sucedida. Como acima, é possível conferir o prefixo NAT64 publicado nos dados da rede Thread.
> netdata show Prefixes: fd16:a3d:e170:1::/64 paros low f800 Routes: ::/0 s med f800 fd16:a3d:e170:2:0:0::/96 sn low f800 Services: 44970 5d fd4db3e59738319339c4ee02ca9e2b1dd120 s f800 0 Contexts: fd16:a3d:e170:1::/64 1 sc Commissioning: 60365 - - - Done
Verifique se os dados da 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 pelo 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: fd16:a3d:e170:2:0:0:808:808 16 bytes from fd16:a3d:e170:2:0:0:808:808: icmp_seq=1 hlim=109 time=28ms 1 packets transmitted, 1 packets received. Packet loss = 0.0%. Round-trip min/avg/max = 28/28.0/28 ms. Done
O roteador de borda cria um item de mapeamento NAT64 para esse dispositivo com o comando nat64 mappings:
> nat64 mappings | | Address | Ports or ICMP Ids | | 4 to 6 | 6 to 4 | +------------------+-------------------------------------------------------------+-------------------+--------+-------------------------+-------------------------+ | ID | IPv6 | IPv4 | v6 | v4 | Expiry | Pkts | Bytes | Pkts | Bytes | +------------------+------------------------------------------+------------------+---------+---------+--------+----------+--------------+----------+--------------+ | 90b156e3cf609a23 | fd16:a3d:e170:1:492d:bcdb:9f72:6297 | 192.168.255.254 | N/A | N/A | 7162s | 1 | 16 | 1 | 16 | | | TCP | 0 | 0 | 0 | 0 | | | UDP | 0 | 0 | 0 | 0 | | | ICMP | 1 | 16 | 1 | 16 | Done
O fd16:a3d:e170:1:492d:bcdb:9f72:6297 precisa ser o endereço IPv6 do seu dispositivo Thread.
Execute esse 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 de 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: fd16:a3d:e170:2:0:0:808:808 DNS response for example.com. - fd16:a3d:e170:2:0:0:17c0:e454 TTL:295 fd16:a3d:e170:2:0:0:17d7:88 TTL:295 fd16:a3d:e170:2:0:0:17d7:8a TTL:295 fd16:a3d:e170:2:0:0:6007:80af TTL:295 fd16:a3d:e170:2:0:0:6007:80c6 TTL:295 fd16:a3d:e170:2:0:0:17c0:e450 TTL:295 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 Linux IPv4 seja 192.168.0.2.
No host Linux IPv4, 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 Linux IPv4:
> tcp init Done > tcp connect 192.168.0.2 12345 Connecting to synthesized IPv6 address: fd16:a3d:e170:2:0:0:c0a8:2 Done > tcp send hello
Saídas do host IPv4 do Linux:
hello
Você também pode enviar mensagens do host IPv4 do Linux para o dispositivo final Thread. Digite "world" e pressione Enter no host IPv4 do Linux que executa nc. O dispositivo final do Thread vai mostrar:
TCP: Received 6 bytes: world
Comunicar-se por UDP
É possível se comunicar usando UDP entre dispositivos Thread e hosts na rede IPv4.
Suponha que o endereço IP do seu host Linux IPv4 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 Linux IPv4:
> udp open Done > udp connect 192.168.0.2 12345 Connecting to synthesized IPv6 address: fd16:a3d:e170:2:0:0:c0a8:2 Done > udp send hello Done
Saídas do host IPv4 do Linux:
hello
Você também pode enviar mensagens do host IPv4 do Linux para o dispositivo final Thread. Digite "world" e pressione Enter no host IPv4 do Linux que executa nc. O dispositivo final do Thread vai mostrar:
6 bytes from fd16:a3d:e170:2:0:0:c0a8:2 12345 world
5. Ativar/desativar o NAT64 no roteador de borda
É possível ativar ou desativar o NAT64 quando quiser. Use nat64 disable para desativar o NAT64. Use nat64 state para verificar o estado do NAT64.
> nat64 disable Done > nat64 state PrefixManager: Disabled Translator: Disabled Done
Depois de desativado, o dispositivo não publica mais um prefixo NAT64:
> netdata show Prefixes: fd16:a3d:e170:1::/64 paros low f800 Routes: ::/0 s med f800 Services: 44970 5d fd4db3e59738319339c4ee02ca9e2b1dd120 s f800 0 Contexts: fd16:a3d:e170:1::/64 1 sc Commissioning: 60365 - - - Done
Além disso, os dispositivos na rede Thread não podem mais acessar o host IPv4 usando 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 prefixos comece a anunciar um prefixo NAT64:
> nat64 enable Done > nat64 state PrefixManager: Idle Translator: NotWorking Done
Depois de alguns segundos, os componentes do NAT64 vão estar funcionando:
> nat64 state PrefixManager: Active Translator: Active Done > netdata show Prefixes: fd16:a3d:e170:1::/64 paros low f800 Routes: ::/0 s med f800 fd16:a3d:e170:2:0:0::/96 sn low f800 Services: 44970 5d fd4db3e59738319339c4ee02ca9e2b1dd120 s f800 0 Contexts: fd16:a3d:e170:1::/64 1 sc Commissioning: 60365 - - - Done
Desativar o NAT64 limpa a tabela de mapeamento:
> nat64 mappings | | Address | Ports or ICMP Ids | | 4 to 6 | 6 to 4 | +------------------+-------------------------------------------------------------+-------------------+--------+-------------------------+-------------------------+ | ID | IPv6 | IPv4 | v6 | v4 | Expiry | Pkts | Bytes | Pkts | Bytes | +------------------+------------------------------------------+------------------+---------+---------+--------+----------+--------------+----------+--------------+ Done
6. Encaminhar consultas DNS para servidores DNS upstream
Quando o NAT64 está ativado no roteador de borda, o OpenThread tenta encaminhar as consultas DNS para domínios da Internet a servidores DNS upstream.
No dispositivo final, verifique se o servidor DNS padrão é o roteador de borda:
> dns config Server: [fd4d:b3e5:9738:3193:39c4:ee02:ca9e:2b1d]:53 ResponseTimeout: 6000 ms MaxTxAttempts: 3 RecursionDesired: yes ServiceMode: srv_txt_opt Nat64Mode: allow Done
O endereço IPv6 do servidor (fd4d:b3e5:9738:3193:39c4:ee02:ca9e:2b1d no exemplo acima) precisa ser um dos endereços do roteador de borda OpenThread.
Agora você pode enviar consultas DNS para domínios da Internet do dispositivo final:
> dns resolve example.com DNS response for example.com. - 2600:1406:3a00:21:0:0:173e:2e65 TTL:161 2600:1406:3a00:21:0:0:173e:2e66 TTL:161 2600:1406:bc00:53:0:0:b81e:94c8 TTL:161 2600:1406:bc00:53:0:0:b81e:94ce TTL:161 2600:1408:ec00:36:0:0:1736:7f24 TTL:161 2600:1408:ec00:36:0:0:1736:7f31 TTL:161 Done > dns resolve4 example.com DNS response for example.com. - fd16:a3d:e170:2:0:0:6007:80af TTL:300 fd16:a3d:e170:2:0:0:6007:80c6 TTL:300 fd16:a3d:e170:2:0:0:17c0:e450 TTL:300 fd16:a3d:e170:2:0:0:17c0:e454 TTL:300 fd16:a3d:e170:2:0:0:17d7:88 TTL:300 fd16:a3d:e170:2:0:0:17d7:8a TTL:300 Done
7. Parabéns
Parabéns! Você configurou um roteador de borda com suporte a NAT64 e o usou para fornecer acesso à Internet a dispositivos finais do Thread.
Leitura adicional
- Guias do OpenThread
- Referência da CLI do OpenThread
- Referência da API OpenThread para NAT64
- Referência da API OpenThread para DNS upstream
- Abstração da plataforma OpenThread para DNS