Enrutador de borde de subprocesos: conectividad IPv6 bidireccional y descubrimiento de servicios basado en DNS

1. Introducción

699d673d05a55535.png

¿Qué es un enrutador de borde de hilo?

Thread es un protocolo de red de malla inalámbrica de baja potencia basado en IP que permite comunicaciones seguras de dispositivo a dispositivo y de dispositivo a nube. Las redes de subprocesos pueden adaptarse a los cambios de topología para evitar un solo punto de falla.

Un enrutador de borde de subprocesos conecta una red de subprocesos a otras redes basadas en IP, como Wi-Fi o Ethernet. Una red Thread requiere un Border Router para conectarse a otras redes. Un enrutador de borde de subprocesos admite mínimamente las siguientes funciones:

  • Conectividad IP bidireccional entre Thread y redes Wi-Fi / Ethernet.
  • Descubrimiento de servicio bidireccional a través de mDNS (Wi-Fi / enlace Ethernet) y SRP (en la red de rosca).
  • Subproceso sobre infraestructura que fusiona particiones de subprocesos sobre enlaces basados ​​en IP.
  • Puesta en marcha de subprocesos externos (por ejemplo, un teléfono móvil) para autenticar y unir un dispositivo de subprocesos a una red de subprocesos.

Border Router OpenThread (OTBR) lanzado por Google es una implementación de código abierto de la rosca Border Router.

Lo que vas a construir

En este laboratorio de código, configurará un enrutador de borde de subprocesos y conectará su teléfono móvil a un dispositivo de extremo de subprocesos a través del enrutador de bordes.

Lo que aprenderás

  • Cómo configurar OTBR
  • Cómo formar una red Thread con OTBR
  • Cómo construir un dispositivo CLI OpenThread con la función SRP
  • Cómo registrar un servicio con SRP
  • Cómo descubrir y llegar a un dispositivo final de Thread.

Lo que necesitarás

  • Un dispositivo Raspberry Pi 3/4 y una tarjeta SD con al menos 8 GB de capacidad.
  • 2 Nordic Semiconductor nRF52840 placas de desarrollo.
  • Un acceso Wi-Fi sin IPv6 Router Advertisement Guardia activado en el router.
  • Un teléfono iOS con al menos iOS 14 o un teléfono Android con al menos Android 8.1.

2. Configurar OTBR

Configurar Raspberry Pi

Es fácil de configurar un dispositivo de Frambuesa Pi fresco con el rpi-imager herramienta siguiendo las instrucciones en raspberrypi.org (en lugar de utilizar la última versión del sistema operativo Frambuesa Pi en la herramienta, descarga 2021-05-07-raspios-tipo-armhf -Lite por sí mismo). Para completar los pasos del teléfono móvil en este laboratorio de códigos, debe conectar la Raspberry Pi a un punto de acceso Wi-Fi. Siga esta guía para configurar la conectividad inalámbrica. Es conveniente iniciar sesión en el Pi de frambuesa con SSH, puede encontrar instrucciones aquí .

Obtener el código OTBR

Ingrese a su Frambuesa Pi y clon ot-br-posix de GitHub:

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

Construya e instale OTBR

OTBR tiene dos scripts que arrancan y configuran el Thread Border Router:

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

OTBR funciona tanto en una interfaz de red de interfaz de rosca y la infraestructura (por ejemplo Wi-Fi / Ethernet) que se especifica con INFRA_IF_NAME . La interfaz de rosca está creada por él mismo y el nombre OTBR wpan0 por defecto y la interfaz de la infraestructura tiene un valor predeterminado de wlan0 si INFRA_IF_NAME no se especifica explícitamente. Si su Frambuesa Pi está conectado por un cable Ethernet, especifique el nombre de la interfaz Ethernet (por ejemplo, eth0 ):

$ INFRA_IF_NAME=eth0 ./script/setup

Compruebe si OTBR se ha instalado correctamente:

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

Se espera que el otbr-agent servicio no está activo, ya que requiere una RCP de chips para funcionar.

Reinicie la Raspberry Pi para que los cambios surtan efecto.

Cree y actualice el firmware RCP

OTBR soporta un chip 15.4 de radio en Co-Procesador Radio modo (RCP). En este modo, la pila OpenThread se ejecuta en el lado del host y transmite / recibe tramas a través del transceptor IEEE802.15.4.

Siga el paso 4 de este laboratorio de programación para construir y parpadea un dispositivo nRF52840 RCP. Es necesario una opción adicional -DOT_THREAD_VERSION=1.2 para el paso de generación:

$ script/build nrf52840 USB_trans -DOT_THREAD_VERSION=1.2

Inicie OTBR y verifique el estado

Conectar la placa a su nRF52840 Frambuesa Pi e iniciar el otbr-agent servicio:

$ sudo service otbr-agent restart

Compruebe que la otbr-agent servicio está activo:

$ 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. Forme una red de subprocesos

Hay un ot-ctl de comandos que se puede utilizar para controlar el otbr-agent servicio. ot-ctl acepta todos los comandos de la CLI OpenThread, ver Guía OpenThread CLI para más detalles.

Forme una red de subprocesos 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

Espere unos segundos, debemos ser capaces de ver que OTBR está actuando como un hilo leader y hay un off-mesh-routable (OMR) prefijo en el hilo de datos de red:

$ 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. Configure el dispositivo final del cliente SRP

Crear y actualizar OT CLI

Siga paso 5 de este laboratorio de programación para construir y parpadea un dispositivo final nRF52840 CLI. Pero en lugar de tener OT_COMMISSIONER y OT_JOINER habilitadas, el nodo CLI requiere OT_SRP_CLIENT y OT_ECDSA características:

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

Únase a la red OTBR

Para unirse a la red Tema creado por el otbr-agent servicio, necesitamos para obtener el conjunto de datos de funcionamiento activo desde el dispositivo OTBR. Volvamos a la otbr-agent línea de comandos y obtener el conjunto de datos activo:

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

Regrese a la sesión de la pantalla del nodo del cliente SRP y configure el conjunto de datos activo:

> dataset set active 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff
Done

Luego, inicie la interfaz de Thread:

> ifconfig up
Done
> thread start
Done

Espere unos segundos y verifique si unirse a la red Thread es exitoso:

> 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

Asegúrese de que los datos de la red coincidan con los impresos en OTBR. Ahora podemos hacer ping a la dirección OMR de 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. Publique el servicio en el dispositivo final

mDNS se ha utilizado ampliamente para publicar el servicio DNS-SD en link-local. Pero los mensajes de multidifusión consumen demasiado ancho de banda y agotarán rápidamente la batería de los dispositivos de baja potencia. Utiliza el hilo unicast SRP protocolo para registrar sus servicios con el enrutador de frontera y se basa en el enrutador de frontera para hacer publicidad de los servicios en el enlace Wi-Fi o Ethernet.

Podemos registrar un servicio con el srp client de comandos.

Vaya a la sesión de la pantalla del nodo del cliente SRP e inicie automáticamente el cliente SRP:

> srp client autostart enable
Done

Configure el nombre de host que se anunciará en el enlace Wi-Fi / Ethernet:

> srp client host name ot-host
Done

Para que un dispositivo en el enlace Wi-Fi / Ethernet llegue a un dispositivo final Thread, se debe anunciar la dirección OMR del dispositivo final:

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

Al final, registrar una falsa _ipps._tcp servicio:

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

Espere unos segundos y deberíamos poder ver el servicio registrado:

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

Hemos completado todo el trabajo de instalación y el _ipps._tcp servicio debería haber sido anunciados en el enlace Wi-Fi / Ethernet. ¡Es hora de descubrir y llegar al dispositivo final ahora!

6. Descubra el servicio

Descubra el servicio con un teléfono móvil

54a136a8940897cc.png

Usamos el Navegador de servicios de aplicaciones para descubrir los servicios mDNS con el teléfono Android, una aplicación equivalente también se puede encontrar para dispositivos móviles iOS. Abrir la aplicación y el servicio _ipps._tcp solo debe aparecer.

Descubra el servicio con un host Linux

Si quieres descubrir el servicio de otro host Linux, puede utilizar el avahi-browse comando.

Instalar avahi-daemon y avahi-utils :

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

Resuelve el servicio:

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

Descubra el servicio con un host macOS

Puede usar dns-sd en MacOS para resolver el servicio:

$ 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. Hacer ping al dispositivo final

Hacer ping desde un teléfono móvil

Tomemos el teléfono Pixel como ejemplo, podemos encontrar la dirección OMR del servicio "ot-service" previamente registrado en la página de detalles de la instancia del servicio en la aplicación Service Browser.

bb992962e68d250b.png888daa1df1e1a9bf.png

Ahora podemos hacer ping a la dirección OMR con otro analizador de redes de aplicaciones.

Por desgracia, la versión de Android de la aplicación Analizador de red no soporta mDNS consultas para la utilidad ping y no puede hacer ping al nombre de host ot-host.local directamente (podemos hacer ping al nombre de host con la versión de IOS de la aplicación).

Hacer ping desde un host Linux / macOS

Thread Border Router envía anuncios de enrutador ICMPv6 (RA) para anunciar prefijos (a través de la opción de información de prefijo) y rutas (a través de la opción de información de ruta) en el enlace Wi-Fi / Ethernet.

Preparar el host de Linux

Es importante asegurarse de que RA y RIO estén habilitados en su host:

  1. net.ipv6.conf.wlan0.accept_ra debería ser al menos 1 si el reenvío de IP no está activado, y 2 de otra manera.
  2. net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen no debe ser menor que 64 .

la accept_ra está por defecto en 1 para la mayoría de las distribuciones. Pero puede haber otros demonios de red que anularán esta opción (por ejemplo, dhcpcd de Frambuesa Pi anulará accept_ra a 0 ). Puede comprobar el accept_ra valor con:

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

Y establecer el valor a 1 (o 2 en la expedición caso IP está habilitado) con:

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

El accept_ra_rt_info_max_plen opción en la mayoría de las distribuciones de Linux es por defecto a 0 , configurarlo a 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

El cambio se perderá después de reiniciar el host. Por ejemplo, anexados a continuación comandos a /etc/sysctl.conf para habilitar permanentemente RIO:

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

Puede que sea demasiado tarde para cambiar esas configuraciones porque el OTBR ya ha estado enviando mensajes RA y el intervalo entre dos mensajes RA no solicitados podría ser de varios cientos de segundos. Una forma es desconectarse y volver a conectarse a Wi-Fi AP para enviar mensajes de solicitud de enrutador para que OTBR responda con los RA solicitados. Otra opción es reiniciar la función Border Routing en el Border Router:

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

Si usted está tratando de volver a conectar Wi-Fi o Ethernet reinicio de interfaz, asegúrese de que dhcpcd no se utiliza para gestionar la red WiFi-Ethernet / IPv6. Debido a dhcpcd siempre tiene preferencia sobre la accept_ra opción cada vez que la interfaz se reinicia y su accept_ra se perderá la configuración. Anexar debajo de las líneas en el archivo de configuración dhcpcd (por ejemplo /etc/dhcpcd.conf ) a explícitamente desactivar IPv6 en dhcpcd:

noipv6
noipv6rs

Debe reiniciar para que el cambio entre en vigor.

Preparar el host de macOS

Ambos accept_ra* opciones están activadas por defecto, pero hay que actualizar su sistema a al menos macOS Big Sur.

Haga ping al nombre de host o la dirección IPv6

Ahora podemos hacer ping al nombre de host ot-host.local con el comando ping -6 ( ping6 para 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
...

Este comando puede fallar en los hosts de Linux con el "Name or service not known" error. Esto se debe a la ping comando no sea la solución de los ot-host.local. nombre con consultas mDNS. Abrir /etc/nsswitch.conf y añadir mdns6_minimal a la línea comienza con hosts :

hosts:          files mdns4_minimal mdns6_minimal dns

Por supuesto, siempre puede hacer ping a la dirección IPv6 directamente:

$ 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. Dispositivo final anular la publicación del servicio

Para eliminar la dirección y el servicio registrados del nodo del cliente SRP:

> srp client host remove
Done

Usted no debe ser capaz de descubrir la _ipps._tcp servicio ahora.

9. Felicitaciones

Felicitaciones, ha configurado OTBR con éxito como un enrutador de borde de subprocesos para proporcionar conectividad IP bidireccional y descubrimiento de servicios para dispositivos finales de subprocesos.

¿Que sigue?

Echa un vistazo a algunos de estos codelabs ...

Documentos de referencia