Router de borde Thread: Proporciona acceso a Internet a través de NAT64

Acerca de este codelab
schedule23 minutos
subjectÚltima actualización: 5 de mayo de 2025
account_circleEscrito por Song Guo, Jonathan Hui

1. Introducción

7299534792dd9439.png

¿Qué es Thread?

Thread es un protocolo de red en malla inalámbrica de bajo consumo basado en IP que permite comunicaciones seguras entre dispositivos y entre dispositivos y la nube. Las redes Thread pueden adaptarse a los cambios de topología para evitar fallas de un solo punto.

¿Qué es OpenThread?

OpenThread, lanzado por Google, es una implementación de código abierto de Thread®.

¿Qué es un router de borde OpenThread?

El router de borde OpenThread (OTBR) que lanzó Google es una implementación de código abierto del router de borde Thread.

NAT64

NAT64 es un mecanismo que permite que los hosts en redes solo IPv6 accedan a recursos en redes IPv4. La puerta de enlace NAT64 es un traductor entre los protocolos IPv4 y los protocolos IPv6.

El traductor NAT64, como parte del router de borde OpenThread, admite la traducción de protocolos TCP, UDP e ICMP (ICMPv6).

Qué compilarás

En este codelab, configurarás un router de borde OpenThread (OTBR) y un dispositivo Thread. Luego, habilitarás y verificarás la comunicación entre los dispositivos Thread y los hosts IPv4 en Internet a través del router de borde OpenThread.

Qué aprenderás

  • Cómo compilar un router de borde OpenThread con funciones de NAT64
  • Cómo comunicarse con hosts IPv4 desde dispositivos finales Thread

Requisitos

  • Una estación de trabajo de Linux para compilar y escribir en la memoria flash un RCP de Thread, la CLI de OpenThread y probar la conectividad IPv4
  • Una Raspberry Pi para el router de borde Thread Tu estación de trabajo de Linux debería ser accesible a través de IPv4 desde este dispositivo.
  • 2 llaves USB nRF52840 de Nordic Semiconductor (una para el RCP y otra para el dispositivo final de Thread)

Esta es la topología de red de este codelab:

c3cd2e081bc052fd.png

2. Cómo configurar el router de borde OpenThread

La forma más rápida de configurar un OTBR es siguiendo la Guía de configuración de OTBR.

Una vez que se complete la configuración del OTBR, usa ot-ctl para validar que el servicio NAT64 esté habilitado en el router de borde:

> nat64 state
PrefixManager: Active
Translator: Active
Done

Un router de borde Thread publica el prefijo NAT64 en los datos de red de 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

El prefijo NAT64 aparece como una entrada de ruta con la marca n. En el ejemplo anterior, fd16:a3d:e170:2:0:0::/96 es el prefijo NAT64.

Los dispositivos Thread usarán el prefijo NAT64 cuando se comuniquen con un host IPv4.

3. Cómo configurar el dispositivo final de Thread

Sigue el paso Configura los FTDs del codelab Construye una red Thread con placas nRF52840 y OpenThread para compilar y escribir en la memoria flash un dispositivo final de la CLI nRF52840, con un cambio en el siguiente paso:

En Build and flash, debes agregar -DOT_DNS_CLIENT=ON, -DOT_SRP_CLIENT=ON y -DOT_ECDSA=ON a la línea de comandos cuando llames a 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

Continúa con el codelab Cómo compilar una red Thread con placas nRF52840 y OpenThread como está escrito. Después de que se actualice el dispositivo final con la imagen de CLI, sigue las instrucciones de Cómo unir el segundo nodo a la red Thread para agregar el dispositivo Thread a la red Thread.

Espera unos segundos después de configurar el dispositivo final Thread y verifica si se unió correctamente a la red Thread. Como se indicó anteriormente, puedes ver el prefijo NAT64 publicado en los datos de la red de 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

Asegúrate de que los datos de red coincidan con los de OTBR.

4. Cómo comunicarse con hosts IPv4 desde el dispositivo final de Thread

Ahora puedes comunicarte con los hosts de la red IPv4 desde el dispositivo final que acabamos de configurar.

Envía solicitudes de eco de ICMP a hosts IPv4

Desde la CLI de nuestro 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

El router de borde crea un elemento de asignación de NAT64 para este dispositivo con el 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

fd16:a3d:e170:1:492d:bcdb:9f72:6297 debe ser la dirección IPv6 de tu dispositivo Thread.

Ejecuta este comando en el router de borde en cualquier momento para ver cómo cuenta el tráfico.

Envía consultas de DNS a servidores DNS IPv4

Usa dns resolve4 para resolver un nombre de host en la red IPv4. La dirección del servidor DNS también puede ser una dirección 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

Comunicarse a través de TCP

Es posible establecer conexiones TCP entre el dispositivo final y los hosts en la red IPv4.

Supongamos que la dirección IP de tu host IPv4 de Linux es 192.168.0.2.

En tu host IPv4 de Linux, usa nc para escuchar las conexiones TCP:

$ nc -l 0.0.0.0 12345

Desde tu dispositivo final Thread, establece una conexión TCP y envía mensajes a tu host IPv4 de 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

Tu host IPv4 de Linux muestra los siguientes resultados:

hello

También puedes enviar mensajes desde tu host IPv4 de Linux al dispositivo final de Thread. Escribe "world" y presiona Intro en tu host IPv4 de Linux que ejecuta nc, y el dispositivo final de Thread muestra lo siguiente:

TCP: Received 6 bytes: world

Cómo comunicarse a través de UDP

Es posible comunicarse con UDP entre dispositivos y hosts Thread en la red IPv4.

Supongamos que la dirección IP de tu host IPv4 de Linux es 192.168.0.2.

Usa nc para escuchar conexiones UDP:

$ nc -u -l 0.0.0.0 12345

Desde tu dispositivo final Thread, establece una conexión UDP y envía mensajes a tu host IPv4 de 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

Tu host IPv4 de Linux muestra los siguientes resultados:

hello

También puedes enviar mensajes desde tu host IPv4 de Linux al dispositivo final de Thread. Escribe "world" y presiona Intro en tu host IPv4 de Linux que ejecuta nc, y el dispositivo final de Thread muestra lo siguiente:

6 bytes from fd16:a3d:e170:2:0:0:c0a8:2 12345 world

5. Activa o desactiva NAT64 en el router de borde

Puedes habilitar o inhabilitar NAT64 en cualquier momento. Usa nat64 disable para inhabilitar NAT64. Además, usa nat64 state para verificar el estado de NAT64.

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

Después de inhabilitar la función, el dispositivo ya no publica un prefijo 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

Además, los dispositivos de la red Thread ya no pueden acceder al host IPv4 a través de este router de borde.

Desde la CLI de nuestro dispositivo final Thread:

> ping 8.8.8.8
Error 13: InvalidState

Usa nat64 enable para habilitar NAT64. Es posible que el administrador de prefijos tarde un tiempo en comenzar a anunciar un prefijo NAT64:

> nat64 enable
Done
> nat64 state
PrefixManager: Idle
Translator: NotWorking
Done

Después de unos segundos, los componentes de NAT64 deberían estar en funcionamiento:

> 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

Ten en cuenta que, si inhabilitas NAT64, se borrará la tabla de asignación:

> 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. Reenvía consultas de DNS a servidores DNS ascendentes

Cuando NAT64 esté habilitado en el router de borde, OpenThread intentará reenviar las consultas de DNS de los dominios de Internet a los servidores DNS upstream.

En tu dispositivo final, asegúrate de que el servidor DNS predeterminado sea el router de borde:

> 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

La dirección IPv6 del servidor (fd4d:b3e5:9738:3193:39c4:ee02:ca9e:2b1d en el ejemplo anterior) debe ser una de las direcciones de tu router de borde OpenThread.

Ahora puedes enviar consultas de DNS para dominios de Internet desde el 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. Felicitaciones

¡Felicitaciones! Configuraste correctamente un router de borde con compatibilidad con NAT64 y lo usaste para proporcionar acceso a Internet a los dispositivos finales de Thread.

Lecturas adicionales

Documentos de referencia