1. Introduzione
Che cos'è Thread?
Thread è un protocollo di rete mesh wireless a basso consumo basato su IP che consente comunicazioni sicure tra dispositivi e tra dispositivi e cloud. Le reti Thread possono adattarsi alle modifiche della topologia per evitare errori singoli.
Che cos'è OpenThread?
OpenThread rilasciato da Google è un'implementazione open source di Thread®.
Che cos'è un router di confine OpenThread?
Il router di confine OpenThread (OTBR) rilasciato da Google è un'implementazione open source del router di confine Thread.
NAT64
NAT64 è un meccanismo che consente agli host in reti solo IPv6 di accedere alle risorse in reti IPv4. Il gateway NAT64 è un traduttore tra i protocolli IPv4 e IPv6.
Il traduttore NAT64, che fa parte di OpenThread Border Router, supporta la traduzione dei protocolli TCP, UDP e ICMP (ICMPv6).
Cosa creerai
In questo codelab, configurerai un router di confine OpenThread (OTBR) e un dispositivo Thread, quindi attiverai e verificherai la comunicazione tra i dispositivi Thread e gli host IPv4 su internet tramite il router di confine OpenThread.
Obiettivi didattici
- Come creare un router di confine OpenThread con funzionalità NAT64.
- Come comunicare con gli host IPv4 dai dispositivi Thread di destinazione.
Che cosa ti serve
- Una workstation Linux per compilare e eseguire il flashing di un RCP Thread, l'interfaccia a riga di comando OpenThread e testare la connettività IPv4.
- Un Raspberry Pi per il router di confine Thread. La tua workstation Linux deve essere raggiungibile tramite IPv4 da questo dispositivo.
- 2 dongle USB Nordic Semiconductor nRF52840 (uno per il telecomando e uno per il dispositivo di destinazione Thread).
La topologia di rete per questo codelab:
2. Configurare il router di confine OpenThread
Il modo più rapido per configurare un OTBR è seguire la guida alla configurazione degli OTBR.
Al termine della configurazione dell'OTBR, utilizza ot-ctl
per verificare che il servizio NAT64 sia abilitato sul router di confine:
> nat64 state PrefixManager: Active Translator: Active Done
Un router di confine Thread pubblica il prefisso NAT64 nei dati di rete 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
Il prefisso NAT64 viene visualizzato come voce di route con il flag n
. Nell'esempio precedente, fd16:a3d:e170:2:0:0::/96
è il prefisso NAT64.
Il prefisso NAT64 verrà utilizzato dai dispositivi Thread quando comunicano con un host IPv4.
3. Configurare il dispositivo di destinazione Thread
Segui il passaggio Configura i FTD del codelab Crea una rete Thread con schede nRF52840 e OpenThread per compilare e eseguire il flashing di un dispositivo finale CLI nRF52840, apportando una modifica al seguente passaggio:
In Compilazione e aggiornamento, devi aggiungere -DOT_DNS_CLIENT=ON
, -DOT_SRP_CLIENT=ON
e -DOT_ECDSA=ON
alla riga di comando quando chiami 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
Procedi con il codelab Crea una rete Thread con schede nRF52840 e OpenThread come descritto. Dopo aver eseguito il flashing del dispositivo di destinazione con l'immagine CLI, segui la sezione Aggiungere il secondo nodo alla rete Thread per aggiungere il dispositivo Thread alla rete Thread.
Attendi qualche secondo dopo aver configurato il dispositivo di destinazione Thread e verifica se la connessione alla rete Thread è andata a buon fine. Come sopra, puoi visualizzare il prefisso NAT64 pubblicato nei dati di rete 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
Assicurati che i dati di rete corrispondano a quelli dell'OTBR.
4. Comunicare con gli host IPv4 dal dispositivo di destinazione Thread
Ora puoi comunicare con gli host sulla rete IPv4 dal dispositivo di destinazione che abbiamo appena configurato.
Invia richieste ICMP echo agli host IPv4
Dall'interfaccia a riga di comando del nostro dispositivo di destinazione 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
Il router di confine crea un elemento di mappatura NAT64 per questo dispositivo tramite il 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
deve essere l'indirizzo IPv6 del tuo dispositivo Thread.
Esegui questo comando sul router di confine in qualsiasi momento per vedere come conteggia il traffico.
Invia query DNS ai server DNS IPv4
Utilizza dns resolve4
per risolvere un nome host sulla rete IPv4. L'indirizzo del server DNS può essere anche un indirizzo 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
Comunicare tramite TCP
È possibile stabilire connessioni TCP tra il dispositivo di destinazione e gli host nella rete IPv4.
Supponiamo che l'indirizzo IP del tuo host Linux IPv4 sia 192.168.0.2
.
Nell'host IPv4 Linux, utilizza nc
per ascoltare le connessioni TCP:
$ nc -l 0.0.0.0 12345
Dal tuo dispositivo di endpoint Thread, stabilisci una connessione TCP e invia messaggi all'host 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
L'host IPv4 Linux emette:
hello
Puoi anche inviare messaggi dal tuo host IPv4 Linux al dispositivo di destinazione Thread. Digita "world" e premi Invio sull'host IPv4 Linux con nc
e il tuo dispositivo di endpoint Thread emette:
TCP: Received 6 bytes: world
Comunicare tramite UDP
È possibile comunicare utilizzando UDP tra i dispositivi Thread e gli host nella rete IPv4.
Supponiamo che l'indirizzo IP del tuo host Linux IPv4 sia 192.168.0.2
.
Utilizza nc
per ascoltare le connessioni UDP:
$ nc -u -l 0.0.0.0 12345
Dal tuo dispositivo di endpoint Thread, stabilisci una connessione UDP e invia messaggi all'host 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
L'host IPv4 Linux emette:
hello
Puoi anche inviare messaggi dal tuo host IPv4 Linux al dispositivo di destinazione Thread. Digita "world" e premi Invio sull'host IPv4 Linux con nc
e il tuo dispositivo di endpoint Thread emette:
6 bytes from fd16:a3d:e170:2:0:0:c0a8:2 12345 world
5. Attiva/disattiva NAT64 sul router di confine
Puoi attivare o disattivare NAT64 in qualsiasi momento. Utilizza nat64 disable
per disattivare NAT64. E utilizza nat64 state
per controllare lo stato di NAT64.
> nat64 disable Done > nat64 state PrefixManager: Disabled Translator: Disabled Done
Dopo la disattivazione, il dispositivo non pubblica più un prefisso 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
Inoltre, i dispositivi della rete Thread non possono più accedere all'host IPv4 tramite questo router di confine.
Dall'interfaccia a riga di comando del nostro dispositivo di destinazione Thread:
> ping 8.8.8.8 Error 13: InvalidState
Usa nat64 enable
per attivare NAT64. Potrebbe essere necessario un po' di tempo prima che il gestore dei prefissi inizi a pubblicizzare un prefisso NAT64:
> nat64 enable Done > nat64 state PrefixManager: Idle Translator: NotWorking Done
Dopo alcuni secondi, i componenti NAT64 dovrebbero essere attivi e funzionanti:
> 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
Tieni presente che la disattivazione di NAT64 comporta l'eliminazione della tabella di mappatura:
> 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. Inoltra le query DNS ai server DNS a monte
Quando NAT64 è abilitato sul router di confine, OpenThread tenterà di inoltrare le query DNS per i domini internet ai server DNS a monte.
Sul dispositivo di destinazione, assicurati che il server DNS predefinito sia il router di confine:
> 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'indirizzo IPv6 del server (fd4d:b3e5:9738:3193:39c4:ee02:ca9e:2b1d
nell'esempio precedente) deve essere uno degli indirizzi del tuo router di confine OpenThread.
Ora puoi inviare query DNS per i domini internet dal dispositivo di destinazione:
> 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. Complimenti
Congratulazioni, hai configurato correttamente un router di confine con supporto NAT64 e lo hai utilizzato per fornire l'accesso a internet ai dispositivi di endpoint Thread.
Per approfondire
- Guide OpenThread
- Riferimento all'interfaccia a riga di comando OpenThread
- Riferimento all'API OpenThread per NAT64
- Riferimento all'API OpenThread per il DNS a monte
- Astrazione della piattaforma OpenThread per il DNS