Router granic wątków – dwukierunkowe połączenia IPv6 i wykrywanie usług oparte na DNS

1. Wprowadzenie

699d673d05a55535.png

Co to jest router granic wątków?

Thread to oparty na adresach IP protokół sieci bezprzewodowej typu mesh o niskim poborze energii, który umożliwia bezpieczną komunikację między urządzeniami i chmurą. Sieci Thread mogą dostosowywać się do zmian topologii, aby uniknąć awarii pojedynczego punktu.

Router graniczny Thread łączy sieć Thread z innymi sieciami opartymi na IP, takimi jak Wi-Fi czy Ethernet. Sieć Thread wymaga routera Border Router do łączenia się z innymi sieciami. Router granic wątków obsługuje minimalnie te funkcje:

  • Dwukierunkowe połączenia IP między sieciami Thread i Wi-Fi/Ethernet.
  • Dwukierunkowe wykrywanie usług przez mDNS (w połączeniu Wi-Fi/Ethernet) i SRP (w sieci Thread).
  • Infrastruktura typu „Thread-over-infrastruktura”, która scala partycje Thread przy użyciu linków opartych na adresach IP.
  • Zewnętrzne przekazywanie wątków (np. telefon komórkowy) umożliwia uwierzytelnianie urządzenia Thread i dołączanie do sieci Thread.

Opublikowany przez Google rozwiązanie OpenThread Border Router (OTBR) to implementacja open source routera Border Router.

Co utworzysz

W ramach tego ćwiczenia w Codelabs dowiesz się, jak skonfigurować router granic wątków i połączyć telefon komórkowy z urządzeniem końcowym Thread za pomocą routera Border Router.

Czego się nauczysz

  • Jak skonfigurować OTBR
  • Jak utworzyć sieć Thread przy użyciu OTBR
  • Jak utworzyć urządzenie interfejsu wiersza poleceń OpenThread z funkcją SRP
  • Jak zarejestrować usługę w SRP
  • Jak znaleźć urządzenie końcowe Thread i się z nim połączyć.

Czego potrzebujesz

  • urządzenie Raspberry Pi 3/4 i karta SD o pojemności co najmniej 8 GB;
  • 2 płytki deweloperskie Nordic Semiconductor nRF52840.
  • punkt dostępu Wi-Fi bez włączonego zabezpieczenia przed reklamami routera IPv6.
  • Telefon z iOS w wersji 14 lub nowszej albo telefon z Androidem w wersji 8.1 lub nowszej.

2. Skonfiguruj OTBR

Skonfiguruj Raspberry Pi

Możesz łatwo skonfigurować nowe urządzenie Raspberry Pi za pomocą narzędzia rpi-imager, postępując zgodnie z instrukcjami na raspberrypi.org (zamiast korzystać z najnowszej wersji systemu operacyjnego Raspberry Pi – pobierz samodzielnie 2021-05-07-raspios-buster-armhf-lite). Aby wykonać na telefonie komórkowym opisane w tym ćwiczeniu w programie czynności, musisz połączyć Raspberry Pi z punktem dostępu Wi-Fi. Postępuj zgodnie z tym przewodnikiem, aby skonfigurować łączność bezprzewodową. Zalogowanie się do Raspberry Pi przez SSH jest wygodne – instrukcje znajdziesz tutaj.

Uzyskaj kod OTBR

Zaloguj się w Raspberry Pi i skopiuj ot-br-posix z GitHuba:

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

Tworzenie i instalowanie OTBR

OTBR ma 2 skrypty, które ładują się i konfigurują router granic wątków:

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

OTBR działa zarówno w interfejsie Thread, jak i w interfejsie sieci infrastruktury (np. Wi-Fi/Ethernet), który jest określony za pomocą INFRA_IF_NAME. Interfejs Thread jest tworzony przez OTBR i domyślnie nazywa się wpan0, a interfejs infrastruktury ma domyślną wartość wlan0, jeśli nie określono wyraźnie parametru INFRA_IF_NAME. Jeśli Twoje urządzenie Raspberry Pi jest podłączone kablem Ethernet, podaj nazwę interfejsu Ethernet (np. eth0):

$ INFRA_IF_NAME=eth0 ./script/setup

Sprawdź, czy OTBR został zainstalowany:

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

Usługa otbr-agent powinna być nieaktywna, ponieważ do działania wymaga elementu RCP.

Aby zastosować zmiany, uruchom ponownie Raspberry Pi.

Tworzenie i wdrażanie oprogramowania RCP

OTBR obsługuje układ radiowy 15.4 w trybie współprocesora radiowego (RCP). W tym trybie stos OpenThread działa po stronie hosta i przesyła/odbiera ramki przez odbiornik IEEE802.15.4.

Wykonaj krok 4 z tworzenia sieci Thread przy użyciu tablic nRF52840 i ćwiczenia z programowania OpenThread, aby utworzyć i zainstalować urządzenie RCP nRF52840:

$ script/build nrf52840 USB_trans

Uruchom OTBR i sprawdź stan

Podłącz płytkę nRF52840 do Raspberry Pi i uruchom usługę otbr-agent:

$ sudo service otbr-agent restart

Sprawdź, czy usługa otbr-agent jest aktywna:

$ 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. Tworzenie sieci Thread

Do sterowania usługą otbr-agent można użyć polecenia ot-ctl. ot-ctl akceptuje wszystkie polecenia interfejsu wiersza poleceń OpenThread. Więcej informacji znajdziesz w przewodniku po interfejsie wiersza poleceń OpenThread.

Tworzenie sieci Thread przy użyciu 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

Zaczekaj kilka sekund. Powinny być już widoczne OTBR działające jako leader wątku, a w danych sieciowych Thread zawiera prefiks off-mesh-routable (OMR):

$ 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. Skonfiguruj urządzenie końcowe klienta SRP

Tworzenie i flashowanie interfejsu OT CLI

Wykonaj krok 5 z instrukcji tworzenia sieci Thread przy użyciu tablic nRF52840 i ćwiczenia z programowania OpenThread, aby utworzyć i zainstalować urządzenie końcowe nRF52840 w interfejsie wiersza poleceń nRF52840.

Jednak zamiast włączonego interfejsu OT_COMMISSIONER i OT_JOINER węzeł interfejsu wiersza poleceń wymaga funkcji OT_SRP_CLIENT i OT_ECDSA.

Pełne wywołanie kompilacji powinno wyglądać tak:

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

Dołącz do sieci OTBR

Aby dołączyć do sieci Thread utworzonej przez usługę otbr-agent, musimy pobrać aktywny zbiór danych operacyjnych z urządzenia OTBR. Wróćmy do wiersza poleceń otbr-agent i pobierzmy aktywny zbiór danych:

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

Wróć do sesji na ekranie węzła klienta SRP i ustaw aktywny zbiór danych:

> dataset set active 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff
Done

Następnie uruchom interfejs Thread:

> ifconfig up
Done
> thread start
Done

Zaczekaj kilka sekund i sprawdź, czy udało się dołączyć do sieci Thread:

> 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

Upewnij się, że dane sieciowe są zgodne z danymi wydrukowanymi na OTBR. Możemy teraz wysłać ping do adresu OMR OTBR:

> 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. Publikowanie usługi na urządzeniu końcowym

mDNS jest powszechnie stosowany do publikowania usługi DNS-SD w linku lokalnym. Jednak wiadomości w trybie multicast wykorzystują zbyt dużą przepustowość i szybko wyczerpują baterię urządzeń o niskim zużyciu energii. Thread używa protokołu unicast SRP do zarejestrowania swoich usług w routerze Border Router i używa routera Border Router do rozgłaszania usług przez połączenie Wi-Fi lub Ethernet.

Możemy zarejestrować usługę za pomocą polecenia srp client.

Otwórz sesję ekranu węzła klienta SRP i automatycznie uruchom klienta SRP:

> srp client autostart enable
Done

Ustaw nazwę hosta, która będzie rozgłaszana przy użyciu połączenia Wi-Fi/Ethernet:

> srp client host name ot-host
Done

Aby urządzenie korzystające z połączenia Wi-Fi/Ethernet miało dostęp do urządzenia końcowego Thread, musi być rozgłaszany adres OMR tego urządzenia:

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

Na koniec zarejestruj fałszywą usługę _ipps._tcp:

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

Zaczekaj kilka sekund. Aplikacja powinna być zarejestrowana:

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

Zakończyliśmy wszystkie prace konfiguracyjne i usługa _ipps._tcp powinna być rozgłaszana przez połączenie Wi-Fi/Ethernet. Nadszedł czas na znalezienie urządzenia końcowego i dotarcie do niego.

6. Odkryj Usługę

Poznawanie usługi na telefonie komórkowym

54a136a8940897cc.png

Do wykrywania usług mDNS za pomocą telefonu z Androidem używamy aplikacji przeglądarki usług. Odpowiednią aplikację można też znaleźć na urządzenia mobilne z iOS. Otwórz aplikację. Powinna pojawić się usługa _ipps._tcp.

Poznawanie usługi na hoście z systemem Linux

Jeśli chcesz wykryć usługę na innym hoście z Linuksem, możesz użyć polecenia avahi-browse.

Zainstaluj avahi-daemon i avahi-utils:

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

Rozwiąż problem z usługą:

$ 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 = []
...

Poznawanie usługi z hostem macOS

Aby rozwiązać problem, możesz użyć dns-sd w systemie macOS:

$ 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. Pingowanie urządzenia końcowego

Ping z telefonu komórkowego

Na przykładzie telefonu Pixel możemy znaleźć adres OMR zarejestrowanej wcześniej usługi „ot-service”. na stronie szczegółów instancji usługi w aplikacji przeglądarki usług.

bb992962e68d250b.png 888daa1df1e1a9bf.png

Możemy teraz wysłać ping do adresu OMR z inną aplikacją Analizator sieci.

Wersja aplikacji Network Analyzer na Androida nie obsługuje zapytań mDNS w narzędziu ping i nie możemy wysłać pinga bezpośrednio do nazwy hosta ot-host.local (możemy wysłać ping do nazwy hosta z wersją aplikacji na iOS).

Ping z hosta Linux/macOS

Router granic wątków wysyła reklamy routerów ICMPv6 (RA) w celu rozgłaszania prefiksów (za pomocą opcji informacji o prefiksie) i tras (za pomocą opcji informacji o trasie) w połączeniu Wi-Fi/Ethernet.

Przygotowywanie hosta z Linuksa

Ważne jest, aby upewnić się, że na hoście są włączone operacje RA i RIO:

  1. Wartość net.ipv6.conf.wlan0.accept_ra powinna wynosić co najmniej 1, jeśli przekierowanie adresu IP nie jest włączone, lub 2, jeśli nie jest włączone.
  2. Wartość net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen nie może być mniejsza niż 64.

W większości dystrybucji accept_ra jest domyślnie ustawiony na 1. Mogą jednak istnieć inne demony sieciowe, które zastąpią tę opcję (np. dhcpcd w Raspberry Pi zastąpi accept_ra na 0). Wartość accept_ra możesz sprawdzić za pomocą:

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

Ustaw wartość 1 (lub 2, jeśli włączone jest przekierowanie IP) za pomocą:

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

Domyślna opcja accept_ra_rt_info_max_plen w większości dystrybucji Linuksa to 0. Ustaw ją na 64 za pomocą tych ustawień:

$ 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

Po ponownym uruchomieniu hosta zmiana zostanie utracona. Na przykład dołącz poniższe polecenia do /etc/sysctl.conf, aby na stałe włączyć RIO:

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

Może być już za późno na zmianę tych konfiguracji, ponieważ OTBR wysyła już wiadomości RA, a odstęp między 2 niechcianymi wiadomościami RA może wynosić kilkaset sekund. Jednym ze sposobów jest odłączenie się od punktu dostępu Wi-Fi i ponowne połączenie się z nim w celu wysyłania wiadomości dotyczących pozyskiwania routera, dzięki czemu OTBR będzie odpowiadać za pomocą zamówionych kont RA. Inną możliwością jest ponowne uruchomienie funkcji Border Routing na routerze Border Router:

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

Jeśli próbujesz ponownie połączyć się z siecią Wi-Fi lub ponownie uruchomić interfejs Ethernet, upewnij się, że parametr dhcpcd nie jest używany do zarządzania siecią IPv6 Wi-Fi/Ethernet. Ponieważ parametr dhcpcd zawsze zastępuje opcję accept_ra po każdym ponownym uruchomieniu interfejsu, co powoduje utratę konfiguracji accept_ra. Dołącz poniższe wiersze do pliku konfiguracji dhcpcd (np. /etc/dhcpcd.conf), aby jednoznacznie wyłączyć IPv6 w dhcpcd:

noipv6
noipv6rs

Aby zmiana zaczęła obowiązywać, musisz zrestartować urządzenie.

Przygotowywanie hosta macOS

Obie opcje accept_ra* są domyślnie włączone, ale musisz uaktualnić system do wersji co najmniej macOS Big Sur.

Pingowanie nazwy hosta lub adresu IPv6

Możemy teraz wysłać ping do nazwy hosta ot-host.local za pomocą polecenia ping -6 (ping6 w systemie macOS):

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

To polecenie może zakończyć się niepowodzeniem na hostach z systemem Linux z powodu błędu "Name or service not known". Dzieje się tak, ponieważ polecenie ping nie rozpoznaje nazwy ot-host.local. za pomocą zapytań mDNS. Otwórz plik /etc/nsswitch.conf i dodaj mdns6_minimal do wiersza, zaczynając od hosts:

hosts:          files mdns4_minimal mdns6_minimal dns

Oczywiście możesz też zawsze wysłać ping bezpośrednio do adresu IPv6:

$ 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. Cofanie publikacji usługi na urządzeniu końcowym

Aby usunąć adres i usługę zarejestrowane w węźle klienta SRP:

> srp client host remove
Done

Odkrywanie usługi _ipps._tcp nie powinno być teraz możliwe.

9. Gratulacje

Gratulacje! Udało Ci się skonfigurować OTBR jako router granic wątków, który zapewnia dwukierunkową łączność IP i wykrywanie usług na urządzeniach końcowych Thread.

Co dalej?

Zapoznaj się z tymi ćwiczeniami z programowania...

Dokumentacja