Router di confine Thread: fornisci accesso a internet tramite NAT64

1. Introduzione

7299534792dd9439.png

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 in un unico punto.

Che cos'è OpenThread?

OpenThread rilasciato da Google è un'implementazione open source di Thread®.

Che cos'è un router di confine OpenThread?

OpenThread Border Router (OTBR) rilasciato da Google è un'implementazione open source del router di confine Thread.

NAT64

NAT64 è un meccanismo che consente agli host nelle reti solo IPv6 di accedere alle risorse nelle reti IPv4. Il gateway NAT64 è un traduttore tra i protocolli IPv4 e IPv6.

Il traduttore NAT64, in quanto 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 abiliterai e verificherai la comunicazione tra i dispositivi Thread e gli host IPv4 su internet tramite OpenThread Border Router.

Obiettivi didattici

  • Come creare un router di confine OpenThread con funzionalità NAT64.
  • Come comunicare con gli host IPv4 dai dispositivi di fine rete Thread.

Che cosa ti serve

  • Una workstation Linux per creare e caricare un RCP Thread, la CLI 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 l'RCP e uno per il dispositivo finale Thread).

La topologia di rete per questo codelab:

c3cd2e081bc052fd.png

2. Configurare OpenThread Border Router

Il modo più rapido per configurare un OTBR è seguire la guida alla configurazione OTBR.

Una volta completata la configurazione di 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 finale Thread

Segui il passaggio Configura gli FTD della sezione Crea una rete Thread con schede nRF52840 e codelab OpenThread per creare e caricare un dispositivo finale CLI nRF52840, con una modifica al passaggio successivo:

In Build and flash (Compila 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_DNS_CLIENT=ON -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON

Continua con il codelab Crea una rete Thread con schede nRF52840 e OpenThread come scritto. Dopo aver caricato l'immagine CLI sul dispositivo di destinazione, segui la procedura descritta in Aggiungere il secondo nodo alla rete Thread per aggiungere il dispositivo Thread alla rete Thread.

Attendi qualche secondo dopo aver configurato il dispositivo finale Thread e verifica se l'accesso alla rete Thread è riuscito. Come sopra, puoi visualizzare il prefisso NAT64 pubblicato nei dati di Thread Network.

> 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 di OTBR.

4. Comunicare con gli host IPv4 dal dispositivo finale Thread

Ora puoi comunicare con gli host sulla rete IPv4 dal dispositivo finale che abbiamo appena configurato.

Invia richieste di 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: 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 una voce 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 viene conteggiato il traffico.

Inviare 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: 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 finale e gli host nella rete IPv4.

Supponiamo che l'indirizzo IP dell'host Linux IPv4 sia 192.168.0.2.

Sull'host Linux IPv4, utilizza nc per rilevare le connessioni TCP:

$ nc -l 0.0.0.0 12345

Dal dispositivo finale Thread, stabilisci una connessione TCP e invia messaggi all'host Linux IPv4:

> 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

Output host IPv4 Linux:

hello

Puoi anche inviare messaggi dall'host Linux IPv4 al dispositivo finale Thread. Digita "world" e premi Invio sull'host Linux IPv4 che esegue nc. Il dispositivo finale Thread restituisce:

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 dell'host Linux IPv4 sia 192.168.0.2.

Utilizza nc per rilevare le connessioni UDP:

$ nc -u -l 0.0.0.0 12345

Dal dispositivo finale Thread, stabilisci una connessione UDP e invia messaggi all'host Linux IPv4:

> 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

Output host IPv4 Linux:

hello

Puoi anche inviare messaggi dall'host Linux IPv4 al dispositivo finale Thread. Digita "world" e premi Invio sull'host Linux IPv4 che esegue nc. Il dispositivo finale Thread restituisce:

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 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 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 in esecuzione:

> 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 cancellerà la tabella di mapping:

> 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 upstream

Quando NAT64 è abilitato sul router di confine, OpenThread tenta di inoltrare le query DNS per i domini internet ai server DNS upstream.

Sul dispositivo finale, 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 router di confine OpenThread.

Ora puoi inviare query DNS per i domini internet dal dispositivo finale:

> 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 il supporto NAT64 e lo hai utilizzato per fornire l'accesso a internet ai dispositivi finali Thread.

Per approfondire

Documenti di riferimento