Пограничный маршрутизатор потока - двунаправленное подключение IPv6 и обнаружение служб на основе DNS

1. Введение

699d673d05a55535.png

Что такое пограничный маршрутизатор потоков?

Thread - это протокол беспроводной ячеистой сети с низким энергопотреблением на основе IP, который обеспечивает безопасную связь между устройством и облаком. Поточные сети могут адаптироваться к изменениям топологии, чтобы избежать единой точки отказа.

Пограничный маршрутизатор потоков соединяет сеть потоков с другими сетями на основе IP, такими как Wi-Fi или Ethernet. Для потоковой сети требуется пограничный маршрутизатор для подключения к другим сетям. Граничный маршрутизатор потока минимально поддерживает следующие функции:

  • Двунаправленное IP-соединение между Thread и сетями Wi-Fi / Ethernet.
  • Открытие Двунаправленного обслуживания через MDNS (по Wi-Fi / Ethernet линия) и SRP (в сети Thread).
  • Поточная инфраструктура, объединяющая разделы потоков по IP-ссылкам.
  • Ввод в эксплуатацию внешнего потока (например, мобильного телефона) для аутентификации и присоединения устройства Thread к сети Thread.

OpenThread пограничный маршрутизатор (OTBR) выпущенный Google является реализацией с открытым исходным кодом на тему пограничного маршрутизатора.

Что ты построишь

В этой лаборатории вы собираетесь настроить пограничный маршрутизатор потока и подключить свой мобильный телефон к конечному устройству потока через пограничный маршрутизатор.

Что ты узнаешь

  • Как настроить OTBR
  • Как сформировать сеть потоков с помощью OTBR
  • Как создать устройство CLI OpenThread с функцией SRP
  • Как зарегистрировать сервис в SRP
  • Как обнаружить и добраться до конечного устройства потока.

Что тебе понадобится

  • Устройство Raspberry Pi 3/4 и SD-карта объемом не менее 8 ГБ.
  • 2 Nordic Semiconductor nRF52840 Dev платы.
  • Wi-Fi стандарта AP без IPv6 Router Advertisement Guard включен на маршрутизаторе.
  • Телефон с iOS не ниже iOS 14 или телефон с Android не ниже Android 8.1.

2. Настройте OTBR.

Настройка Raspberry Pi

Это просто создать свежее Raspberry Pi устройство с rpi-imager инструментом, следуя инструкции на raspberrypi.org (вместо того , чтобы использовать последнюю Raspberry Pi OS в инструменте, загрузить 2021-05-07-raspios-Бустер-armhf -Lite самостоятельно). Чтобы выполнить действия с мобильным телефоном в этой лаборатории кодов, вам необходимо подключить Raspberry Pi к точке доступа Wi-Fi. Следуйте это руководство для настройки беспроводной связи. Это удобно для входа на Raspberry Pi с SSH, вы можете найти инструкции здесь .

Получить код OTBR

Войти на ваш Raspberry Pi и клон ot-br-posix из GitHub:

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

Сборка и установка OTBR

В OTBR есть два сценария, которые загружают и настраивают пограничный маршрутизатор потоков:

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

OTBR работает как сетевой интерфейс интерфейса Thread и инфраструктуры (например , Wi-Fi / Ethernet) , которая указана с INFRA_IF_NAME . Интерфейс резьбы создается сам OTBR и назвал wpan0 по умолчанию и интерфейс инфраструктуры имеет значение по умолчанию wlan0 , если INFRA_IF_NAME не указан явно. Если Raspberry Pi подключается с помощью кабеля Ethernet, указать имя интерфейса Ethernet (например , eth0 ):

$ INFRA_IF_NAME=eth0 ./script/setup

Проверьте, успешно ли установлен OTBR:

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

Ожидается , что otbr-agent службы не активен, так как он требует RCP чип для запуска.

Перезагрузите Raspberry Pi, чтобы изменения вступили в силу.

Сборка и прошивка прошивки RCP

OTBR поддерживает микросхему 15,4 радио в сопроцессор Radio режиме (RCP). В этом режиме стек OpenThread работает на стороне хоста и передает / принимает кадры через приемопередатчик IEEE802.15.4.

Выполните шаг 4 этой codelab построить и прошить устройство nRF52840 RCP. Вам нужен дополнительный параметр -DOT_THREAD_VERSION=1.2 для стадии сборки:

$ script/build nrf52840 USB_trans -DOT_THREAD_VERSION=1.2

Запустите OTBR и проверьте статус

Подключите плату nRF52840 к вашему Raspberry Pi и начать otbr-agent службы:

$ sudo service otbr-agent restart

Убедитесь в том, что otbr-agent службы активен:

$ 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. Сформируйте сеть потоков.

Существует ot-ctl команда , которая может быть использована для управления otbr-agent службы. ot-ctl принимает все команды OpenThread CLI, см OpenThread Руководство CLI для более подробной информации.

Сформируйте сеть потоков с 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

Подождите несколько секунд, мы должны быть в состоянии видеть , что OTBR выступает в качестве Thread leader и есть 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. Настройка конечного клиентского устройства SRP.

Сборка и прошивка OT CLI

Выполните шаг 5 этого codelab строить и прошить конец устройства nRF52840 CLI. Но вместо того , чтобы OT_COMMISSIONER и OT_JOINER включен узел CLI требует OT_SRP_CLIENT и OT_ECDSA функции:

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

Присоединяйтесь к сети OTBR

Для того, чтобы присоединиться к сети Thread созданную otbr-agent службы, мы должны получить активный Operational Dataset от OTBR устройства. Давайте вернемся к otbr-agent командной строки и получить активный набор данных:

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

Вернитесь к сеансу экрана клиентского узла SRP и установите активный набор данных:

> dataset set active 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff
Done

Затем запустите интерфейс потока:

> ifconfig up
Done
> thread start
Done

Подождите несколько секунд и убедитесь, что подключение к сети потоков прошло успешно:

> 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

Убедитесь, что сетевые данные соответствуют данным, напечатанным на OTBR. Теперь мы можем пропинговать адрес OMR 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. Опубликуйте службу на конечном устройстве.

mDNS широко используется для публикации службы DNS-SD на локальном канале. Но многоадресные сообщения потребляют слишком большую полосу пропускания и быстро истощают батарею для устройств с низким энергопотреблением. Автор использует однонаправленную SRP протокол зарегистрировать свои услуги с пограничным маршрутизатором и полагается на пограничном маршрутизаторе , чтобы рекламировать свои услуги по ссылке Wi-Fi или Ethernet.

Мы можем зарегистрировать службу с srp client команды.

Перейдите в сеанс экрана узла клиента SRP и автоматически запустите клиент SRP:

> srp client autostart enable
Done

Задайте имя хоста, которое будет объявлено на ссылке Wi-Fi / Ethernet:

> srp client host name ot-host
Done

Чтобы устройство, подключенное к каналу Wi-Fi / Ethernet, могло достичь конечного устройства потока, необходимо объявить адрес OMR конечного устройства:

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

В конце концов, зарегистрировать поддельные _ipps._tcp услуги:

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

Подождите несколько секунд, и мы сможем увидеть зарегистрированную службу:

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

Мы завершили все настройки работы и _ipps._tcp службы должны были рекламируются на Wi-Fi / Ethernet связи. Пришло время открыть для себя конечное устройство и добраться до него!

6. Откройте для себя сервис

Откройте для себя услугу с помощью мобильного телефона

54a136a8940897cc.png

Мы используем Service Browser App обнаружить MDNS услугу с Android телефона, или эквивалент App можно также найти для мобильных устройств IOS. Откройте приложение и сервис _ipps._tcp должен просто показать.

Откройте для себя сервис с хостом Linux

Если вы хотите открыть службу с другого хоста Linux, вы можете использовать avahi-browse команды.

Установите avahi-daemon и avahi-utils :

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

Разрешить службу:

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

Откройте для себя сервис с хостом macOS

Вы можете использовать dns-sd на 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. Проверьте связь с конечным устройством.

Пинг с мобильного телефона

Возьмем, к примеру, телефон Pixel. Мы можем узнать OMR-адрес ранее зарегистрированной службы «ot-service» на странице сведений об экземпляре службы в приложении Service Browser.

bb992962e68d250b.png888daa1df1e1a9bf.png

Теперь мы можем пинговать адрес OMR с другим Network Analyzer App.

К сожалению, Android версия Network Analyzer App не поддерживает MDNS запросов для утилиты пинг и мы не можем свистеть имя хоста ot-host.local непосредственно (мы можем свистеть имя хоста с версией IOS из App).

Пинг с хоста Linux / macOS

Граничный маршрутизатор потока отправляет объявления маршрутизатора ICMPv6 (RA) для объявления префиксов (с помощью параметра информации о префиксе) и маршрутов (с помощью параметра информации о маршруте) по каналу Wi-Fi / Ethernet.

Подготовить хост Linux

Важно убедиться, что на вашем хосте включены RA и RIO:

  1. net.ipv6.conf.wlan0.accept_ra должна быть не менее 1 , если переадресация IP не включена, и 2 в противном случае.
  2. net.ipv6.conf.wlan0.accept_ra_rt_info_max_plen не должно быть меньше , чем 64 .

accept_ra по умолчанию настроен на 1 для большинства дистрибутивов. Но могут быть и другие сетевые демоны , которые отменяют эту опцию (например, dhcpcd на Raspberry Pi перекроет accept_ra до 0 ). Вы можете проверить accept_ra значение с:

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

И установите значение 1 (или 2 в случае переадресации IP включена) с:

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

accept_ra_rt_info_max_plen вариант в большинстве дистрибутивов Linux по умолчанию в 0 , установите его на 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

Изменение будет потеряно после перезагрузки хоста. Например, добавьте ниже команд в /etc/sysctl.conf , чтобы навсегда включить RIO:

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

Изменять эти конфигурации может быть слишком поздно, потому что OTBR уже отправлял сообщения RA, а интервал между двумя незапрошенными сообщениями RA может составлять несколько сотен секунд. Одним из способов является отключение и повторное подключение к точке доступа Wi-Fi для отправки сообщений запроса маршрутизатора, чтобы OTBR отвечал запрашиваемыми RA. Другой вариант - перезапустить функцию пограничной маршрутизации на пограничном маршрутизаторе:

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

Если вы пытаетесь восстановить Wi-Fi или рестарт Ethernet интерфейс, убедитесь , что DHCPcd не используется для управления wifi- / Ethernet сеть IPv6. Поскольку DHCPcd всегда перекрывает accept_ra вариант каждый раз интерфейс перезапускается и ваша accept_ra конфигурация будет потеряна. Append ниже строки в файл конфигурации DHCPcd (например /etc/dhcpcd.conf ) в явном виде отключить IPv6 в Dhcpcd:

noipv6
noipv6rs

Вам необходимо перезагрузить компьютер, чтобы изменения вступили в силу.

Подготовить хост macOS

Оба accept_ra* опции включены по умолчанию, но вам необходимо обновить систему , по крайней мере , MacOs Big Sur.

Отправьте эхо-запрос имени хоста или IPv6-адреса

Теперь мы можем свистеть имя хоста ot-host.local с командой ping -6 ( ping6 для 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
...

Эта команда может потерпеть неудачу на хостах Linux с "Name or service not known" ошибки. Это потому , что ping команда не разрешение ot-host.local. имя с запросами mDNS. Открыть /etc/nsswitch.conf и добавить mdns6_minimal к линии начинается с hosts :

hosts:          files mdns4_minimal mdns6_minimal dns

Конечно, вы всегда можете напрямую пропинговать 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. Конечное устройство отмените публикацию службы.

Чтобы удалить адрес и службу, зарегистрированные на клиентском узле SRP:

> srp client host remove
Done

Вы не должны быть в состоянии обнаружить _ipps._tcp службу в настоящее время.

9. Поздравления

Поздравляем, вы успешно настроили OTBR в качестве пограничного маршрутизатора потоков для обеспечения двунаправленного IP-соединения и обнаружения служб для оконечных устройств потоков.

Что дальше?

Посмотрите некоторые из этих кодовых лабораторий ...

Справочные документы