Thread-Border-Router – Internetzugang über NAT64 bereitstellen

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 zwischen Geräten und der Cloud ermöglicht. Thread-Netzwerke können sich an Änderungen der Topologie anpassen, um Single Points of Failure 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 Nur-IPv6-Netzwerken auf Ressourcen in IPv4-Netzwerken zugreifen können. Das NAT64-Gateway übersetzt zwischen IPv4- 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 (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

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

Voraussetzungen

  • Eine Linux-Workstation zum Erstellen und Flashen eines Thread-RCP, der OpenThread-Befehlszeile und zum Testen der IPv4-Konnektivität.
  • Ein Raspberry Pi für den Thread-Border-Router. Ihre Linux-Workstation sollte über IPv4 von diesem Gerät aus 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:

c3cd2e081bc052fd.png

2. OpenThread-Border-Router einrichten

Am schnellsten lässt sich ein OTBR einrichten, wenn Sie der Anleitung für die Einrichtung von OTBR folgen.

Nachdem die OTBR-Einrichtung abgeschlossen ist, können Sie mit ot-ctl prüfen, 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 dem Flag n 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 verwendet, wenn sie mit einem IPv4-Host kommunizieren.

3. Thread-Endgerät einrichten

Folgen Sie dem FTDs einrichten-Schritt des Codelabs Thread-Netzwerk mit nRF52840-Boards und OpenThread erstellen, um ein nRF52840-CLI-Endgerät zu erstellen und zu flashen. Nehmen Sie dabei folgende Änderung vor:

Fügen Sie in Build and flash (Erstellen und flashen) beim Aufrufen von script/build die Parameter -DOT_DNS_CLIENT=ON, -DOT_SRP_CLIENT=ON und -DOT_ECDSA=ON an die Befehlszeile an:

$ 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 dem Thread-Netzwerk hinzufügen, um das Thread-Gerät dem Thread-Netzwerk hinzuzufügen.

Warte nach der Einrichtung des Thread-Endgeräts einige Sekunden und prüfe, ob die Verbindung zum Thread-Netzwerk erfolgreich war. Wie oben beschrieben, können Sie das veröffentlichte NAT64-Präfix in den Thread-Netzwerkdaten ansehen.

> 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

Prüfen Sie, ob die Netzwerkdaten mit denen von OTBR übereinstimmen.

4. Mit IPv4-Hosts über das Thread-Endgerät 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 CLI 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 einen NAT64-Zuordnungseintrag 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

Die fd16:a3d:e170:1:492d:bcdb:9f72:6297 sollte die IPv6-Adresse deines Thread-Geräts sein.

Führen Sie diesen Befehl jederzeit auf dem Border Router aus, um zu sehen, wie der Traffic gezählt wird.

DNS-Anfragen 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 ist 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 von Ihrem 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

Ausgaben Ihres Linux-IPv4-Hosts:

hello

Sie können auch 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 mit nc. Das Thread-Endgerät gibt Folgendes aus:

TCP: Received 6 bytes: world

Über UDP kommunizieren

Die Kommunikation zwischen Thread-Geräten und Hosts im IPv4-Netzwerk ist über UDP möglich.

Angenommen, die IP-Adresse Ihres Linux-IPv4-Hosts ist 192.168.0.2.

Verwenden Sie nc, um auf UDP-Verbindungen zu warten:

$ 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: fd16:a3d:e170:2:0:0:c0a8:2
Done
> udp send hello
Done

Ausgaben Ihres Linux-IPv4-Hosts:

hello

Sie können auch 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 mit nc. Das Thread-Endgerät gibt Folgendes aus:

6 bytes from fd16:a3d:e170:2:0:0:c0a8:2 12345 world

5. NAT64 auf dem Border-Router aktivieren/deaktivieren

Sie können NAT64 jederzeit aktivieren oder deaktivieren. Verwenden Sie nat64 disable, um NAT64 zu deaktivieren. Verwenden Sie nat64 state, um den Status von NAT64 zu 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 über diesen Border-Router nicht mehr auf den IPv4-Host zugreifen.

Über die CLI 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:

> nat64 enable
Done
> nat64 state
PrefixManager: Idle
Translator: NotWorking
Done

Nach einigen Sekunden sollten die NAT64-Komponenten betriebsbereit 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

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 Grenzrouter aktiviert ist, versucht OpenThread, die DNS-Abfragen für Internetdomains an vorgelagerte DNS-Server weiterzuleiten.

Achte darauf, dass auf deinem Endgerät der Border-Router als Standard-DNS-Server festgelegt 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) 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. - 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

Sie haben einen Border-Router mit NAT64-Unterstützung eingerichtet und damit Thread-Endgeräte mit Internetzugriff versorgt.

Weitere Informationen

Referenzdokumente