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 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 de topologia para evitar falhas de ponto único.

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 OpenThread Border Router (OTBR) lançado pelo Google é uma implementação de código aberto do Thread Border Router.

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 do OpenThread, oferece suporte à tradução de protocolos TCP, UDP e ICMP (ICMPv6).

O que você vai criar

Neste codelab, você vai configurar um roteador de borda do OpenThread (OTBR, na sigla em inglês) e um dispositivo Thread. Em seguida, vai ativar e verificar a comunicação entre dispositivos Thread e hosts IPv4 na Internet pelo roteador de borda do OpenThread.

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

O que é necessário

  • Uma estação de trabalho Linux para criar e atualizar um RCP de thread, a CLI do OpenThread e testar a conectividade IPv4.
  • Um Raspberry Pi para o roteador de borda do Thread. Sua estação de trabalho Linux precisa ser acessível por IPv4 a partir desse dispositivo.
  • Dois dongles USB nRF52840 da Nordic Semiconductor (um para o RCP e outro para o dispositivo final da Thread).

A topologia de rede deste codelab:

c3cd2e081bc052fd.png

2. Configurar o roteador de borda do 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 pelos dispositivos Thread ao se comunicar com um host IPv4.

3. Configurar o dispositivo de extremidade da 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 de CLI nRF52840, com uma mudança na etapa a seguir:

Em 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_DNS_CLIENT=ON -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON

Continue com o codelab Criar uma rede Thread com placas nRF52840 e OpenThread 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 à rede Thread.

Aguarde alguns segundos após configurar o dispositivo final do Thread e verifique se a adesão à rede Thread foi bem-sucedida. Como mencionado 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 da Thread

Agora você pode se comunicar com hosts na rede IPv4 usando o dispositivo final que acabamos de configurar.

Enviar solicitações de eco ICMP para hosts IPv4

Na CLI do dispositivo final da linha de execução:

> 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 pelo 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 dispositivo Thread.

Execute esse comando no roteador de borda a qualquer momento para conferir 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 por TCP

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

Suponha que o endereço IP do 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 de destino da 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: fd16:a3d:e170:2:0:0:c0a8:2
Done
> tcp send hello

O host IPv4 do Linux gera:

hello

Também é possível enviar mensagens do host IPv4 do Linux para o dispositivo final da Thread. Digite "world" e pressione Enter no host IPv4 do Linux que executa nc, e as saídas do dispositivo final da Thread:

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 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 da 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: fd16:a3d:e170:2:0:0:c0a8:2
Done
> udp send hello
Done

O host IPv4 do Linux gera:

hello

Também é possível enviar mensagens do host IPv4 do Linux para o dispositivo final da Thread. Digite "world" e pressione Enter no host IPv4 do Linux que executa nc, e as saídas do dispositivo final da Thread:

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 a qualquer momento. Use nat64 disable para desativar o NAT64. E use nat64 state para verificar o estado do NAT64.

> nat64 disable
Done
> nat64 state
PrefixManager: Disabled
Translator: Disabled
Done

Depois da desativação, 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 por meio desse roteador de borda.

Na CLI do dispositivo final da linha de execução:

> 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

Após alguns segundos, os componentes NAT64 estarão em execução:

> 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

A desativação do NAT64 vai limpar 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 de domínios da Internet para 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 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. - 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 aos dispositivos finais do Thread.

Leitura adicional

Documentos de referência