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

1. Wprowadzenie

699 d673d05a55535

Co to jest router graniczny wątków?

Thread to oparty na adresie IP protokół sieci bezprzewodowej sieci o niskiej mocy, który umożliwia bezpieczną komunikację między urządzeniami i między urządzeniami. Sieci wątków mogą dostosowywać się do zmian w topologii, aby uniknąć pojedynczego punktu awarii.

Router graniczny Thread łączy sieć Thread z innymi sieciami IP, takimi jak Wi-Fi czy Ethernet. Sieć typu Thread wymaga routera granicy, by połączyć się z innymi sieciami. Router granicy wątków obsługuje tylko te funkcje:

  • Dwukierunkowa łączność IP między sieciami Thread, Wi-Fi i Ethernet.
  • Dwukierunkowe wykrywanie usług przez mDNS (przez połączenie Wi-Fi i Ethernet) oraz SRP (w sieci Thread).
  • Infrastruktura typu Thread-over, która scala partycje wątków przez linki oparte na adresach IP.
  • Zewnętrzna prowizje (np. telefon komórkowy) do uwierzytelniania urządzeń z wątkami i łączenia ich z siecią Thread.

OTBR to opracowany przez Google program typu open source związany z routerem granicznym.

Co utworzysz

Dzięki nim dowiesz się, jak skonfigurować router granicy wątków i połączyć telefon komórkowy z tym urządzeniem za pomocą routera granicznego.

Czego się nauczysz

  • Jak skonfigurować OTBR
  • Jak utworzyć sieć wątków przy użyciu OTBR
  • Jak utworzyć urządzenie wiersza poleceń OpenThread za pomocą funkcji SRP
  • Jak zarejestrować usługę przy użyciu SRP
  • Jak znaleźć urządzenie Thread i uzyskać do niego dostęp.

Czego potrzebujesz

  • Urządzenie Raspberry Pi 3/4 i karta SD z co najmniej 8 GB pamięci.
  • 2 płyty deweloperskie Nordic półprzewodnik, nRF52840
  • Punkt dostępu Wi-Fi bez włączonego routera IPv6 IPv6 na routerze.
  • telefon z iOS w wersji co najmniej 14 lub z Androidem 8.1 lub nowszym;

2. Skonfiguruj OTBR

Skonfiguruj Raspberry Pi

Aby w prosty sposób skonfigurować nowe urządzenie Raspberry Pi za pomocą narzędzia rpi-imager, wystarczy postępować zgodnie z instrukcjami na stronie raspberrypi.org (zamiast najnowszego narzędzia Raspberry Pi OS pobrać je 2021-05-07-raspios-buster-armhf-lite). Aby ukończyć ten moduł ćwiczeń, musisz połączyć Raspberry Pi z punktem dostępu Wi-Fi. Aby skonfigurować połączenia bezprzewodowe, postępuj zgodnie z tym przewodnikiem. Możesz zalogować się w aplikacji Raspberry Pi za pomocą SSH. 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

Przygotowywanie i instalowanie OTBR

Dokument OTBR zawiera 2 skrypty, które uruchamiają i konfigurują router granicy wątków:

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

OTBR działa zarówno w interfejsie wątków, jak i interfejsach infrastruktury (np. Wi-Fi/Ethernet), które są określone za pomocą INFRA_IF_NAME. Interfejs Thread jest tworzony przez OTBR i domyślnie nosi nazwę wpan0, a interfejs infrastruktury ma domyślną wartość wlan0, jeśli nie określono jednoznacznie INFRA_IF_NAME. Jeśli Twoje urządzenie Raspberry Pi jest połączone kablem Ethernet, podaj nazwę interfejsu Ethernet (np. eth0):

$ INFRA_IF_NAME=eth0 ./script/setup

Sprawdź, czy pakiet 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 może być nieaktywna, ponieważ do jej działania potrzebny jest element RCP.

Uruchom ponownie Raspberry Pi, aby wprowadzić zmiany.

Skompiluj i zainstaluj oprogramowanie RCP

Procesor OTBR obsługuje procesor radiowy 15.4 w trybie procesora radiowego (RCP). W tym trybie stos OpenThread działa po stronie hosta i wysyła/odbiera ramki przez odbiornik IEEE802.15.4.

Wykonaj krok 4 modułu Build a Thread Thread with nRF52840 boards and OpenThread, aby utworzyć i uruchomić urządzenie RCP nRF52840:

$ script/build nrf52840 USB_trans

Uruchom OTBR i zweryfikuj stan

Podłącz tablicę nRF52840 do urządzenia 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 typu Thread

Dostępne jest polecenie ot-ctl, które umożliwia kontrolowanie usługi otbr-agent. ot-ctl akceptuje wszystkie polecenia interfejsu wiersza poleceń OpenThread. Więcej informacji znajdziesz w przewodniku po interfejsie wiersza poleceń OpenThread.

Utwórz sieć wątków 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. Zyskasz możliwość, że OTBR będzie działać jako wątek leader i będzie zawierać prefiks off-mesh-routable (OMR) w danych sieci dotyczących wątków:

$ 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

Utwórz i uruchom OT CLI

Wykonaj krok 5 modułu Build a Thread Thread with nRF52840 boards and OpenThread, aby utworzyć i uruchomić urządzenie końcowe LIRF52840 CLI.

Jednak zamiast uwzględniać interfejsy OT_COMMISSIONER i OT_JOINER, węzeł 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 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 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 dotyczące sieci są zgodne z danymi wydrukowanymi na urządzeniu OTBR. Teraz możemy wysłać ping do adresu OMR użytkownika 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

Usługa mDNS jest szeroko używana do publikowania usługi DNS-SD na stronie link-local. Wiadomości multicast powodują jednak nadmierne wykorzystanie przepustowości i zużycie baterii w przypadku urządzeń o niskim zużyciu energii. Thread używa protokołu SRP jednostronnego do rejestrowania usług za pomocą routera granicznego. Aby promować usługi przez Wi-Fi lub Ethernet, korzysta z routera granicznego.

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

Przejdź do sesji 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 z połączeniem Wi-Fi/Ethernet dotarło do takiego urządzenia, musi być reklamowany adres OMR urządzenia końcowego:

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

Na końcu zarejestruj fałszywe usługi _ipps._tcp:

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

Zaczekaj kilka sekund. Usługa powinna być widoczna w usłudze:

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

Dokonamy wszystkich konfiguracji i usługa _ipps._tcp powinna być już reklamowana za pomocą linku Wi-Fi/Ethernet. Czas odkryć urządzenie.

6. Poznaj usługę

Poznawanie usługi przez telefon komórkowy

54a136a8940897cc.png

Do wyszukiwania usług mDNS na telefonie z Androidem używamy aplikacji Service Browser, a na urządzeniach mobilnych z iOS odpowiada to im aplikacja. Otwórz aplikację – usługa _ipps._tcp powinna właśnie się wyświetlić.

Wykrywanie usługi za pomocą hosta Linuksa

Jeśli chcesz znaleźć usługę od innego hosta Linuksa, 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 = []
...

Odkrywanie usługi na hoście 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

Weźmy na przykład telefon Pixel – możemy znaleźć adres OMR zarejestrowanej wcześniej usługi „ot-service” na stronie z informacjami o instancji usługi w aplikacji przeglądarki.

bb992962e68d250b 888daa1df1e1a9bf.png

Teraz możemy wysłać ping do adresu OMR za pomocą innej aplikacji Analizator sieci.

Wersja aplikacji Analizator sieci na Androida nie obsługuje zapytań mDNS w narzędziu ping, a my nie możemy bezpośrednio wysłać polecenia ping do nazwy hosta ot-host.local (możemy wysłać ping do nazwy hosta w wersji aplikacji na iOS).

Pingowanie z hosta systemu Linux/macOS

Router routera Threadwiadomości wysyła reklamy routera ICMPv6 (RA) do reklamowania prefiksów (za pomocą opcji Prefiks informacji) i tras (przy użyciu opcji Informacje o trasie) w połączeniu Wi-Fi/Ethernet.

Przygotowywanie hosta Linuksa

Upewnij się, że RA i RIO są włączone na hoście:

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

W przypadku większości rozkładów accept_ra ma domyślną wartość 1. Mogą jednak istnieć inne demony sieci, które zastąpią tę opcję (na przykład dhcpcd na Raspberry Pi zastąpi wartość accept_ra na 0). Wartość accept_ra można sprawdzić za pomocą:

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

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

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

Opcja accept_ra_rt_info_max_plen w większości dystrybucji systemu Linux jest ustawiona domyślnie na 0, a następnie ustaw na 64 za pomocą:

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

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

Może być za późno, aby zmienić te konfiguracje, ponieważ funkcja 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 rozłączenie i ponowne połączenie się z punktem dostępu Wi-Fi w celu wysyłania wiadomości dotyczących routera w celu umożliwienia odpowiadania przez OTBR na żądania RA. Możesz też ponownie uruchomić funkcję wyznaczania granic na routerze granicznym:

$ 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 do zarządzania siecią IPv6/Ethernet nie jest używany protokół dhcpcd. dhcpcd zawsze zastępuje opcję accept_ra przy każdym ponownym uruchomieniu interfejsu, przez co konfiguracja accept_ra zostanie utracona. Dołącz poniższe wiersze do pliku konfiguracji dhcpcd (np. /etc/dhcpcd.conf), aby wyraźnie wyłączyć IPv6 w dhcpcd:

noipv6
noipv6rs

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

Przygotowywanie hosta macOS

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

pingowanie nazwy hosta lub adresu IPv6,

Teraz możemy 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 nie działać na hoście Linuksa z błędem "Name or service not known". Dzieje się tak, ponieważ polecenie ping nie rozpoznaje nazwy ot-host.local. w zapytaniach mDNS. Otwórz plik /etc/nsswitch.conf i dodaj do wiersza mdns6_minimal wiersz zaczynający się od hosts:

hosts:          files mdns4_minimal mdns6_minimal dns

Oczywiście adres IPv6 możesz zawsze wysłać pingiem:

$ 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

Usługa niepowinna być teraz widoczna_ipps._tcp.

9. Gratulacje

Gratulujemy! Udało Ci się skonfigurować OTBR jako router granicy Thread, aby umożliwiać dwukierunkową łączność IP i wykrywanie usług dla urządzeń końcowych Thread.

Co dalej?

Sprawdź niektóre z tych ćwiczeń...

Dokumentacja