1. Einführung
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:
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
- OpenThread-Anleitungen
- Referenz zur OpenThread-Befehlszeile
- OpenThread API-Referenz für NAT64
- OpenThread API-Referenz für Upstream-DNS
- OpenThread-Plattformabstraktion für DNS