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

Mit Sammlungen den Überblick behalten Sie können Inhalte basierend auf Ihren Einstellungen speichern und kategorisieren.

1. Einführung

699 D673D05A55535.png

Was ist ein Thread-Border-Router?

Thread ist ein IP-basiertes stromsparendes Mesh-Netzwerk-Protokoll für sichere Geräte-zu-Gerät- und Geräte-zu-Cloud-Kommunikation. Thread-Netzwerke können sich an Topologieänderungen anpassen, um Single Point Of Failure zu vermeiden.

Ein Thread-Border-Router verbindet ein Thread-Netzwerk mit anderen IP-basierten Netzwerken, z. B. WLAN oder Ethernet. Ein Thread-Netzwerk erfordert 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 (im Thread-Netzwerk).
  • Thread-over-Infrastructure, die Threadpartitionen über IP-basierte Links zusammenführt
  • Externe Thread-Inbetriebnahme (z. B. ein Mobiltelefon), um sich zu authentifizieren und ein Thread-Gerät mit einem Thread-Netzwerk zu verbinden.

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

Inhalt

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

Lerninhalte

  • OTBR einrichten
  • Thread-Netzwerk mit OTBR erstellen
  • So erstellen Sie ein OpenThread-CLI-Gerät mit dem SRP-Feature
  • Einen Dienst mit SRP registrieren
  • Hier erfahren Sie, wie Sie ein Thread-Endgerät finden und erreichen.

Voraussetzungen

  • Ein Raspberry Pi 3/4-Gerät und eine SD-Karte mit mindestens 8 GB Kapazität
  • 2 Nordische Halbleiter nRF52840-Entwicklerplatinen.
  • Ein WLAN-AP ohne IPv6-Router-Advertising Guard, der auf dem Router aktiviert ist.
  • iOS-Smartphone mit mindestens iOS 14 oder Android-Smartphone mit Android 8.1 oder höher

2. OTBR einrichten

Raspberry Pi einrichten

Das Einrichten eines neuen Raspberry Pi-Geräts mit dem rpi-imager-Tool ist ganz einfach. Folgen Sie dazu der Anleitung auf raspberrypi.org. Statt das aktuelle Raspberry Pi OS im Tool zu verwenden, laden Sie 2021-05-07-raspios-buster-armhf-lite von Ihnen selbst. Für die Schritte auf dem Smartphone in diesem Codelab musst du den Raspberry Pi mit einem WLAN-AP verbinden. Folgen Sie dieser Anleitung, um eine kabellose Verbindung einzurichten. Es ist praktisch, sich über SSH mit dem Raspberry Pi anzumelden. Eine entsprechende Anleitung finden Sie hier.

OTBR-Code abrufen

Melden Sie sich bei Ihrem Raspberry Pi an und klonen Sie ot-br-posix von GitHub:

$ git clone https://github.com/openthread/ot-br-posix.git --depth 1

OTBR erstellen und installieren

OTBR hat zwei Skripts, die das Bootstrap ausführen und den Thread-Border-Router einrichten:

$ cd ot-br-posix
$ ./script/bootstrap
$ INFRA_IF_NAME=wlan0 ./script/setup

OTBR funktioniert sowohl mit einer Thread-Schnittstelle als auch mit einer Infrastruktur-Netzwerkschnittstelle (z.B. WLAN/Ethernet), die mit INFRA_IF_NAME angegeben ist. Die Thread-Schnittstelle wird von OTBR selbst erstellt und wpan0 genannt. Wenn nicht explizit INFRA_IF_NAME angegeben ist, hat die Infrastrukturschnittstelle einen Standardwert von wlan0. Wenn der Raspberry Pi über ein Ethernet-Kabel verbunden ist, geben Sie den Namen der Ethernet-Schnittstelle an (z.B. eth0):

$ INFRA_IF_NAME=eth0 ./script/setup

Prüfen Sie, ob OTBR erfolgreich installiert wurde:

$ sudo service otbr-agent status
● otbr-agent.service - Border Router Agent
   Loaded: loaded (/lib/systemd/system/otbr-agent.service; enabled; vendor preset: enabled)
   Active: activating (auto-restart) (Result: exit-code) since Mon 2021-03-01 05:43:38 GMT; 2s ago
  Process: 2444 ExecStart=/usr/sbin/otbr-agent $OTBR_AGENT_OPTS (code=exited, status=2)
 Main PID: 2444 (code=exited, status=2)

Erwartet ist, dass der otbr-agent-Dienst nicht aktiv ist, da dafür ein RCP-Chip erforderlich ist.

Starten Sie den Raspberry Pi neu, damit die Änderungen wirksam werden.

Build- und Flash-RCP-Firmware

OTBR unterstützt einen 15.4-Funkchip im Radio Co-Processor-Modus (RCP). In diesem Modus wird der OpenThread-Stack auf der Hostseite ausgeführt und überträgt/empfängt Frames über den IEEE802.15.4-Transceiver.

FolgenSchritt 4 vonThread-Netzwerk mit nRF52840-Boards und OpenThread erstellen Codelab So erstellen Sie ein nRF52840-RCP-Gerät und laden es hoch:

$ script/build nrf52840 USB_trans

OTBR starten und Status prüfen

Verbinden Sie das nRF52840-Board mit dem Raspberry Pi und starten Sie den Dienst otbr-agent:

$ sudo service otbr-agent restart

Prüfen Sie, ob der otbr-agent-Dienst aktiv ist:

$ sudo service otbr-agent status
● otbr-agent.service - Border Router Agent
   Loaded: loaded (/lib/systemd/system/otbr-agent.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2021-03-01 05:46:26 GMT; 2s ago
 Main PID: 2997 (otbr-agent)
    Tasks: 1 (limit: 4915)
   CGroup: /system.slice/otbr-agent.service
           └─2997 /usr/sbin/otbr-agent -I wpan0 -B wlan0 spinel+hdlc+uart:///dev/ttyACM0

Mar 01 05:46:26 raspberrypi otbr-agent[2997]: Stop publishing service
Mar 01 05:46:26 raspberrypi otbr-agent[2997]: [adproxy] Stopped
Mar 01 05:46:26 raspberrypi otbr-agent[2997]: PSKc is not initialized
Mar 01 05:46:26 raspberrypi otbr-agent[2997]: Check if PSKc is initialized: OK
Mar 01 05:46:26 raspberrypi otbr-agent[2997]: Initialize OpenThread Border Router Agent: OK
Mar 01 05:46:26 raspberrypi otbr-agent[2997]: Border router agent started.
Mar 01 05:46:26 raspberrypi otbr-agent[2997]: [INFO]-CORE----: Notifier: StateChanged (0x00038200) [NetData PanId NetName ExtPanId]
Mar 01 05:46:26 raspberrypi otbr-agent[2997]: [INFO]-PLAT----: Host netif is down

3. Thread-Netzwerk bilden

Es gibt einen ot-ctl-Befehl, mit dem der otbr-agent-Service gesteuert werden kann. ot-ctl akzeptiert alle OpenThread-Befehlszeilenbefehle. Weitere Informationen finden Sie in der OpenThread-Befehlszeile.

Erstellen Sie ein Thread-Netzwerk mit OTBR:

$ sudo ot-ctl dataset init new
Done
$ sudo ot-ctl dataset commit active
Done
$ sudo ot-ctl ifconfig up
Done
$ sudo ot-ctl thread start
Done

Warten Sie einige Sekunden. Wir sollten sehen, dass OTBR als Thread leader fungiert und in den Thread-Netzwerkdaten das Präfix off-mesh-routable (OMR) enthalten ist:

$ sudo ot-ctl state
leader
Done
$ 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

4. SRP-Client-Endgerät einrichten

OT-Befehlszeile für Build und Flash

FolgenSchritt 5 vonThread-Netzwerk mit nRF52840-Boards und OpenThread erstellen Codelab um ein nRF52840-CLI-Endgerät zu erstellen und zu speichern.

Anstelle von OT_COMMISSIONER und OT_JOINER sind für den Befehlszeilenknoten jedoch die Features OT_SRP_CLIENT und OT_ECDSA erforderlich.

Der vollständige Build-Aufruf sollte also so aussehen:

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

Dem OTBR-Netzwerk beitreten

Damit Sie dem Thread-Netzwerk beitreten können, das vom otbr-agent-Dienst erstellt wurde, müssen Sie das aktive Betriebs-Dataset vom OTBR-Gerät abrufen. Kehren Sie zur otbr-agent-Befehlszeile zurück und rufen Sie das aktive Dataset ab:

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

Kehren Sie zur SRP-Client-Bildschirmsitzung zurück und legen Sie das aktive Dataset fest:

> dataset set active 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff
Done

Starten Sie dann die Thread-Oberfläche:

> ifconfig up
Done
> thread start
Done

Warten Sie einige Sekunden und prüfen Sie, ob der Beitritt zum Thread-Netzwerk erfolgreich war:

> 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

Achten Sie darauf, dass die Netzwerkdaten mit denen auf dem OTBR übereinstimmen. Wir können jetzt die OMR-Adresse von OTBR 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

5 Dienst auf dem Gerät veröffentlichen

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

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

Rufen Sie die Bildschirmsitzung mit dem SRP-Clientknoten auf und starten Sie den SRP-Client automatisch:

> srp client autostart enable
Done

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

> srp client host name ot-host
Done

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

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

Registrieren Sie am Ende einen gefälschten _ipps._tcp-Dienst:

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

Warten Sie einige Sekunden. Danach sollte der Dienst registriert sein:

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

Wir sind fertig eingerichtet und der _ipps._tcp-Dienst sollte bereits über die WLAN-/Ethernet-Verbindung beworben worden sein. Jetzt ist es Zeit, das Endgerät zu entdecken!

6. Den Dienst entdecken

Entdecke den Dienst mit dem Smartphone

54a136a8940897cc.png

Wir verwenden die Service Browser App, um mDNS-Dienste mit dem Android-Smartphone zu erkennen. Eine äquivalente App gibt es auch für iOS-Mobilgeräte. Öffnen Sie die App. Jetzt sollte der Dienst _ipps._tcp angezeigt werden.

Dienst mit einem Linux-Host entdecken

Wenn Sie den Dienst von einem anderen Linux-Host aus suchen 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

Lösen Sie den Dienst auf:

$ 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

Sie können dns-sd unter macOS verwenden, um den Dienst aufzulösen:

$ 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     ""
...

7. Endgerät anpingen

Ping von einem Smartphone

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

bb992962e68d250b.png 888DAA1df1e1a9bf.png

Wir können die OMR-Adresse jetzt mit einer anderen Network Analyzer-App pingen.

Leider unterstützt die Android-Version der Network Analyzer App keine mDNS-Abfragen für das Ping-Dienstprogramm und wir können den Hostnamen ot-host.local nicht direkt anpingen. Wir können den Hostnamen stattdessen mit der iOS-Version der App kontaktieren.

Ping von einem Linux-/MacOS-Host aus

Thread Border Router sendet ICMPv6-Router-Advertising (RA) zum Bewerben von Präfixen (über die Präfix-Informationsoption) und Routen (über Routeninformationen-Option) über den WLAN-/Ethernet-Link.

Linux-Host vorbereiten

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

  1. net.ipv6.conf.wlan0.accept_ra sollte mindestens 1 sein, wenn die IP-Weiterleitung nicht aktiviert ist. Andernfalls 2.
  2. net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen sollte nicht kleiner als 64 sein.

accept_ra ist für die meisten Distributionen standardmäßig auf 1 eingestellt. Es kann aber auch andere Netzwerk-Daemons geben, die diese Option überschreiben, z. B. überschreibt dhcpcd auf Raspberry Pi accept_ra durch 0. Sie können den accept_ra-Wert so prüfen:

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

Setzen Sie den Wert auf 1 (oder 2, falls die IP-Weiterleitung aktiviert ist):

$ 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 auf den meisten Linux-Distributionen standardmäßig auf 0 eingestellt. Legen Sie dafür Folgendes mit 64 fest:

$ 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 nach dem Neustart des Hosts verloren. Hängen 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 kann zu spät sein, diese Konfigurationen zu ändern, da der OTBR bereits RA-Nachrichten gesendet hat und das Intervall zwischen zwei unerwünschten RA-Nachrichten mehrere hundert Sekunden betragen kann. Eine Möglichkeit besteht darin, die Verbindung zum WLAN-AP zu trennen und wiederherzustellen, um Nachrichten zur Routeranforderung zu senden, damit OTBR mit angeforderten RAs antwortet. Eine weitere Option ist, die Funktion orderBorder Routing“ (Border-Routing) auf dem Border Router neu zu starten:

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

Wenn Sie eine Verbindung zum WLAN wiederherstellen oder die Ethernet-Schnittstelle neu starten, achten Sie darauf, dass dhcpcd nicht zur Verwaltung Ihres WLAN-/Ethernet-IPv6-Netzwerks verwendet wird. Da dhcpcd die Option accept_ra jedes Mal überschreibt, wenn die Schnittstelle neu gestartet wird, geht Ihre accept_ra-Konfiguration verloren. Hängen Sie unten an die dhcpcd-Konfigurationsdatei (z.B. /etc/dhcpcd.conf) an, 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, aber Sie müssen Ihr System auf mindestens macOS Big Sur aktualisieren.

Ping den Hostnamen oder die IPv6-Adresse

Der Hostname ot-host.local kann jetzt mit dem Befehl ping -6 (ping6 für macOS) angepingt werden:

$ 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
...

Dieser Befehl kann auf Linux-Hosts 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 mdns6_minimal in die Zeile ein, die mit hosts beginnt:

hosts:          files mdns4_minimal mdns6_minimal dns

Natürlich können Sie die IPv6-Adresse jederzeit direkt anpingen:

$ 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
...

8. Veröffentlichung des Dienstes durch Endgerät aufheben

So entfernen Sie die Adresse und den Dienst aus dem SRP-Clientknoten:

> srp client host remove
Done

Sie sollten den _ipps._tcp-Dienst jetzt nicht mehr erkennen können.

9. Glückwunsch

Glückwunsch! Sie haben OTBR als Thread-Border-Router eingerichtet, um Thread-Endgeräte bidirektionale IP-Verbindungen und Service Discovery bereitstellen zu können.

Was liegt als Nächstes an?

Dann sieh dir ein paar dieser Codelabs an...

Referenzdokumente