Routeur de bordure Thread : fournir un accès Internet via NAT64

À propos de cet atelier de programmation
schedule23 minutes
subjectDernière mise à jour : 5 mai 2025
account_circleRédigé par Song Guo, Jonathan Hui

1. Introduction

7299534792dd9439.png

Qu'est-ce que Thread ?

Thread est un protocole de réseau maillé sans fil basse consommation basé sur IP qui permet de communiquer de manière sécurisée entre les appareils et le cloud. Les réseaux Thread peuvent s'adapter aux modifications de topologie pour éviter les défaillances ponctuelles.

Qu'est-ce qu'OpenThread ?

OpenThread, publié par Google, est une implémentation Open Source de Thread®.

Qu'est-ce qu'un routeur de bordure OpenThread ?

Le routeur de bordure OpenThread (OTBR) publié par Google est une implémentation Open Source du routeur de bordure Thread.

NAT64

NAT64 est un mécanisme qui permet aux hôtes de réseaux IPv6 uniquement d'accéder aux ressources de réseaux IPv4. La passerelle NAT64 est un traducteur entre les protocoles IPv4 et les protocoles IPv6.

Le traducteur NAT64, qui fait partie du routeur de bord OpenThread, permet de traduire les protocoles TCP, UDP et ICMP (ICMPv6).

Ce que vous allez faire

Dans cet atelier de programmation, vous allez configurer un routeur de bordure OpenThread (OTBR) et un appareil Thread, puis activer et vérifier la communication entre les appareils Thread et les hôtes IPv4 sur Internet via le routeur de bordure OpenThread.

Points abordés

  • Créer un routeur de bordure OpenThread avec des fonctionnalités NAT64
  • Comment communiquer avec des hôtes IPv4 à partir d'appareils finaux Thread

Prérequis

  • Un poste de travail Linux, pour créer et flasher un RCP Thread, la CLI OpenThread et tester la connectivité IPv4.
  • Un Raspberry Pi pour le routeur de bordure Thread Votre poste de travail Linux doit être accessible via IPv4 depuis cet appareil.
  • Deux dongles USB nRF52840 Nordic Semiconductor (un pour le RCP et un pour l'appareil final Thread).

Topologie de réseau pour cet atelier de programmation:

c3cd2e081bc052fd.png

2. Configurer le routeur de bordure OpenThread

Le moyen le plus rapide de configurer un OTBR est de suivre le guide de configuration de l'OTBR.

Une fois la configuration de l'OTBR terminée, utilisez ot-ctl pour vérifier que le service NAT64 est activé sur le routeur de bordure:

> nat64 state
PrefixManager: Active
Translator: Active
Done

Un routeur de bordure Thread publie le préfixe NAT64 dans les données réseau 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

Le préfixe NAT64 s'affiche sous la forme d'une entrée de routage avec l'indicateur n. Dans l'exemple ci-dessus, fd16:a3d:e170:2:0:0::/96 correspond au préfixe NAT64.

Le préfixe NAT64 sera utilisé par les appareils Thread lorsqu'ils communiqueront avec un hôte IPv4.

3. Configurer l'appareil final Thread

Suivez l'étape Configurer les FTD de l'atelier de programmation "Créer un réseau Thread avec des cartes nRF52840 et OpenThread" pour créer et flasher un appareil final nRF52840 avec la CLI, en modifiant l'étape suivante:

Dans Build and flash (Compilation et flash), vous devez ajouter -DOT_DNS_CLIENT=ON, -DOT_SRP_CLIENT=ON et -DOT_ECDSA=ON à la ligne de commande lorsque vous appelez 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

Suivez l'atelier de programmation Créer un réseau Thread avec des cartes nRF52840 et OpenThread comme indiqué. Une fois l'image de la CLI flashée sur l'appareil final, suivez la procédure Joindre le deuxième nœud au réseau Thread pour ajouter l'appareil Thread au réseau Thread.

Attendez quelques secondes après avoir configuré l'appareil final Thread et vérifiez si l'appareil a bien rejoint le réseau Thread. Comme ci-dessus, vous pouvez afficher le préfixe NAT64 publié dans les données réseau 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

Assurez-vous que les données réseau correspondent à celles de l'OTBR.

4. Communiquer avec des hôtes IPv4 à partir de l'appareil final Thread

Vous pouvez désormais communiquer avec les hôtes du réseau IPv4 à partir de l'appareil final que nous venons de configurer.

Envoyer des requêtes d'écho ICMP aux hôtes IPv4

Depuis la CLI de notre appareil 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

Le routeur de bordure crée un élément de mappage NAT64 pour cet appareil à l'aide de la commande 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 doit être l'adresse IPv6 de votre appareil Thread.

Exécutez cette commande sur le routeur de bordure à tout moment pour voir comment il comptabilise le trafic.

Envoyer des requêtes DNS aux serveurs DNS IPv4

Utilisez dns resolve4 pour résoudre un nom d'hôte sur le réseau IPv4. L'adresse du serveur DNS peut également être une adresse 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

Communiquer via TCP

Il est possible d'établir des connexions TCP entre l'appareil final et les hôtes du réseau IPv4.

Supposons que l'adresse IP de votre hôte IPv4 Linux soit 192.168.0.2.

Sur votre hôte IPv4 Linux, utilisez nc pour écouter les connexions TCP:

$ nc -l 0.0.0.0 12345

Depuis votre appareil final Thread, établissez une connexion TCP et envoyez des messages à votre hôte IPv4 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

Votre hôte IPv4 Linux génère les sorties suivantes:

hello

Vous pouvez également envoyer des messages depuis votre hôte IPv4 Linux vers l'appareil final Thread. Saisissez "world" (monde) et appuyez sur Entrée sur votre hôte IPv4 Linux exécutant nc. Votre appareil final Thread génère les sorties suivantes:

TCP: Received 6 bytes: world

Communiquer via UDP

Il est possible de communiquer à l'aide d'UDP entre les appareils Thread et les hôtes du réseau IPv4.

Supposons que l'adresse IP de votre hôte IPv4 Linux soit 192.168.0.2.

Utilisez nc pour écouter les connexions UDP:

$ nc -u -l 0.0.0.0 12345

À partir de votre appareil final Thread, établissez une connexion UDP et envoyez des messages à votre hôte IPv4 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

Votre hôte IPv4 Linux génère les sorties suivantes:

hello

Vous pouvez également envoyer des messages depuis votre hôte IPv4 Linux vers l'appareil final Thread. Saisissez "world" (monde) et appuyez sur Entrée sur votre hôte IPv4 Linux exécutant nc. Votre appareil final Thread génère les sorties suivantes:

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

5. Activer/Désactiver NAT64 sur le routeur de bordure

Vous pouvez activer ou désactiver NAT64 à tout moment. Utilisez nat64 disable pour désactiver NAT64. Utilisez nat64 state pour vérifier l'état de NAT64.

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

Une fois la désactivation effectuée, l'appareil ne publie plus de préfixe 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

De plus, les appareils du réseau Thread ne peuvent plus accéder à l'hôte IPv4 via ce routeur de bordure.

Depuis la CLI de notre appareil final Thread:

> ping 8.8.8.8
Error 13: InvalidState

Utilisez nat64 enable pour activer NAT64. Il peut s'écouler un certain temps avant que le gestionnaire de préfixes ne commence à annoncer un préfixe NAT64:

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

Au bout de quelques secondes, les composants NAT64 devraient être opérationnels:

> 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

Notez que la désactivation de NAT64 vide la table de mappage:

> 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. Transférer les requêtes DNS vers les serveurs DNS en amont

Lorsque NAT64 est activé sur le routeur de bordure, OpenThread tente de transférer les requêtes DNS pour les domaines Internet vers les serveurs DNS en amont.

Sur votre appareil final, assurez-vous que le serveur DNS par défaut est le routeur de bordure:

> 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

L'adresse IPv6 du serveur (fd4d:b3e5:9738:3193:39c4:ee02:ca9e:2b1d dans l'exemple ci-dessus) doit être l'une des adresses de votre routeur de bordure OpenThread.

Vous pouvez désormais envoyer des requêtes DNS pour les domaines Internet depuis l'appareil 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. Félicitations

Félicitations, vous avez réussi à configurer un routeur de bordure compatible avec NAT64 et à l'utiliser pour fournir un accès Internet aux appareils finaux Thread.

Documentation complémentaire

Documents de référence