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

Informacje o tym ćwiczeniu (w Codelabs)
schedule22 minuty
subjectOstatnia aktualizacja: 23 maja 2025
account_circleAutorzy: Kangping Dong, Jonathan Hui

1. Wprowadzenie

699d673d05a55535.png

Czym jest Thread?

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

Co to jest OpenThread?

OpenThread udostępniony przez Google to implementacja Thread® typu open source.

Co to jest router graniczny Thread?

Router brzegowy Thread łączy sieć Thread z innymi sieciami opartymi na protokole IP, takimi jak Wi-Fi czy Ethernet. Sieć Thread wymaga routera granicznego do łączenia się z innymi sieciami. Router graniczny Thread obsługuje co najmniej te funkcje:

  • Dwukierunkowe połączenie IP między sieciami Thread i Wi-Fi/Ethernet.
  • Wykrywanie usług w obu kierunkach za pomocą mDNS (w ramach połączenia Wi-Fi/Ethernet) i SRP (w ramach sieci Thread).
  • Infrastruktura Thread, która łączy partycje Thread za pomocą połączeń opartych na protokole IP.
  • Zewnętrzny system autoryzacji Thread (np. telefon komórkowy) do uwierzytelniania i łączenia urządzenia Thread z siecią Thread.

OpenThread Border Router (OTBR) opublikowany przez Google to implementacja routera granicznego Thread w wersji open source.

Co utworzysz

W tym ćwiczeniu skonfigurujesz router graniczny Thread i połączysz telefon komórkowy z urządzeniem końcowym Thread za pomocą routera granicznego.

Czego się nauczysz

  • Jak skonfigurować OTBR
  • Tworzenie sieci Thread za pomocą urządzenia OTBR
  • Jak utworzyć urządzenie OpenThread CLI z funkcją SRP
  • Jak zarejestrować usługę w SRP
  • Jak wykryć i dostępować do urządzenia końcowego Thread

Czego potrzebujesz

  • stacja robocza z systemem Linux do kompilowania i programowania układów scalonych Thread RCP, interfejsu wiersza poleceń OpenThread oraz testowania multicastu IPv6.
  • Raspberry Pi do routera granicznego Thread.
  • 2 dongle USB nRF52840 firmy Nordic Semiconductor (jeden do RCP, a drugi do urządzenia końcowego Thread).
  • telefon z iOS 14 lub nowszym albo Androidem 8.1 lub nowszym;

2. Konfigurowanie usługi OTBR

Najszybszym sposobem skonfigurowania usługi OTBR jest skorzystanie z przewodnika po konfiguracji usługi OTBR.

Po zakończeniu konfigurowania usługi OTBR użyj polecenia ot-ctl, aby sprawdzić, czy usługa działa jako wątek leader.

$ sudo ot-ctl state
leader
Done

Sprawdź też, czy OTBR automatycznie skonfigurował prefiks off-mesh-routable (OMR) w danych sieci Thread.

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

Tworzenie i flashowanie za pomocą interfejsu wiersza poleceń OT

Aby skompilować i sflashować urządzenie końcowe z interfejsem CLI nRF52840, wykonaj krok 5 w codelab Tworzenie sieci Thread z kartami nRF52840 i OpenThread.

Zamiast funkcji OT_COMMISSIONEROT_JOINER węzeł interfejsu wiersza poleceń wymaga funkcji OT_SRP_CLIENTOT_ECDSA.

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

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

Dołączanie do sieci Thread

Aby dołączyć do sieci Thread, musimy pobrać zbiór danych Active Operational Dataset z urządzenia OTBR. Wróćmy do ot-ctl i pobierzmy aktywny zbiór danych:

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

Wróć do sesji ekranu 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

Odczekaj kilka sekund i sprawdź, czy udało Ci 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

Sprawdź, czy dane sieciowe są zgodne z tymi wydrukowanymi na certyfikacie OTBR. Możemy teraz pingować adres OMR w 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

4. Publikowanie usługi na urządzeniu końcowym

mDNS jest szeroko używany do publikowania usługi DNS-SD w ramach link-local. Jednak wiadomości multicast zużywają zbyt dużo przepustowości i szybko wyczerpują baterię w przypadku urządzeń o niskim poborze mocy. Thread używa protokołu unicast SRP do rejestrowania usług w Border Routerze i korzysta z Border Routera do rozgłaszania usług w sieci 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 reklamowana w połączeniu Wi-Fi/Ethernet:

> srp client host name ot-host
Done

Aby urządzenie z połączeniem Wi-Fi/Ethernet mogło się połączyć z urządzeniem końcowym Thread, adres OMR tego urządzenia końcowego musi być reklamowany:

> 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

Poczekaj kilka sekund. Powinniśmy zobaczyć zarejestrowaną usługę:

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

Zakończyliśmy konfigurowanie i usługa _ipps._tcp powinna być reklamowana w ramach połączenia Wi-Fi/Ethernet. Czas wykryć urządzenie końcowe i nawiązać z nim połączenie.

5. Poznawanie usługi

Poznaj usługę na telefonie

54a136a8940897cc.png

Używamy aplikacji Service Browser do wykrywania usług mDNS na telefonie z Androidem. Odpowiednią aplikację można też znaleźć na urządzeniach mobilnych z iOS. Otwórz aplikację, a usługa _ipps._tcp powinna się wyświetlić.

Odkrywanie usługi z hostem Linux

Jeśli chcesz wykryć usługę z innego hosta Linuksa, możesz użyć polecenia avahi-browse.

Zainstaluj aplikacje avahi-daemon i avahi-utils:

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

Rozwiązywanie problemu 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 = []
...

Poznaj usługę z hostem macOS

Aby rozwiązać problem z usługą, 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     ""
...

6. Pingowanie urządzenia końcowego

Pingowanie z telefonu komórkowego

Na przykład w przypadku telefonu Pixel adres OMR wcześniej zarejestrowanej usługi „ot-service” można znaleźć na stronie z informacjami o jej wystąpieniu w aplikacji przeglądarki usług.

bb992962e68d250b.png 888daa1df1e1a9bf.png

Teraz możemy pingować adres OMR za pomocą innej aplikacji Network Analyzer.

Wersja aplikacji Network Analyzer na Androida nie obsługuje zapytań mDNS dla narzędzia ping i nie możemy bezpośrednio pingować nazwy hosta ot-host.local (możemy pingować nazwę hosta za pomocą wersji aplikacji na iOS).

Pingowanie z hosta Linux/macOS

Router graniczny Thread wysyła zapytania o router ICMPv6 (RA), aby reklamować prefiksy (za pomocą opcji informacji o prefiksie) i trasy (za pomocą opcji informacji o trasie) na łączu Wi-Fi/Ethernet.

Przygotowanie hosta Linuksa

Upewnij się, że u Twojego dostawcy hostingu włączone są RA i RIO:

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

w przypadku większości dystrybucji wartość accept_ra domyślnie wynosi 1. Mogą jednak występować inne demony sieciowe, które zastąpią tę opcję (na przykład dhcpcd na Raspberry Pi zastąpi accept_ra wartością 0). Wartość accept_ra możesz sprawdzić za pomocą:

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

Ustaw wartość na 1 (lub 2, jeśli przekierowywanie adresu IP jest włączone) z:

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

Większość dystrybucji Linuksa ma domyślnie ustawioną opcję accept_ra_rt_info_max_plen na 0. Ustaw ją na 64:

$ 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. Aby na stałe włączyć RIO, dodaj te polecenia do pliku /etc/sysctl.conf:

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

Może być za późno na zmianę tych konfiguracji, ponieważ serwer OTBR wysyła już wiadomości RA, a odstęp między dwoma 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 z nim, aby wysłać wiadomości z prośbą o router, dzięki czemu OTBR odpowie prośbami o router. Inną opcją jest ponowne uruchomienie funkcji Border Routing na routerze Border:

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

Jeśli próbujesz ponownie połączyć się z Wi-Fi lub ponownie uruchomić interfejs Ethernet, upewnij się, że dhcpcd nie jest używany do zarządzania siecią IPv6 Wi-Fi/Ethernet. Ponieważ dhcpcd zawsze zastępuje opcję accept_ra za każdym razem, gdy interfejs jest restartowany, konfiguracja accept_ra zostanie utracona. Aby w pliku konfiguracji dhcpcd (np. /etc/dhcpcd.conf) wyraźnie wyłączyć IPv6 w dhcpcd, dodaj te wiersze:

noipv6
noipv6rs

Aby zmiany zaczęły obowiązywać, musisz ponownie uruchomić urządzenie.

Przygotuj hosta macOS

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

Użyj polecenia ping do sprawdzenia nazwy hosta lub adresu IPv6.

Teraz możemy pingować nazwę 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 się nie udać na hostach z Linuksem 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 /etc/nsswitch.conf i dodaj mdns6_minimal do wiersza zaczynającego się od hosts:

hosts:          files mdns4_minimal mdns6_minimal dns

Oczywiście zawsze możesz bezpośrednio pingować adres 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
...

7. Koniec publikacji usługi na urządzeniu

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

> srp client host remove
Done

Usługa _ipps._tcp nie powinna być widoczna.

8. Gratulacje

Gratulacje! Udało Ci się skonfigurować OTBR jako router graniczny Thread, aby zapewnić dwukierunkową łączność IP i wykrywanie usług dla urządzeń końcowych Thread.

Co dalej?

Zapoznaj się z tymi ćwiczeniami z programowania…

Dokumenty referencyjne