Thread-Border-Router – Internetzugang über NAT64 bereitstellen

1. Einführung

7299534792dd9439.png

Was ist Thread?

Thread ist ein IP-basiertes, energieeffizientes drahtloses Mesh-Netzwerkprotokoll, das eine sichere Kommunikation zwischen Geräten und zwischen Geräten und der Cloud ermöglicht. Thread-Netzwerke können sich an Topologieänderungen anpassen, um Single-Point-Ausfälle zu vermeiden.

Was ist OpenThread?

OpenThread von Google ist eine Open-Source-Implementierung von Thread®.

Was ist ein OpenThread-Border-Router?

Der von Google veröffentlichte OpenThread Border Router (OTBR) ist eine Open-Source-Implementierung des Thread-Border-Routers.

NAT64

NAT64 ist ein Mechanismus, mit dem Hosts in reinen IPv6-Netzwerken auf Ressourcen in IPv4-Netzwerken zugreifen können. Das NAT64-Gateway ist ein Übersetzer zwischen IPv4- und IPv6-Protokollen.

Der NAT64-Übersetzer als Teil des OpenThread-Grenzrouters unterstützt die Übersetzung von TCP-, UDP- und ICMP-Protokollen (ICMPv6).

Aufgaben

In diesem Codelab richten Sie einen OpenThread Border Router (OTBR) und ein Thread-Gerät ein. Anschließend aktivieren und prüfen Sie die Kommunikation zwischen Thread-Geräten und IPv4-Hosts im Internet über den OpenThread Border Router.

Lerninhalte

  • Informationen zum Erstellen eines OpenThread-Border-Routers mit NAT64-Funktionen
  • Kommunikation mit IPv4-Hosts von Thread-Endgeräten

Voraussetzungen

  • Eine Linux-Workstation zum Erstellen und Flashen eines Thread-RCP, der OpenThread-Befehlszeile und zum Testen der IPv4-Verbindung.
  • Ein Raspberry Pi für den Thread-Border-Router Ihre Linux-Workstation sollte von diesem Gerät über IPv4 erreichbar sein.
  • 2 USB-Dongles vom Typ Nordic Semiconductor nRF52840 (einer für den RCP und einer für das Thread-Endgerät)

Die Netzwerktopologie für dieses Codelab:

c3cd2e081bc052fd.png

2. OpenThread-Border-Router einrichten

Am schnellsten richten Sie einen OTBR mithilfe der Anleitung zur Einrichtung von OTBRs ein.

Nachdem die OTBR-Einrichtung abgeschlossen ist, prüfen Sie mit ot-ctl, ob der NAT64-Dienst auf dem Border-Router aktiviert ist:

> nat64 state
PrefixManager: Active
Translator: Active
Done

Ein Thread-Border-Router veröffentlicht das NAT64-Präfix in den Thread-Netzwerkdaten:

> 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

Das NAT64-Präfix wird als Routeneintrag mit der n-Flag angezeigt. Im obigen Beispiel ist fd16:a3d:e170:2:0:0::/96 das NAT64-Präfix.

Das NAT64-Präfix wird von Thread-Geräten bei der Kommunikation mit einem IPv4-Host verwendet.

3. Thread-Endgerät einrichten

Folgen Sie dem Schritt zum Einrichten der FTDs im Codelab „Ein Thread-Netzwerk mit nRF52840-Boards und OpenThread erstellen“, um ein nRF52840-CLI-Endgerät zu erstellen und zu flashen. Ändern Sie dabei den folgenden Schritt:

Unter Build and flash (Erstellen und Flashen) müssen Sie beim Aufrufen von script/build -DOT_DNS_CLIENT=ON, -DOT_SRP_CLIENT=ON und -DOT_ECDSA=ON an die Befehlszeile anhängen:

$ cd ~/src/ot-nrf528xx
$ rm -rf build
$ script/build nrf52840 USB_trans -DOT_DNS_CLIENT=ON -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON

Fahren Sie mit dem Codelab zum Erstellen eines Thread-Netzwerks mit nRF52840-Boards und OpenThread fort. Nachdem das Endgerät mit dem CLI-Image geflasht wurde, folgen Sie der Anleitung unter Zweiten Knoten mit dem Thread-Netzwerk verbinden, um das Thread-Gerät dem Thread-Netzwerk hinzuzufügen.

Warten Sie nach der Einrichtung des Thread-Endgeräts einige Sekunden und prüfen Sie, ob die Verbindung zum Thread-Netzwerk hergestellt wurde. Wie oben können Sie das veröffentlichte NAT64-Präfix in den Thread-Netzwerkdaten aufrufen.

> 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

Die Netzwerkdaten müssen mit den Daten aus OTBR übereinstimmen.

4. Mit IPv4-Hosts vom Thread-Endgerät aus kommunizieren

Sie können jetzt über das gerade eingerichtete Endgerät mit Hosts im IPv4-Netzwerk kommunizieren.

ICMP-Echoanfragen an IPv4-Hosts senden

Über die Befehlszeile unseres Thread-Endgeräts:

> 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

Der Border-Router erstellt mit dem Befehl nat64 mappings ein NAT64-Zuordnungselement für dieses Gerät:

> 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 sollte die IPv6-Adresse Ihres Thread-Geräts sein.

Sie können diesen Befehl jederzeit auf dem Border-Router ausführen, um zu sehen, wie der Traffic gezählt wird.

DNS-Abfragen an IPv4-DNS-Server senden

Verwenden Sie dns resolve4, um einen Hostnamen im IPv4-Netzwerk aufzulösen. Die DNS-Serveradresse kann auch eine IPv4-Adresse sein:

> 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

Über TCP kommunizieren

Es ist möglich, TCP-Verbindungen zwischen dem Endgerät und Hosts im IPv4-Netzwerk herzustellen.

Angenommen, die IP-Adresse Ihres Linux-IPv4-Hosts lautet 192.168.0.2.

Verwenden Sie auf Ihrem Linux-IPv4-Host nc, um auf TCP-Verbindungen zu warten:

$ nc -l 0.0.0.0 12345

Stellen Sie über Ihr Thread-Endgerät eine TCP-Verbindung her und senden Sie Nachrichten an Ihren Linux-IPv4-Host:

> 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

Ihr Linux-IPv4-Host gibt Folgendes aus:

hello

Sie können auch Nachrichten von Ihrem Linux-IPv4-Host an ein Thread-Endgerät senden. Geben Sie auf Ihrem Linux-IPv4-Host mit nc „world“ ein und drücken Sie die Eingabetaste. Auf Ihrem Thread-Endgerät wird Folgendes ausgegeben:

TCP: Received 6 bytes: world

Über UDP kommunizieren

Es ist möglich, über UDP zwischen Thread-Geräten und Hosts im IPv4-Netzwerk zu kommunizieren.

Angenommen, die IP-Adresse Ihres Linux-IPv4-Hosts lautet 192.168.0.2.

Mit nc können Sie UDP-Verbindungen überwachen:

$ nc -u -l 0.0.0.0 12345

Stellen Sie über Ihr Thread-Endgerät eine UDP-Verbindung her und senden Sie Nachrichten an Ihren Linux-IPv4-Host:

> 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

Ihr Linux-IPv4-Host gibt Folgendes aus:

hello

Sie können auch Nachrichten von Ihrem Linux-IPv4-Host an ein Thread-Endgerät senden. Geben Sie auf Ihrem Linux-IPv4-Host mit nc „world“ ein und drücken Sie die Eingabetaste. Auf Ihrem Thread-Endgerät wird Folgendes ausgegeben:

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

5. NAT64 auf dem Border-Router aktivieren und deaktivieren

Sie können NAT64 jederzeit aktivieren oder deaktivieren. Verwenden Sie nat64 disable, um NAT64 zu deaktivieren. Mit nat64 state können Sie den Status von NAT64 prüfen.

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

Nach der Deaktivierung veröffentlicht das Gerät kein NAT64-Präfix mehr:

> 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

Außerdem können die Geräte im Thread-Netzwerk nicht mehr über diesen Border-Router auf den IPv4-Host zugreifen.

Über die Befehlszeile unseres Thread-Endgeräts:

> ping 8.8.8.8
Error 13: InvalidState

Verwenden Sie nat64 enable, um NAT64 zu aktivieren. Es kann einige Zeit dauern, bis der Präfixmanager damit beginnt, ein NAT64-Präfix anzubieten:

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

Nach wenigen Sekunden sollten die NAT64-Komponenten einsatzbereit sein:

> 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

Hinweis: Wenn Sie NAT64 deaktivieren, wird die Zuordnungstabelle gelöscht:

> 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. DNS-Abfragen an vorgelagerte DNS-Server weiterleiten

Wenn NAT64 auf dem Border-Router aktiviert ist, versucht OpenThread, die DNS-Abfragen für Internetdomains an vorgelagerte DNS-Server weiterzuleiten.

Achten Sie darauf, dass auf Ihrem Endgerät der Border-Router der Standard-DNS-Server ist:

> 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

Die IPv6-Adresse des Servers (fd4d:b3e5:9738:3193:39c4:ee02:ca9e:2b1d im Beispiel oben) muss eine der Adressen Ihres OpenThread-Border-Routers sein.

Sie können jetzt DNS-Abfragen für Internetdomains vom Endgerät aus senden:

> 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. Glückwunsch

Herzlichen Glückwunsch! Sie haben einen Border-Router mit NAT64-Unterstützung eingerichtet und damit Internetzugriff für Thread-Endgeräte bereitgestellt.

Weitere Informationen

Referenzdokumente