1) Einführung
Was ist Thread?
Thread ist ein IP-basiertes drahtloses Mesh-Netzwerkprotokoll mit geringem Stromverbrauch, das eine sichere Kommunikation zwischen Geräten und Clouds ermöglicht. Thread-Netzwerke können sich an Topologieänderungen anpassen, um Single-Point-Fehler 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, über den Hosts in reinen IPv6-Netzwerken auf Ressourcen in IPv4-Netzwerken zugreifen können. Das NAT64-Gateway ist ein Übersetzer zwischen IPv4-Protokollen und IPv6-Protokollen.
Der NAT64-Übersetzer als Teil des OpenThread-Border-Routers 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 überprüfen Sie die Kommunikation zwischen Thread-Geräten und IPv4-Hosts im Internet über einen OpenThread-Border-Router.
Lerninhalte
- Anleitung zum Erstellen eines OpenThread-Border-Routers mit NAT64-Features
- Mit IPv4-Hosts über Thread-Endgeräte kommunizieren
Voraussetzungen
- Eine Linux-Workstation zum Erstellen und Flashen eines Thread-NCP, der OpenThread-Befehlszeile und zum Testen der IPv4-Konnektivität.
- Ein Raspberry Pi 4 mit 4 GB RAM für den Thread-Border-Router. Ihre Linux-Workstation sollte über dieses Gerät über IPv4 erreichbar sein.
- 2 Nordic Semiconductor nRF52840 DK Boards.
Die Netzwerktopologie für dieses Codelab:
2. OpenThread-Border-Router einrichten
Folgen Sie der Anleitung im Abschnitt OTBR-Schritt des Thread-Border-Routers – Bidirektionale IPv6-Konnektivität und DNS-basiertes Dienst-Discovery-Codelab, um den OpenThread-Border-Router mit der folgenden Änderung zu erstellen:
In Build und Installation von OTBR müssen Sie das Skript anweisen, den NAT64-Übersetzer in OpenThread zu aktivieren. Dazu setzen Sie die Umgebungsvariable NAT64
auf 1
und NAT64_SERVICE
auf openthread
. 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 gebildet 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 unser Border-Router eingerichtet und aktiv ist und NAT64 auf dem 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, dass OTBR als Thread-Leader fungiert und in den Thread-Netzwerkdaten ein NAT64-Präfix vorhanden ist (in diesem Fall fd4c:9574:3720:2:0:0::/96
):
$ 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 verwendet, wenn mit einem IPv4-Host kommuniziert wird.
3. Thread-Endgerät einrichten
Folgen Sie der Anleitung im Abschnitt FTDs des Thread-Netzwerks mit nRF52840-Boards und OpenThread-Codelab einrichten, um ein nRF52840-CLI-Endgerät mit einer Änderung am folgenden Schritt zu erstellen und zu blinken:
In Build und Flash müssen Sie beim Aufrufen von script/build
die Parameter -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_JOINER=ON -DOT_COMMISSIONER=ON -DOT_DNS_CLIENT=ON -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON
Fahren Sie mit dem Thema Thread-Netzwerk mit nRF52840-Boards und OpenThread-Codelab erstellen fort. Nachdem das Endgerät mit dem CLI-Image blinkt, 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 die Verbindung zum Thread-Netzwerk hergestellt wurde. Sie sollten das NAT64-Präfix in den Netzwerkdaten finden (in diesem 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
Die Netzwerkdaten müssen mit denen von OTBR übereinstimmen.
4. Über das Thread-Endgerät 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
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 erfahren, 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: 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.
Nehmen wir an, dass die IP-Adresse Ihres Linux-IPv4-Hosts 192.168.0.2
lautet.
Verwenden Sie auf Ihrem Linux-IPv4-Host nc
, um TCP-Verbindungen zu beobachten:
$ 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: fd4c:9574:3720:2:0:0:c0a8:2 Done > tcp send hello
Ihre Linux-IPv4-Hostausgaben:
hello
Außerdem können Sie Nachrichten von Ihrem Linux-IPv4-Host an das Thread-Endgerät senden. Geben Sie „world“ ein und drücken Sie die Eingabetaste auf Ihrem Linux-IPv4-Host, auf dem nc
ausgeführt wird, sowie die Ausgaben Ihres Thread-Endgeräts:
TCP: Received 6 bytes: world
Über UDP kommunizieren
Die Kommunikation über UDP zwischen Thread-Geräten und Hosts im IPv4-Netzwerk ist möglich.
Nehmen wir an, dass die IP-Adresse Ihres Linux-IPv4-Hosts 192.168.0.2
lautet.
Verwenden Sie nc
, um UDP-Verbindungen zu beobachten:
$ nc -u -l 0.0.0.0 12345
Stellen Sie auf Ihrem 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: fd4c:9574:3720:2:0:0:c0a8:2 Done > udp send hello Done
Ihre Linux-IPv4-Hostausgaben:
hello
Außerdem können Sie Nachrichten von Ihrem Linux-IPv4-Host an das Thread-Endgerät senden. Geben Sie „world“ ein und drücken Sie die Eingabetaste auf Ihrem Linux-IPv4-Host, auf dem nc
ausgeführt wird, sowie die Ausgaben Ihres Thread-Endgeräts:
6 bytes from fd4c:9574:3720:2:0:0:c0a8:2 12345 world
5. NAT64 auf Border Router aktivieren
Sie können NAT64 jederzeit aktivieren oder deaktivieren. Verwenden Sie nat64 disable
, um NAT64 zu deaktivieren. Außerdem können Sie mit nat64 state
den Status von NAT64 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 bewirbt:
$ sudo ot-ctl nat64 enable Done $ sudo ot-ctl nat64 state PrefixManager: Idle Translator: NotWorking Done
Nach einigen Sekunden sollten die NAT64-Komponenten betriebsbereit 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 es nicht running
ist, aktivieren Sie es:
$ sudo ot-ctl srp server enable Done
Prüfen Sie, ob der vorgeschaltete DNS-Proxy aktiviert ist:
$ sudo ot-ctl dns server upstream Enabled Done
Wenn es nicht Enabled
ist, aktivieren Sie es:
$ sudo ot-ctl dns server upstream enable Done
Achten Sie bei Endgeräten darauf, dass der SRP-Client aktiviert ist, damit er DNS-Abfragen an den Border-Router sendet:
> srp client state Enabled Done
Wenn es nicht Enabled
ist, aktivieren Sie es:
> srp client autostart enable Done
Prüfen Sie auf Ihrem Endgerät, ob der Standard-DNS-Server 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 (im Beispiel oben fdd2:0e53:2b87:b93f:50ad:4eea:0450:f1bf
) sollte eine der Adressen Ihres OpenThread-Border-Routers sein.
Jetzt können Sie 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
Sie haben einen Border-Router mit NAT64-Unterstützung eingerichtet und für den Internetzugang zu Thread-Endgeräten verwendet.
Weitere Informationen
- OpenThread-Leitfäden
- Referenz zur OpenThread CLI
- OpenThread API-Referenz für NAT64
- OpenThread API-Referenz für vorgelagertes DNS
- OpenThread-Plattformabstraktion für DNS