Thread-Border-Router – Internetzugriff über NAT64 ermöglichen

1) Einführung

7299534792dd9439.png

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:

c3cd2e081bc052fd.png

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

Referenzdokumente