Thread-Border-Router – Internetzugang über NAT64 bereitstellen

1. Einführung

7299534792dd9439.png

Was ist Thread?

Thread ist ein IP-basiertes, energiesparendes drahtloses Mesh-Netzwerkprotokoll, das eine sichere Kommunikation 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, veröffentlicht 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, der es Hosts in Nur-IPv6-Netzwerken ermöglicht, auf Ressourcen in IPv4-Netzwerken zuzugreifen. Das NAT64-Gateway ist ein Übersetzer zwischen IPv4- und IPv6-Protokollen.

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

Aufgaben

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

Lerninhalte

  • Hier erfahren Sie, wie Sie einen OpenThread-Border-Router mit NAT64-Funktionen erstellen.
  • So kommunizieren Sie mit IPv4-Hosts von Thread-Endgeräten.

Voraussetzungen

  • Eine Linux-Workstation zum Erstellen und Flashen eines Thread-NCP, der OpenThread-CLI und Testen der IPv4-Konnektivität.
  • Raspberry Pi 4 mit 4 GB RAM für den Thread-Border-Router Ihre Linux-Workstation sollte von diesem Gerät aus über IPv4 erreichbar sein.
  • 2 nRF52840 DK-Platinen von Nordic Semiconductor

Netzwerktopologie für dieses Codelab:

c3cd2e081bc052fd.png

2. OpenThread-Border-Router einrichten

Führen Sie den Schritt OTBR einrichten des Thread-Border-Routers – Bidirektionale IPv6-Konnektivität und DNS-basierte Diensterkennung aus, um den OpenThread-Border-Router mit der folgenden Änderung zu erstellen:

Unter OTBR erstellen und installieren müssen Sie das Skript anweisen, den NAT64-Übersetzer in OpenThread zu aktivieren, indem Sie die Umgebungsvariable NAT64 auf 1 und NAT64_SERVICE auf openthread setzen. Führen Sie vor dem Schritt den folgenden Befehl aus:

$ export NAT64=1 NAT64_SERVICE=openthread

Fahren Sie mit dem Codelab Thread-Border-Router – Bidirektionale IPv6-Konnektivität und DNS-basierte Diensterkennung fort. Nachdem Sie ein Thread-Netzwerk erstellt haben, können Sie mithilfe der OpenThread-CLI-Befehle prüfen, ob der Border-Router ein NAT64-Präfix veröffentlicht.

Prüfen Sie zuerst, ob Ihr Border-Router einsatzbereit und NAT64 am Border-Router aktiviert ist:

$ sudo ot-ctl state
leader
Done
$ sudo ot-ctl nat64 enable
Done
$ sudo ot-ctl nat64 state
PrefixManager: Active
Translator: Active
Done

Wir sollten sehen können, dass OTBR als Thread-Leader fungiert und in den Thread-Netzwerkdaten ein NAT64-Präfix (in unserem Fall fd4c:9574:3720:2:0:0::/96) vorhanden ist:

$ 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

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 FTDs einrichten unter: Ein Thread-Netzwerk mit nRF52840-Boards und OpenThread-Codelab einrichten, um ein nRF52840-CLI-Endgerät zu erstellen und zu flashen. Der nächste Schritt muss dabei geändert werden:

In Build und Flash müssen Sie -DOT_DNS_CLIENT=ON, -DOT_SRP_CLIENT=ON und -DOT_ECDSA=ON an die Befehlszeile anhängen, wenn Sie script/build aufrufen:

$ 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

Fahren Sie mit dem hier beschriebenen Thread-Netzwerk mit nRF52840-Boards und OpenThread-Codelab erstellen fort. Nachdem das Endgerät mit dem CLI-Image geflasht wurde, folgen Sie der Anleitung unter Thread Border Router – Bidirektionale IPv6-Konnektivität und DNS-basierte Diensterkennung, um das Thread-Endgerät einzurichten.

Warten Sie nach der Einrichtung des Thread-Endgeräts einige Sekunden und prüfen Sie, ob der Beitritt zum Thread-Netzwerk erfolgreich war. Sie sollten ein NAT64-Präfix in den Netzwerkdaten finden können (in unserem Fall fd4c:9574:3720:2:0:0::/96):

> 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

Achten Sie darauf, dass die Netzwerkdaten mit denen aus dem OTBR übereinstimmen.

4. Vom Thread-Endgerät aus mit IPv4-Hosts kommunizieren

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

ICMP-Echo-Anfragen an IPv4-Hosts senden

Über die Befehlszeile unseres Thread-Endgeräts:

> 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

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

$ 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

Die fd4c:9574:3720:1:1d61:b4c1:494f:f975 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 Adresse des DNS-Servers kann auch eine IPv4-Adresse sein:

> 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

Über TCP kommunizieren

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

Die IP-Adresse Ihres Linux-IPv4-Hosts lautet 192.168.0.2.

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

$ nc -l 0.0.0.0 12345

Stellen Sie von Ihrem Thread-Endgerät aus 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: fd4c:9574:3720:2:0:0:c0a8:2
Done
> tcp send hello

Der Linux-IPv4-Host gibt Folgendes aus:

hello

Sie können auch Nachrichten von Ihrem Linux-IPv4-Host an das Thread-Endgerät senden. Geben Sie „Welt“ ein. und die Eingabetaste auf Ihrem Linux-IPv4-Host mit nc drücken. Das Thread-Endgerät gibt Folgendes aus:

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.

Die IP-Adresse Ihres Linux-IPv4-Hosts lautet 192.168.0.2.

Verwenden Sie nc, um UDP-Verbindungen zu überwachen:

$ nc -u -l 0.0.0.0 12345

Stellen Sie von Ihrem Thread-Endgerät aus 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: fd4c:9574:3720:2:0:0:c0a8:2
Done
> udp send hello
Done

Der Linux-IPv4-Host gibt Folgendes aus:

hello

Sie können auch Nachrichten von Ihrem Linux-IPv4-Host an das Thread-Endgerät senden. Geben Sie „Welt“ ein. und die Eingabetaste auf Ihrem Linux-IPv4-Host mit nc drücken. Das Thread-Endgerät gibt Folgendes aus:

6 bytes from fd4c:9574:3720:2:0:0:c0a8:2 12345 world

5. NAT64 am Border-Router aktivieren/deaktivieren

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

$ sudo ot-ctl nat64 disable
Done
$ sudo ot-ctl nat64 state
PrefixManager: Disabled
Translator: Disabled
Done

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

$ 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

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 eine Weile dauern, bis der Präfixmanager ein NAT64-Präfix anbietet:

$ sudo ot-ctl nat64 enable
Done
$ sudo ot-ctl nat64 state
PrefixManager: Idle
Translator: NotWorking
Done

Nach wenigen Sekunden sollten die NAT64-Komponenten einsatzbereit sein:

$ 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

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

$ sudo ot-ctl nat64 mappings
|                  | Address                                                     |        | 4 to 6                  | 6 to 4                  |
+------------------+-------------------------------------------------------------+--------+-------------------------+-------------------------+
| ID               | IPv6                                     | IPv4             | 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.

Diese Funktion wird vom internen DNS-SD-Server unterstützt. Achten Sie daher darauf, dass der DNS-SD-Server aktiviert ist.

$ sudo ot-ctl srp server state
running
Done

Wenn der Wert nicht running ist, aktivieren Sie ihn:

$ sudo ot-ctl srp server enable
Done

Achten Sie darauf, dass der Upstream-DNS-Proxy aktiviert ist:

$ sudo ot-ctl dns server upstream
Enabled
Done

Wenn der Wert nicht Enabled ist, aktivieren Sie ihn:

$ sudo ot-ctl dns server upstream enable
Done

Achten Sie darauf, dass der SRP-Client auf Endgeräten aktiviert ist, damit er DNS-Abfragen an den Border-Router sendet:

> srp client state
Enabled
Done

Wenn der Wert nicht Enabled ist, aktivieren Sie ihn:

> srp client autostart enable
Done

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

> dns config
Server: [fdd2:0e53:2b87:b93f:50ad:4eea:0450:f1bf]:53
ResponseTimeout: 6000 ms
MaxTxAttempts: 3
RecursionDesired: yes
Done

Die IPv6-Serveradresse (fdd2:0e53:2b87:b93f:50ad:4eea:0450:f1bf im Beispiel oben) sollte 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. - 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. Glückwunsch

Herzlichen Glückwunsch! Sie haben erfolgreich einen Border-Router mit NAT64-Unterstützung eingerichtet und für Thread-Endgeräte einen Internetzugang ermöglicht.

Weitere Informationen

Referenzdokumente