Router wątku – dwukierunkowa łączność IPv6 i wykrywanie usług opartych na DNS

1. Wstęp

699d673d05a55535.png

Co to jest router graniczny nici?

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

Router wątkiu łączy sieć wątków z innymi sieciami IP, takimi jak Wi-Fi lub Ethernet. Sieć wątków wymaga routera granicznego do łączenia się z innymi sieciami. Router wątkiu obsługuje w minimalnie te funkcje:

  • Dwukierunkowe połączenie IP między wątkami a sieciami Wi-Fi/Ethernet.
  • Dwukierunkowe wykrywanie usług przez mDNS (przez Wi-Fi/Ethernet) oraz SRP (w sieci wątków).
  • Infrastruktura Thread-over, która łączy partycje wątków za pomocą linków opartych na adresach IP.
  • Zewnętrzna realizacja wątków (na przykład telefon komórkowy) w celu uwierzytelnienia i dołączenia urządzenia z wątkami do sieci wątków.

OpenThread Border Router (OTBR) udostępniony przez Google to implementacja open source routera Thread Border Router.

Co utworzysz

W tym ćwiczeniu z programowania skonfigurujesz router graniczny <br> i połączysz swój telefon komórkowy z urządzeniem końcowym granicznym.

Czego się dowiesz

  • Jak skonfigurować OTBR
  • Jak utworzyć sieć wątków z otBR
  • Jak utworzyć urządzenie wiersza poleceń OpenThread z funkcją SRP
  • Jak zarejestrować usługę w SRP
  • Jak wykryć i dołączyć urządzenie końcowe Thread.

Niezbędne elementy

  • Urządzenie Raspberry Pi 3/4 i karta SD o pojemności co najmniej 8 GB.
  • 2 płyty deweloperskie w północnej części półprzewodnika nRF52840.
  • Punkt dostępu Wi-Fi bez włączonego ochrony przed reklamami w routerze IPv6 na routerze.
  • Telefon z systemem iOS 14 lub nowszym albo Androidem z Androidem 8.1.

2. Konfiguracja OTBR

Konfiguracja malin

Wystarczy, że skonfigurujesz nowe urządzenie Raspberry Pi za pomocą narzędzia rpi-imager, postępując zgodnie z instrukcjami na stronie raspberrypi.org (zamiast korzystać z najnowszego systemu Raspberry Pi w narzędziu, pobierz ) 2021-05-07-raspios-buster-armhf-lite Aby wykonać czynności z telefonu komórkowego w ramach tych ćwiczeń z programowania, musisz połączyć urządzenie Raspberry Pi z punktem dostępu Wi-Fi. Aby skonfigurować łączność bezprzewodową, postępuj zgodnie z tym przewodnikiem. Do logowania się w Raspberry Pi za pomocą SSH możesz wygodnie wykonać instrukcje tutaj.

Uzyskiwanie kodu OTBR

Zaloguj się na 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 graniczny:

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

OTBR działa zarówno w interfejsie Thread, jak i w interfejsie infrastruktury infrastruktury (np. Wi-Fi/Ethernet) określonym w INFRA_IF_NAME. Interfejs Thread (tekst) jest tworzony domyślnie przez OTBR i domyślnie nazywa się wpan0, a interfejs infrastruktury ma domyślną wartość wlan0, jeśli INFRA_IF_NAME nie został wyraźnie określony. Jeśli Raspberry Pi jest podłączony za pomocą kabla 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 jest nieaktywna, ponieważ do uruchomienia potrzebne jest układ RCP.

Uruchom ponownie Raspberry Pi, by zastosować zmiany.

Tworzenie oprogramowania Flash i RCP

OTBR obsługuje układ radiowy 15.4 w trybie Radio Co-processor (RCP). W tym trybie stos OpenOpen jest uruchamiany po stronie hosta, a następnie przesyła/odbiera ramki przez odbiornik IEEE 802.15.4.

Obserwujkrok 4 zUtwórz sieć wątków z płytami nRF52840 i OpenThread ćwiczenia z programowania do utworzenia i wykorzystania urządzenia RCP nRF52840:

$ script/build nrf52840 USB_trans

Uruchom OTBR i sprawdź stan

Podłącz tablicę 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 wątków

Do polecenia usługi 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 wątków z 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

Po kilku sekundach powinno być widać, że strumień OTBR działa jako wątek leader, a w danych wątków sieci jest 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 uruchamianie Flasha LI CLI

Aby utworzyć i zamknąć urządzenie końcowe interfejsu nRF52840, wykonaj krok 5 instrukcji Przygotowywanie sieci wątków z płytkami nRF52840 i OpenThread.

Jednak zamiast OT_COMMISSIONER i OT_JOINER węzeł CLI 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

Połącz z siecią OTBR

Aby połączyć się z siecią wątków utworzoną przez usługę otbr-agent, musimy pobrać aktywny zbiór danych operacyjnych z urządzenia OTBR. Wróćmy do wiersza poleceń otbr-agent i pobierz aktywny zbiór danych:

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

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

> dataset set active 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff
Done

Następnie uruchom interfejs wątku:

> ifconfig up
Done
> thread start
Done

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

> 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 są zgodne z tymi podanymi w OTBR. Możemy teraz pingować adres OMBR 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 link-local. Wiadomości multicastingu pochłaniają zbyt dużo przepustowości i wyczerpują baterię szybko w przypadku urządzeń o niskiej mocy. Do rejestracji usług za pomocą routera Border Router usługa Thread wykorzystuje SRP, korzystając z protokołu Border Router, aby reklamować usługi przez połączenie Wi-Fi lub Ethernet.

Możemy zarejestrować usługę przy użyciu polecenia srp client.

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

> srp client autostart enable
Done

Ustaw nazwę hosta, która będzie reklamowana za pomocą linku Wi-Fi/Ethernet:

> srp client host name ot-host
Done

Aby urządzenie mogło połączyć się z siecią Wi-Fi/Ethernet przez urządzenie końcowe z wątkiem:

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

Na końcu zarejestruj fałszywą usługę _ipps._tcp:

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

Poczekaj kilka sekund, a usługa powinna być widoczna:

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

Ukończono konfigurację. Usługa _ipps._tcp powinna być reklamowana za pomocą połączenia Wi-Fi i Ethernet. Czas odkryć i dotrzeć do urządzenia końcowego.

6. Poznaj usługę

Odkrywanie usługi za pomocą telefonu komórkowego

54a136a8940897cc

Używamy aplikacji Service Browser do wykrywania usług mDNS na telefonie z Androidem, a odpowiedniki w przypadku urządzeń mobilnych z iOS. Otwórz aplikację, a usługa _ipps._tcp powinna się wyświetlić.

Odkrywanie usługi na hoście w systemie Linux

Jeśli chcesz wykryć usługę w innym hostze systemu Linux, możesz użyć polecenia avahi-browse.

Zainstaluj avahi-daemon i avahi-utils:

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

Zakończ 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 = []
...

Odkrywanie usługi na hoście macOS

Użyj dns-sd w systemie macOS, aby rozwiązać problem z usługą:

$ 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. Uruchom dzwonek na urządzeniu końcowym

Pingowanie z telefonu komórkowego

Weźmy za przykład telefon Pixel. Adres OMR zarejestrowanej wcześniej usługi „ot-service” możemy znaleźć na stronie z informacjami o instancji usługi w aplikacji Service Browser.

bb992962e68d250b.png 888daa1df1e1a9bf.png

Możemy teraz sprawdzić adres OMR za pomocą innej aplikacji Analizator sieci.

Wersja Androida Analizatora aplikacji na Androida nie obsługuje zapytań mDNS dla narzędzia ping i nie możemy bezpośrednio wykonać polecenia ping dla nazwy hosta ot-host.local (możemy sprawdzić polecenie ping w przypadku nazwy hosta w wersji aplikacji na iOS).

Pingowanie z hosta w systemie Linux/macOS

Router nici wysyła reklamy RAMP 6 (ICMPv6) do reklamowania prefiksów (za pomocą opcji informacji o prefiksach) oraz tras (za pomocą opcji informacji o trasie) przez sieć Wi-Fi/Ethernet.

Przygotowywanie hosta Linux

Ważne jest, by włączyć RA i RIO na hoście:

  1. Wartość net.ipv6.conf.wlan0.accept_ra powinna wynosić co najmniej 1, jeśli przekierowanie IP jest wyłączone, lub 2.
  2. Parametr net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen nie powinien być mniejszy niż 64.

W przypadku większości dystrybucji accept_ra ma domyślną wartość 1. Jednak mogą istnieć inne demony sieciowe, które zastąpią tę opcję (na przykład dhcpcd w Raspberry Pi zastąpi accept_ra z 0). Wartość accept_ra możesz sprawdzić przy użyciu:

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

Ustaw wartość 1 (lub 2 w przypadku włączenia przekierowania IP) przy użyciu:

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

W przypadku większości dystrybucji Linuksa opcja accept_ra_rt_info_max_plen jest domyślnie ustawiona na 0. Ustaw wartość 64 na:

$ 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 dodaj poniższe polecenia do /etc/sysctl.conf, aby trwale włączyć RIO:

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

Być może jest już za późno, aby zmienić te konfiguracje, ponieważ strumień OTBR wysłał już wiadomości RA i odstęp czasu między dwoma niechcianymi wiadomościami RA może wynosić kilkaset sekund. Jednym z rozwiązań jest odłączenie i ponowne połączenie z punktem dostępu Wi-Fi w celu wysyłania wiadomości z prośbą o zachęcenie do korzystania z routera. Dzięki temu OTBR odpowie na żądanie RA. Inną opcją jest ponowne uruchomienie funkcji Border Routing:

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

Jeśli próbujesz połączyć się z siecią Wi-Fi lub uruchomić ponownie interfejs Ethernet, upewnij się, że interfejs dhcpcd nie jest używany do zarządzania siecią IPv6 i Ethernet IPv6. Ponieważ dhcpcd zawsze zastępuje opcję accept_ra za każdym razem, gdy interfejs jest uruchamiany ponownie, utracisz konfigurację accept_ra. Dołącz następujące wiersze do pliku konfiguracji dhcpcd (np. /etc/dhcpcd.conf), by wyraźnie wyłączyć IPv6 w dhcpcd:

noipv6
noipv6rs

Aby zastosować zmianę, musisz uruchomić aplikację ponownie.

Przygotowywanie hosta macOS

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

Pingowanie nazwy hosta lub adresu IPv6

Polecenie ping dociera 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
...

W przypadku hostów z systemem Linux to polecenie może kończyć się niepowodzeniem i pojawia się błąd "Name or service not known". Dzieje się tak, ponieważ polecenie ping nie rozpoznaje nazwy ot-host.local. w zapytaniach 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 sprawdzić adres IPv6 bezpośrednio w pingu:

$ 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. Zakończ publikację usługi na urządzeniu

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

> srp client host remove
Done

Czynności do wykonania:nie może znaleźć_ipps._tcp.

9. Gratulacje

Gratulacje! Udało Ci się skonfigurować OTBR jako router graniczny wątki, aby zapewnić dwukierunkowe połączenie IP i wykrywanie usług dla urządzeń końcowych Thread.

Co dalej?

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

Dokumentacja referencyjna