Router Border Border - Connettività IPv6 bidirezionale e rilevamento di servizi basato su DNS

1. Introduzione

699d673d05a55535.png

Cos'è un router di confine Thread?

Thread è un protocollo di rete mesh wireless a basso consumo basato su IP che consente comunicazioni protette da dispositivo a dispositivo e da dispositivo a cloud. Le reti di thread possono adattarsi alle modifiche della topologia per evitare un singolo punto di errore.

Un router di confine Thread collega una rete Thread a altre reti basate su IP, come il Wi-Fi o Ethernet. Una rete Thread richiede un router di confine per connettersi ad altre reti. Un router di confine thread supporta almeno in parte le seguenti funzioni:

  • Connettività IP bidirezionale tra reti Thread e Wi-Fi/Ethernet.
  • Service Discovery bidirezionale tramite mDNS (su link Wi-Fi/Ethernet) e SRP (su rete Thread).
  • Infrastruttura di thread over che unisce le partizioni di thread su link basati su IP.
  • Messa in servizio esterna di thread (ad esempio, un telefono cellulare) per l'autenticazione e l'unione di un dispositivo Thread a una rete Thread.

Il OpenBR Border Router (OTBR) rilasciato da Google è un'implementazione open source del router Thread Border.

Che cosa creerai

In questo codelab, configurerai un router di confine Thread e collegherai il tuo telefono cellulare a un dispositivo Thread End tramite il router di confine.

Cosa scoprirai

  • Come configurare OTBR
  • Come creare una rete Thread con OTBR
  • Creare un'interfaccia a riga di comando OpenThread con la funzionalità SRP
  • Come registrare un servizio con SRP
  • Come trovare e raggiungere un dispositivo finale Thread.

Che cosa ti serve

  • Un dispositivo Raspberry Pi 3/4 e una scheda SD con capacità di almeno 8 GB.
  • 2 schede di sviluppo nRF52840 per i nordici Semiconductor.
  • Un punto di accesso Wi-Fi senza IPv6 Router Advertisement Guard abilitato sul router.
  • Un telefono iOS con almeno iOS 14 o telefono Android con almeno Android 8.1.

2. Configura OTBR

Configura Raspberry Pi

È facile configurare un nuovo dispositivo Raspberry Pi con lo strumento rpi-imager seguendo le istruzioni disponibili all'indirizzo raspberrypi.org. Anziché utilizzare il sistema operativo Raspberry Pi più recente nello strumento, scarica 2021-05-07-raspios-buster-armhf-lite autonomamente). Per completare la procedura per il cellulare in questo codelab, devi collegare Raspberry Pi a un punto di accesso Wi-Fi. Segui questa guida per configurare la connettività wireless. È utile accedere a Raspberry Pi con SSH, puoi trovare le istruzioni qui.

Recupera codice OTBR

Accedi a Raspberry Pi e clona ot-br-posix da GitHub:

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

Creazione e installazione di OTBR

OTBR ha due script che eseguono il bootstrap e la configurazione del router di confine del thread:

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

OTBR funziona sia su un'interfaccia di Thread sia su un'interfaccia di rete dell'infrastruttura (ad esempio Wi-Fi/Ethernet) specificata con INFRA_IF_NAME. L'interfaccia di Thread viene creata dallo stesso OTBR e per impostazione predefinita viene denominata wpan0 e l'interfaccia dell'infrastruttura ha un valore predefinito di wlan0 se INFRA_IF_NAME non è esplicitamente specificato. Se Raspberry Pi è collegato tramite cavo Ethernet, specifica il nome dell'interfaccia Ethernet (ad es. eth0):

$ INFRA_IF_NAME=eth0 ./script/setup

Controlla se OTBR è stato installato correttamente:

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

È previsto che il servizio otbr-agent non sia attivo perché richiede l'esecuzione di un chip RCP.

Riavvia Raspberry Pi per applicare le modifiche.

Firmware RCP per build e flash

OTBR supporta un chip radio 15.4 in modalità Radio Co-Processor (RCP). In questa modalità, lo stack OpenThread è in esecuzione sul lato host e trasmette/riceve frame sul ricetrasmettitore IEEE802.15.4.

Segui il passaggio 4 della sezione Build a Thread network with nRF52840 boards and OpenThread codelab per creare e implementare un dispositivo RCP nRF52840:

$ script/build nrf52840 USB_trans

Avvia OTBR e verifica lo stato

Collega la scheda nRF52840 a Raspberry Pi e avvia il servizio otbr-agent:

$ sudo service otbr-agent restart

Verifica che il servizio otbr-agent sia attivo:

$ 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. Forma una rete Thread

Esiste un comando ot-ctl che può essere usato per controllare il servizio otbr-agent. ot-ctl accetta tutti i comandi dell'interfaccia a riga di comando di OpenThread, consulta la Guida dell'interfaccia a riga di comando di OpenThread per ulteriori dettagli.

Creare una rete Thread con 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

Attendi qualche secondo, dovresti vedere che OTBR funge da thread leader e ha il prefisso off-mesh-routable (OMR) nei dati della rete di thread:

$ 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. Configura dispositivo finale client SRP

Interfaccia a riga di comando OT build e flash

Segui il passaggio 5 della rete Build a Thread with nRF52840 boards and OpenThread per creare e far lampeggiare un dispositivo di interfaccia a riga di comando nRF52840.

Tuttavia, anziché attivare OT_COMMISSIONER e OT_JOINER, il nodo CLI richiede funzionalità OT_SRP_CLIENT e OT_ECDSA.

Di conseguenza, la chiamata completa alla build dovrebbe avere questo aspetto:

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

Entra nella rete OTBR

Per entrare a far parte della rete Thread creata dal servizio otbr-agent, dobbiamo recuperare il set di dati operativo attivo dal dispositivo OTBR. Torniamo alla riga di comando di otbr-agent e recuperiamo il set di dati attivo:

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

Torna alla sessione della schermata del nodo client SRP e imposta il set di dati attivo:

> dataset set active 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff
Done

Quindi, avvia l'interfaccia di Thread:

> ifconfig up
Done
> thread start
Done

Attendi qualche secondo e verifica che l'unione alla rete Thread sia riuscita:

> 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

Assicurati che i dati di rete corrispondano a quelli stampati su OTBR. Ora possiamo inviare un ping all'indirizzo OMR di 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. Pubblicare il Servizio sul Dispositivo finale

mDNS è stato ampiamente utilizzato per pubblicare servizi DNS-SD su link-local. Tuttavia, i messaggi multicast consumano troppa larghezza di banda e consumano rapidamente la batteria dei dispositivi a bassa potenza. Thread utilizza il protocollo SRP unicast per registrare i servizi offerti dal router di confine e si affida a quest'ultimo per pubblicizzare i servizi tramite link Wi-Fi o Ethernet.

Possiamo registrare un servizio con il comando srp client.

Vai alla sessione della schermata del nodo client SRP e avvia automaticamente il client SRP:

> srp client autostart enable
Done

Imposta il nome host che verrà pubblicizzato sul link Wi-Fi/Ethernet:

> srp client host name ot-host
Done

Affinché un dispositivo sul link Wi-Fi/Ethernet possa raggiungere un dispositivo finale Thread, l'indirizzo OMR del dispositivo finale deve essere pubblicizzato:

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

Alla fine, registra un falso servizio di _ipps._tcp:

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

Attendi qualche secondo. Dovremmo essere in grado di vedere il servizio registrato:

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

Abbiamo completato tutti i passaggi di configurazione e il servizio _ipps._tcp dovrebbe essere stato pubblicizzato tramite il link Wi-Fi/Ethernet. È ora di scoprire e raggiungere il dispositivo finale.

6. Scopri il servizio

Scopri il servizio con un telefono cellulare

54a136a8940897cc.png

Utilizziamo l'app Browser Browser per scoprire i servizi mDNS con il telefono Android, nonché un'app equivalente per i dispositivi mobili iOS. Apri l'app e il servizio _ipps._tcp dovrebbe apparire.

Scopri il servizio con un host Linux

Se vuoi scoprire il servizio da un altro host Linux, puoi utilizzare il comando avahi-browse.

Installa avahi-daemon e avahi-utils:

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

Risolvi il servizio:

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

Scopri il servizio con un host macOS

Puoi utilizzare dns-sd su macOS per risolvere il servizio:

$ 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. Invia un ping al dispositivo di fine

Ping da un telefono cellulare

Prendiamo come esempio il telefono Pixel: possiamo trovare l'indirizzo OMR del servizio registrato in precedenza "ot-service" nella pagina dei dettagli dell'istanza del servizio nell'app Service Browser.

bb992962e68d250b.png 888daa1df1e1a9bf.png

Ora possiamo inviare un ping all'indirizzo OMR con un'altra app Analizzatore di rete.

Purtroppo, la versione Android dell'app Analizzatore di rete non supporta le query mDNS per l'utilità ping e non possiamo eseguire il ping direttamente del nome host ot-host.local (possiamo eseguire il ping del nome host con la versione iOS dell'app).

Invia un ping da un host Linux/macOS

Thread Border Router invia gli annunci del router ICMPv6 (RA) per pubblicizzare i prefissi (tramite l'opzione delle informazioni sul prefisso) e le route (tramite l'opzione delle informazioni sul percorso) sul link Wi-Fi/Ethernet.

Prepara l'host Linux

È importante assicurarsi che RA e RIO siano abilitati sul vostro host:

  1. net.ipv6.conf.wlan0.accept_ra deve essere almeno 1 se l'IP forwarding non è abilitato e 2 in caso contrario.
  2. net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen non deve essere minore di 64.

il valore predefinito della variabile accept_ra è 1 per la maggior parte delle distribuzioni. Tuttavia, potrebbero esserci altri daemon di rete che sostituiscono questa opzione (ad esempio, dhcpcd su Raspberry Pi andrà a sostituire accept_ra in 0). Puoi verificare il valore accept_ra con:

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

e imposta il valore su 1 (o 2 nel caso in cui l'inoltro IP sia attivato) con:

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

L'opzione accept_ra_rt_info_max_plen sulla maggior parte delle distribuzioni Linux è selezionata per impostazione predefinita su 0, impostala su 64 con:

$ 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

Le modifiche andranno perse dopo il riavvio dell'host. Ad esempio, aggiungi i comandi seguenti a /etc/sysctl.conf per abilitare RIO in modo permanente:

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

Potrebbe essere troppo tardi per modificare tali configurazioni, perché l'OTBR sta già inviando messaggi RA e l'intervallo tra due messaggi RA non richiesti potrebbe essere di centinaia di secondi. Un modo consiste nel disconnetterti e riconnetterti al Wi-Fi AP per inviare messaggi di richiesta di router in modo che l'OTBR risponda con richieste RA richieste. Un'altra opzione consiste nel riavviare la funzione Border Routing sul router di confine:

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

Se stai tentando di riconnettere il Wi-Fi o di riavviare l'interfaccia Ethernet, assicurati che non venga utilizzato il protocollo dhcpcd per gestire la rete IPv6/Ethernet Wi-Fi. Poiché dhcpcd sostituisce sempre l'opzione accept_ra ogni volta che viene riavviata l'interfaccia, la configurazione accept_ra verrà persa. Aggiungi righe di seguito al file di configurazione dhcpcd (ad es. /etc/dhcpcd.conf) per disattivare esplicitamente IPv6 in dhcpcd:

noipv6
noipv6rs

Per applicare le modifiche, devi riavviare il computer.

Prepara l'host macOS

Entrambe le opzioni di accept_ra* sono attivate per impostazione predefinita, ma devi eseguire l'upgrade del sistema ad almeno macOS Big Sur.

Invia un ping al nome host o all'indirizzo IPv6

Ora possiamo inviare un ping al nome host ot-host.local con il comando ping -6 (ping6 per 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
...

Questo comando potrebbe non riuscire sugli host Linux con l'errore "Name or service not known". Questo perché il comando ping non risolve il nome ot-host.local. con query mDNS. Apri /etc/nsswitch.conf e aggiungi mdns6_minimal alla riga che inizia con hosts:

hosts:          files mdns4_minimal mdns6_minimal dns

Naturalmente, puoi sempre inviare un ping direttamente all'indirizzo 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. Terminare la pubblicazione del servizio sul dispositivo finale

Per rimuovere l'indirizzo e il servizio registrati dal nodo client SRP:

> srp client host remove
Done

Non dovresti essere in grado di trovare il servizio _ipps._tcp ora.

9. Complimenti

Congratulazioni: hai configurato OTBR come router Border Border per fornire connettività IP bidirezionale e rilevamento dei servizi per i dispositivi finali Thread.

Passaggi successivi

Dai un'occhiata ad alcuni di questi codelab...

Documenti di riferimento