1. Einführung
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:
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
- OpenThread-Leitfäden
- OpenThread-Befehlszeilenreferenz
- OpenThread API-Referenz für NAT64
- OpenThread API-Referenz für Upstream-DNS
- OpenThread-Plattformabstraktion für DNS