1. Introduzione
Che cos'è Thread?
Thread è un protocollo di rete mesh wireless a basso consumo basato su IP che consente comunicazioni sicure tra dispositivi. Le reti Thread possono adattarsi ai cambiamenti di topologia per evitare errori single-point.
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.
NAT 44
NAT64 è un meccanismo che consente agli host in reti solo IPv6 di accedere alle risorse nelle reti IPv4. Il gateway NAT64 è un traduttore di protocolli IPv4 e protocolli IPv6.
Il traduttore NAT64, come parte di OpenThread Border Router, supporta la traduzione dei protocolli TCP, UDP e ICMP (ICMPv6).
Cosa devi creare
In questo codelab, configurerai un router di confine OpenThread 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 finali Thread.
Che cosa ti serve
- Una workstation Linux, per la creazione e il flashing di un NCP Thread, l'interfaccia a riga di comando OpenThread e il test della connettività IPv4.
- Un Raspberry Pi 4 con 4 GB di RAM per il router di confine Thread. La workstation Linux dovrebbe essere raggiungibile su IPv4 da questo dispositivo.
- 2 schede DK Nordic Semiconductor nRF52840.
La topologia di rete per questo codelab:
2. Configura il router di confine OpenThread
Segui il passaggio OTBR di Configurazione del router di confine Thread - Connettività IPv6 bidirezionale e rilevamento del servizio basato su DNS per creare il router di confine OpenThread, con la seguente modifica:
In Build e installa OTBR, devi comunicare allo script di abilitare il traduttore NAT64 in OpenThread impostando la variabile di ambiente NAT64
su 1
e NAT64_SERVICE
su openthread
. Esegui questo comando prima del passaggio:
$ export NAT64=1 NAT64_SERVICE=openthread
Continua con il codelab su Thread Border Router - Bidirectional IPv6 Connectivity and DNS-Based Service Discovery. Dopo aver creato una rete Thread, puoi verificare che il router di confine stia pubblicando un prefisso NAT64 tramite i comandi dell'interfaccia a riga di comando di OpenThread.
Innanzitutto, assicurati che il router di confine sia attivo e funzionante e che NAT64 sia abilitato sul router di confine:
$ sudo ot-ctl state leader Done $ sudo ot-ctl nat64 enable Done $ sudo ot-ctl nat64 state PrefixManager: Active Translator: Active Done
Dovrebbe essere possibile rilevare che OTBR funge da leader di Thread e che nei dati di rete di Thread è presente il prefisso NAT64 (fd4c:9574:3720:2:0:0::/96
nel nostro caso):
$ sudo ot-ctl netdata show Prefixes: fd4c:9574:3720:1::/64 paos low 0800 Routes: fd49:7770:7fc5:0::/64 s med 0800 fd4c:9574:3720:2:0:0::/96 sn low 0800 Services: 44970 01 41000500000e10 s 0800 44970 5d fdd20e532b87b93f50ad4eea0450f1bfd11f s 0800 Done
Il prefisso NAT64 verrà utilizzato dai dispositivi Thread quando comunicano con un host IPv4.
3. Configura dispositivo finale Thread
Segui il passaggio Configurazione di FTD della rete Build a Thread con schede nRF52840 e codelab OpenThread per creare e flashare un dispositivo di interfaccia a riga di comando nRF52840, con una modifica al passaggio seguente:
In Build e Flash, 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_JOINER=ON -DOT_COMMISSIONER=ON -DOT_DNS_CLIENT=ON -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON
Continua come indicato nella sezione Build a Thread network with nRF52840 boards and OpenThread codelab. Dopo aver fatto lampeggiare il dispositivo finale con l'immagine CLI, configura Thread Border Router - Bidirectional IPv6 Connectivity and DNS-Based Service Discovery per configurare il dispositivo finale Thread.
Attendi qualche secondo dopo aver configurato il dispositivo finale Thread e verifica che l'accesso alla rete Thread sia riuscito. Dovresti essere in grado di trovare un prefisso NAT64 dai dati di rete (fd4c:9574:3720:2:0:0::/96
nel nostro caso):
> netdata show Prefixes: fd4c:9574:3720:1::/64 paos low 0800 Routes: fd49:7770:7fc5:0::/64 s med 0800 fd4c:9574:3720:2:0:0::/96 sn low 0800 Services: 44970 01 41000500000e10 s 0800 44970 5d fdd20e532b87b93f50ad4eea0450f1bfd11f s 0800 Done
Assicurati che i dati di rete corrispondano a quelli di OTBR.
4. Comunica con gli host IPv4 dal dispositivo finale Thread
Ora puoi comunicare con gli host sulla rete IPv4 dal dispositivo finale appena configurato.
Invia richieste echo ICMP agli host IPv4
Dall'interfaccia a riga di comando del nostro dispositivo finale Thread:
> ping 8.8.8.8 Pinging synthesized IPv6 address: fd4c:9574:3720:2:0:0:808:808 16 bytes from fd4c:9574:3720:2:0:0:808:808: icmp_seq=15 hlim=119 time=48ms 1 packets transmitted, 1 packets received. Packet loss = 0.0%. Round-trip min/avg/max = 48/48.0/48 ms. Done
Il router di confine crea un elemento di mappatura NAT64 per questo dispositivo tramite il comando nat64 mappings
:
$ sudo ot-ctl nat64 mappings | | Address | | 4 to 6 | 6 to 4 | +------------------+-------------------------------------------------------------+--------+-------------------------+-------------------------+ | ID | IPv6 | IPv4 | Expiry | Pkts | Bytes | Pkts | Bytes | +------------------+------------------------------------------+------------------+--------+----------+--------------+----------+--------------+ | 377ee63dd3127f1a | fd4c:9574:3720:1:1d61:b4c1:494f:f975 | 192.168.255.254 | 7190s | 1 | 16 | 1 | 16 | | | TCP | 0 | 0 | 0 | 0 | | | UDP | 0 | 0 | 0 | 0 | | | ICMP | 1 | 16 | 1 | 16 | Done
fd4c:9574:3720:1:1d61:b4c1:494f:f975
deve essere l'indirizzo IPv6 del 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ò anche essere un indirizzo IPv4:
> dns resolve4 example.com 8.8.8.8 Synthesized IPv6 DNS server address: fd4c:9574:3720:2:0:0:808:808 DNS response for example.com. - fd4c:9574:3720:2:0:0:5db8:d822 TTL:20456 Done
Comunicare tramite TCP
È possibile stabilire connessioni TCP tra il dispositivo finale e gli host nella rete IPv4.
Supponiamo che l'indirizzo IP del tuo host IPv4 Linux sia 192.168.0.2
.
Sul tuo host IPv4 Linux, utilizza nc
per ascoltare le connessioni TCP:
$ nc -l 0.0.0.0 12345
Dal dispositivo finale 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: fd4c:9574:3720:2:0:0:c0a8:2 Done > tcp send hello
Gli output dell'host IPv4 Linux:
hello
Puoi anche inviare messaggi dall'host IPv4 Linux al dispositivo finale Thread. Digita "world" e premi Invio sull'host IPv4 Linux che esegue nc
. Gli output del tuo dispositivo finale Thread:
TCP: Received 6 bytes: world
Comunicare tramite UDP
È possibile comunicare tramite UDP tra dispositivi Thread e host nella rete IPv4.
Supponiamo che l'indirizzo IP del tuo host IPv4 Linux sia 192.168.0.2
.
Utilizza nc
per ascoltare le connessioni UDP:
$ nc -u -l 0.0.0.0 12345
Dal dispositivo finale Thread, stabilisci una connessione UDP e invia i messaggi al tuo host IPv4 Linux:
> udp open Done > udp connect 192.168.0.2 12345 Connecting to synthesized IPv6 address: fd4c:9574:3720:2:0:0:c0a8:2 Done > udp send hello Done
Gli output dell'host IPv4 Linux:
hello
Puoi anche inviare messaggi dall'host IPv4 Linux al dispositivo finale Thread. Digita "world" e premi Invio sull'host IPv4 Linux che esegue nc
. Gli output del tuo dispositivo finale Thread:
6 bytes from fd4c:9574:3720:2:0:0:c0a8:2 12345 world
5. Attiva/disattiva NAT64 sul router di confine
Puoi abilitare o disabilitare NAT64 in qualsiasi momento. Utilizza nat64 disable
per disattivare NAT64. E usa nat64 state
per controllare lo stato di NAT64.
$ sudo ot-ctl nat64 disable Done $ sudo ot-ctl nat64 state PrefixManager: Disabled Translator: Disabled Done
Dopo la disattivazione, il dispositivo non pubblica più un prefisso NAT64:
$ sudo ot-ctl netdata show Prefixes: fd4c:9574:3720:1::/64 paos low 0800 Routes: fd49:7770:7fc5:0::/64 s med 0800 Services: 44970 01 41000500000e10 s 0800 44970 5d fdd20e532b87b93f50ad4eea0450f1bfd11f s 0800 Done
Inoltre, i dispositivi nella rete Thread non possono più accedere all'host IPv4 tramite questo router di confine.
Dall'interfaccia a riga di comando del nostro dispositivo finale Thread:
> ping 8.8.8.8 Error 13: InvalidState
Utilizza nat64 enable
per abilitare NAT64. Potrebbe essere necessario attendere un po' di tempo prima che il gestore del prefisso inizi a pubblicizzare un prefisso NAT64:
$ sudo ot-ctl nat64 enable Done $ sudo ot-ctl nat64 state PrefixManager: Idle Translator: NotWorking Done
Dopo qualche secondo, i componenti NAT64 dovrebbero essere attivi:
$ sudo ot-ctl nat64 state PrefixManager: Active Translator: Active Done $ sudo ot-ctl netdata show Prefixes: fd4c:9574:3720:1::/64 paos low 0800 Routes: fd49:7770:7fc5:0::/64 s med 0800 fd4c:9574:3720:2:0:0::/96 sn low 0800 Services: 44970 01 41000500000e10 s 0800 44970 5d fdd20e532b87b93f50ad4eea0450f1bfd11f s 0800 Done
Tieni presente che la disattivazione di NAT64 cancellerà la tabella di mappatura:
$ sudo ot-ctl nat64 mappings | | Address | | 4 to 6 | 6 to 4 | +------------------+-------------------------------------------------------------+--------+-------------------------+-------------------------+ | ID | IPv6 | IPv4 | Expiry | Pkts | Bytes | Pkts | Bytes | +------------------+------------------------------------------+------------------+--------+----------+--------------+----------+--------------+ Done
6. Inoltra query DNS ai server DNS a monte
Se NAT64 è abilitato sul router di confine, OpenThread tenterà di inoltrare le query DNS per i domini Internet ai server DNS a monte.
Questa funzione è supportata dal server DNS-SD interno, quindi devi assicurarti che il server DNS-SD sia abilitato.
$ sudo ot-ctl srp server state running Done
Se non è running
, abilitala:
$ sudo ot-ctl srp server enable Done
Assicurati che il proxy DNS a monte sia abilitato:
$ sudo ot-ctl dns server upstream Enabled Done
Se non è Enabled
, abilitala:
$ sudo ot-ctl dns server upstream enable Done
Sui dispositivi finali, assicurati che il client SRP sia abilitato in modo che invii query DNS al router di confine:
> srp client state Enabled Done
Se non è Enabled
, abilitala:
> srp client autostart enable Done
Sul dispositivo finale, assicurati che il server DNS predefinito sia il router di confine:
> dns config Server: [fdd2:0e53:2b87:b93f:50ad:4eea:0450:f1bf]:53 ResponseTimeout: 6000 ms MaxTxAttempts: 3 RecursionDesired: yes Done
L'indirizzo IPv6 del server (fdd2:0e53:2b87:b93f:50ad:4eea:0450:f1bf
nell'esempio sopra) deve essere uno degli indirizzi del router di confine OpenThread.
Ora puoi inviare query DNS per domini Internet dal dispositivo finale:
> dns resolve example.com DNS response for example.com. - 2606:2800:220:1:248:1893:25c8:1946 TTL:8720 Done > dns resolve4 example.com DNS response for example.com. - fd4c:9574:3720:2:0:0:5db8:d822 TTL:20456 Done
7. Congratulazioni
Complimenti, hai configurato correttamente un router di confine con il supporto NAT64 e lo hai utilizzato per fornire l'accesso a Internet ai dispositivi finali Thread.
Per approfondire
- Guide di OpenThread
- Riferimento per l'interfaccia a riga di comando di OpenThread
- Riferimento API OpenThread per NAT64
- Riferimento API OpenThread per DNS upstream
- Astrazione della piattaforma OpenThread per DNS