Thread-Border-Router – Bidirektionale IPv6-Konnektivität und DNS-basierte Diensterkennung

Informationen zu diesem Codelab
schedule22 Minuten
subjectZuletzt aktualisiert: 23. Mai 2025
account_circleVerfasst von Kangping Dong, Jonathan Hui

1. Einführung

699d673d05a55535.png

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 Thread-Border-Router?

Ein Thread-Border-Router verbindet ein Thread-Netzwerk mit anderen IP-basierten Netzwerken wie WLAN oder Ethernet. Ein Thread-Netzwerk benötigt einen Border-Router, um eine Verbindung zu anderen Netzwerken herzustellen. Ein Thread-Border-Router unterstützt mindestens die folgenden Funktionen:

  • Bidirektionale IP-Verbindung zwischen Thread- und WLAN-/Ethernet-Netzwerken
  • Bidirektionale Diensterkennung über mDNS (über WLAN/Ethernet-Link) und SRP (über Thread-Netzwerk).
  • Thread-over-Infrastructure, die Thread-Partitionen über IP-basierte Links zusammenführt.
  • Externe Thread-Inbetriebnahme (z. B. ein Smartphone), um ein Thread-Gerät zu authentifizieren und mit einem Thread-Netzwerk zu verbinden.

Der von Google veröffentlichte OpenThread Border Router (OTBR) ist eine Open-Source-Implementierung des Thread-Border-Routers.

Aufgaben

In diesem Codelab richten Sie einen Thread-Border-Router ein und verbinden Ihr Smartphone über den Border-Router mit einem Thread-Endgerät.

Lerninhalte

  • OTBR einrichten
  • Thread-Netzwerk mit OTBR bilden
  • OpenThread-CLI-Gerät mit SRP-Funktion erstellen
  • Dienst bei SRP registrieren
  • Thread-Endgeräte finden und erreichen

Voraussetzungen

  • Eine Linux-Workstation zum Erstellen und Flashen eines Thread-RCP, der OpenThread-Befehlszeile und zum Testen von IPv6-Multicast.
  • Ein Raspberry Pi für den Thread-Border-Router
  • 2 USB-Dongles vom Typ Nordic Semiconductor nRF52840 (einer für den RCP und einer für das Thread-Endgerät)
  • Ein iOS-Smartphone mit mindestens iOS 14 oder ein Android-Smartphone mit mindestens Android 8.1

2. OTBR 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 OTBR als Thread-leader fungiert.

$ sudo ot-ctl state
leader
Done

Prüfen Sie außerdem, ob der OTBR automatisch ein off-mesh-routable-Präfix (OMR) in den Thread-Netzwerkdaten konfiguriert hat.

$ sudo ot-ctl netdata show
Prefixes:
Prefixes:
fd76:a5d1:fcb0:1707::/64 paos med 4000
Routes:
fd49:7770:7fc5:0::/64 s med 4000
Services:
44970 5d c000 s 4000
44970 01 9a04b000000e10 s 4000
Done
$ sudo ot-ctl ipaddr      
fda8:5ce9:df1e:6620:0:ff:fe00:fc11
fda8:5ce9:df1e:6620:0:0:0:fc38
fda8:5ce9:df1e:6620:0:ff:fe00:fc10
fd76:a5d1:fcb0:1707:f3c7:d88c:efd1:24a9
fda8:5ce9:df1e:6620:0:ff:fe00:fc00
fda8:5ce9:df1e:6620:0:ff:fe00:4000
fda8:5ce9:df1e:6620:3593:acfc:10db:1a8d
fe80:0:0:0:a6:301c:3e9f:2f5b
Done

3. SRP-Client-Endgerät einrichten

OT-Befehlszeile erstellen und flashen

Folgen Sie Schritt 5 des Codelabs zum Erstellen eines Thread-Netzwerks mit nRF52840-Boards und OpenThread, um ein nRF52840-CLI-Endgerät zu erstellen und zu flashen.

Statt OT_COMMISSIONER und OT_JOINER müssen für den Befehlszeilenknoten jedoch OT_SRP_CLIENT und OT_ECDSA aktiviert sein.

Die vollständige Buildaufruf sollte also so aussehen:

$ script/build nrf52840 USB_trans -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON

Thread-Netzwerk beitreten

Um dem Thread-Netzwerk beizutreten, müssen wir den aktiven Betriebsdatensatz vom OTBR-Gerät abrufen. Kehren wir zu ot-ctl zurück und rufen wir den aktiven Datensatz ab:

$ sudo ot-ctl dataset active -x
0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff
Done

Kehren Sie zur Bildschirmsitzung des SRP-Clientknotens zurück und legen Sie den aktiven Datensatz fest:

> dataset set active 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff
Done

Starten Sie dann die Thread-Benutzeroberfläche:

> ifconfig up
Done
> thread start
Done

Warten Sie einige Sekunden und prüfen Sie, ob die Verbindung zum Thread-Netzwerk hergestellt wurde:

> state
child
Done
> netdata show
Prefixes:
fd76:a5d1:fcb0:1707::/64 paos med 4000
Routes:
fd49:7770:7fc5:0::/64 s med 4000
Services:
44970 5d c000 s 4000
44970 01 9a04b000000e10 s 4000
Done
> ipaddr
fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927
fda8:5ce9:df1e:6620:0:ff:fe00:4001
fda8:5ce9:df1e:6620:ed74:123:cc5d:74ba
fe80:0:0:0:d4a9:39a0:abce:b02e
Done

Die Netzwerkdaten müssen mit den auf dem OTBR gedruckten Daten übereinstimmen. Wir können jetzt die OMR-Adresse von OTBR mit Ping kontaktieren:

> ping fd76:a5d1:fcb0:1707:f3c7:d88c:efd1:24a9
Done
> 16 bytes from fd76:a5d1:fcb0:1707:f3c7:d88c:efd1:24a9: icmp_seq=1 hlim=64 time=49ms

4. Dienst auf dem Endgerät veröffentlichen

mDNS wurde häufig für die Veröffentlichung von DNS-SD-Diensten auf Link-Local verwendet. Multicast-Nachrichten verbrauchen jedoch zu viel Bandbreite und entladen den Akku von Geräten mit geringem Stromverbrauch schnell. Thread verwendet das Unicast-Protokoll SRP, um seine Dienste beim Border-Router zu registrieren, und nutzt den Border-Router, um die Dienste über die WLAN- oder Ethernet-Verbindung zu bewerben.

Wir können einen Dienst mit dem Befehl srp client registrieren.

Rufen Sie die Bildschirmsitzung des SRP-Client-Knotens auf und starten Sie den SRP-Client automatisch:

> srp client autostart enable
Done

Legen Sie den Hostnamen fest, der über die WLAN-/Ethernet-Verbindung angekündigt wird:

> srp client host name ot-host
Done

Damit ein Gerät über die WLAN-/Ethernet-Verbindung ein Thread-Endgerät erreichen kann, muss die OMR-Adresse des Endgeräts angekündigt werden:

> srp client host address fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927
Done

Registrieren Sie abschließend einen gefälschten _ipps._tcp-Dienst:

> srp client service add ot-service _ipps._tcp 12345
Done

Warten Sie einige Sekunden. Der Dienst sollte jetzt registriert sein:

> srp client service
instance:"ot-service", name:"_ipps._tcp", state:Registered, port:12345, priority:0, weight:0
Done

Wir haben alle Einrichtungsarbeiten abgeschlossen und der _ipps._tcp-Dienst sollte über die WLAN-/Ethernet-Verbindung beworben werden. Jetzt ist es an der Zeit, das Endgerät zu finden und zu erreichen.

5. Dienst entdecken

Dienst mit einem Smartphone entdecken

54a136a8940897cc.png

Wir verwenden die App Service Browser, um mDNS-Dienste mit dem Android-Smartphone zu finden. Für iOS-Mobilgeräte gibt es eine entsprechende App. Öffne die App und der Dienst _ipps._tcp sollte angezeigt werden.

Dienst mit einem Linux-Host finden

Wenn Sie den Dienst von einem anderen Linux-Host aus ermitteln möchten, können Sie den Befehl avahi-browse verwenden.

Installieren Sie avahi-daemon und avahi-utils:

$ sudo apt-get install -y avahi-daemon avahi-utils

Weisen Sie den Dienst zu:

$ sudo service avahi-daemon start # Ensure the avahi daemon is started.
$ avahi-browse -r _ipps._tcp
+ wlan0 IPv6 ot-service                                    Secure Internet Printer local
= wlan0 IPv6 ot-service                                    Secure Internet Printer local
   hostname = [ot-host.local]
   address = [fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927]
   port = [12345]
   txt = []
...

Dienst mit einem macOS-Host finden

So kannst du unter macOS mit dns-sd den Dienst beheben:

$ dns-sd -Z _ipps._tcp local.
Browsing for _ipps._tcp.local.
DATE: ---Sun 14 Mar 2021---
21:31:42.125  ...STARTING...

; To direct clients to browse a different domain, substitute that domain in place of '@'
lb._dns-sd._udp                                 PTR     @

; In the list of services below, the SRV records will typically reference dot-local Multicast DNS names.
; When transferring this zone file data to your unicast DNS server, you'll need to replace those dot-local
; names with the correct fully-qualified (unicast) domain name of the target host offering the service.

_ipps._tcp                                      PTR     ot-service._ipps._tcp
ot-service._ipps._tcp                           SRV     0 0 12345 ot-host.local. ; Replace with unicast FQDN of target host
ot-service._ipps._tcp                           TXT     ""
...

6. Ping an das Endgerät senden

Ping von einem Smartphone

Nehmen wir als Beispiel das Pixel Smartphone. Die OMR-Adresse des zuvor registrierten Dienstes „ot-service“ finden wir in der Service Browser App auf der Detailseite der Dienstinstanz.

bb992962e68d250b.png 888daa1df1e1a9bf.png

Wir können jetzt mit einer anderen Network Analyzer App einen Ping an die OMR-Adresse senden.

Leider unterstützt die Android-Version der Netzwerkanalyse-App keine mDNS-Abfragen für das Ping-Dienstprogramm. Wir können den Hostnamen ot-host.local also nicht direkt pingen. Mit der iOS-Version der App ist das jedoch möglich.

Ping von einem Linux-/macOS-Host

Thread-Border-Router senden ICMPv6-Router-Anzeigen (RA), um Präfixe (über die Präfix-Informationsoption) und Routen (über die Routen-Informationsoption) über die WLAN/Ethernet-Verbindung zu bewerben.

Linux-Host vorbereiten

Achten Sie darauf, dass RA und RIO auf Ihrem Host aktiviert sind:

  1. net.ipv6.conf.wlan0.accept_ra sollte mindestens 1 betragen, wenn die IP‑Weiterleitung nicht aktiviert ist, andernfalls 2.
  2. net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen darf nicht kleiner als 64 sein.

Bei den meisten Distributionen ist accept_ra standardmäßig 1. Es kann jedoch andere Netzwerkdaemons geben, die diese Option überschreiben. Beispielsweise überschreibt dhcpcd auf Raspberry Pi accept_ra mit 0. Sie können den Wert von accept_ra mit folgendem Befehl prüfen:

$ sudo sysctl -n net.ipv6.conf.wlan0.accept_ra
0

Legen Sie den Wert mit folgendem Befehl auf 1 (oder 2, falls die IP-Weiterleitung aktiviert ist) fest:

$ sudo sysctl -w net.ipv6.conf.wlan0.accept_ra=1
Net.ipv6.conf.wlan0.accept_ra = 1

Die Option accept_ra_rt_info_max_plen ist in den meisten Linux-Distributionen standardmäßig auf 0 festgelegt. Sie können sie mit folgendem Befehl auf 64 festlegen:

$ sudo sysctl -w net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen=64
net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen = 64

Die Änderung geht verloren, wenn der Host neu gestartet wird. Fügen Sie beispielsweise die folgenden Befehle an /etc/sysctl.conf an, um RIO dauerhaft zu aktivieren:

$ net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen = 64

Es ist möglicherweise zu spät, diese Konfigurationen zu ändern, da der OTBR bereits RA-Nachrichten gesendet hat und das Intervall zwischen zwei unaufgeforderten RA-Nachrichten mehrere hundert Sekunden betragen kann. Eine Möglichkeit besteht darin, die Verbindung zum WLAN-Zugangspunkt zu trennen und wiederherzustellen, um Router-Anfragenachrichten zu senden, damit OTBR mit angeforderten RAs antwortet. Eine weitere Möglichkeit besteht darin, die Border-Routing-Funktion auf dem Border-Router neu zu starten:

$ sudo ot-ctl br disable
Done
$ sudo ot-ctl br enable
Done

Wenn Sie versuchen, eine WLAN-Verbindung wiederherzustellen oder die Ethernet-Schnittstelle neu zu starten, darf dhcpcd nicht zum Verwalten Ihres WLAN-/Ethernet-IPv6-Netzwerks verwendet werden. Da dhcpcd die accept_ra-Option immer überschreibt, wenn die Schnittstelle neu gestartet wird, geht die accept_ra-Konfiguration verloren. Fügen Sie der dhcpcd-Konfigurationsdatei (z.B. /etc/dhcpcd.conf) die folgenden Zeilen hinzu, um IPv6 in dhcpcd explizit zu deaktivieren:

noipv6
noipv6rs

Sie müssen neu starten, damit die Änderung wirksam wird.

macOS-Host vorbereiten

Beide accept_ra*-Optionen sind standardmäßig aktiviert, Sie müssen Ihr System jedoch mindestens auf macOS Big Sur aktualisieren.

Ping an den Hostnamen oder die IPv6-Adresse senden

Wir können jetzt mit dem Befehl ping -6 (ping6 unter macOS) einen Ping an den Hostnamen ot-host.local senden:

$ ping -6 ot-host.local.
PING ot-host.local.(fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927)) 56 data bytes
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=1 ttl=63 time=170 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=2 ttl=63 time=64.2 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=3 ttl=63 time=22.8 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=4 ttl=63 time=37.7 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927 (fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927): icmp_seq=5 ttl=63 time=28.7 ms
...

Auf Linux-Hosts kann dieser Befehl mit dem Fehler "Name or service not known" fehlschlagen. Das liegt daran, dass der Befehl ping den Namen ot-host.local. nicht mit mDNS-Abfragen auflöst. Öffnen Sie /etc/nsswitch.conf und fügen Sie der Zeile, die mit hosts beginnt, mdns6_minimal hinzu:

hosts:          files mdns4_minimal mdns6_minimal dns

Natürlich können Sie auch direkt einen Ping auf die IPv6-Adresse senden:

$ ping -6 fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927
PING fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927(fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927) 56 data bytes
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=1 ttl=63 time=32.9 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=2 ttl=63 time=27.8 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=3 ttl=63 time=29.9 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=4 ttl=63 time=73.5 ms
64 bytes from fd76:a5d1:fcb0:1707:d3dc:26d3:f70b:b927: icmp_seq=5 ttl=63 time=26.4 ms
...

7. Dienst für Endgeräte deaktivieren

So entfernen Sie die Adresse und den Dienst, die beim SRP-Clientknoten registriert sind:

> srp client host remove
Done

Der _ipps._tcp-Dienst sollte jetzt nicht gefunden werden.

8. Glückwunsch

Sie haben OTBR als Thread-Border-Router eingerichtet, um eine bidirektionale IP-Konnektivität und Diensterkennung für Thread-Endgeräte bereitzustellen.

Nächste Schritte

Sehen Sie sich einige dieser Codelabs an:

Referenzdokumente