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

1. Введение

699d673d05a55535.png

Что такое нить?

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

Что такое OpenThread?

OpenThread, выпущенный компанией Google, — это реализация Thread® с открытым исходным кодом.

Что такое фрезерный станок для обработки граничных участков резьбы?

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

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

OpenThread Border Router (OTBR), выпущенный Google, представляет собой реализацию Thread Border Router с открытым исходным кодом.

Что вы построите

В этом практическом задании вы настроите маршрутизатор граничных потоков (Thread Border Router) и подключите свой мобильный телефон к конечному устройству потока (Thread End Device) через этот маршрутизатор.

Что вы узнаете

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

Что вам понадобится

  • Рабочая станция под управлением Linux для сборки и прошивки Thread RCP, интерфейса командной строки OpenThread и тестирования многоадресной рассылки IPv6.
  • Raspberry Pi для маршрутизатора Thread Border.
  • 2 USB-адаптера Nordic Semiconductor nRF52840 (один для RCP, другой для концевого устройства Thread).
  • Телефон на iOS с версией операционной системы не ниже iOS 14 или телефон на Android с версией операционной системы не ниже Android 8.1.

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

Самый быстрый способ настроить OTBR — следовать руководству по настройке OTBR .

После завершения настройки OTBR используйте ot-ctl , чтобы убедиться, что OTBR выступает в качестве leader потока.

$ sudo ot-ctl state
leader
Done

Также убедитесь, что OTBR автоматически настроил префикс для off-mesh-routable (OMR) в сетевых данных потока.

$ 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

3. Настройка клиентского устройства SRP

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

Выполните шаг 5 из руководства по созданию сети Thread с использованием плат nRF52840 и OpenThread, чтобы собрать и прошить конечное устройство nRF52840 CLI.

Однако вместо включения OT_COMMISSIONER и OT_JOINER , узел CLI требует наличия функций OT_SRP_CLIENT и OT_ECDSA .

Таким образом, полный процесс сборки должен выглядеть следующим образом:

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

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

Чтобы подключиться к сети Thread, нам нужно получить активный оперативный набор данных с устройства OTBR. Вернемся к ot-ctl и получим активный набор данных:

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

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

> dataset set active 0e080000000000010000000300001235060004001fffe002083d3818dc1c8db63f0708fda85ce9df1e662005101d81689e4c0a32f3b4aa112994d29692030f4f70656e5468726561642d35326532010252e204103f23f6b8875d4b05541eeb4f9718d2f40c0302a0ff
Done

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

> ifconfig up
Done
> thread start
Done

Подождите несколько секунд и проверьте, успешно ли выполнено подключение к сети 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

Убедитесь, что сетевые данные совпадают с данными, напечатанными на OTBR. Теперь мы можем отправить ping на 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

4. Опубликуйте сервис на конечном устройстве.

mDNS широко используется для публикации DNS-SD-сервисов в локальной сети. Однако многоадресные сообщения потребляют слишком много полосы пропускания и быстро разряжают батарею маломощных устройств. Thread использует протокол одноадресной рассылки 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, могло связаться с конечным устройством Thread, необходимо передать 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. Теперь пора обнаружить и подключиться к конечному устройству!

5. Ознакомьтесь с услугой

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

54a136a8940897cc.png

Для обнаружения mDNS-сервисов на телефоне Android мы используем приложение Service Browser ; аналогичное приложение можно найти и для мобильных устройств 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.

Для разрешения имени службы на macOS можно использовать dns-sd :

$ 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     ""
...

6. Проверьте связь с конечным устройством (ping).

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

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

bb992962e68d250b.png888daa1df1e1a9bf.png

Теперь мы можем отправить ping-запрос на адрес OMR с помощью другого приложения сетевого анализатора .

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

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

Маршрутизатор Thread Border Router отправляет ICMPv6 Router Advertisements (RA) для объявления префиксов (через параметр Prefix Information Option) и маршрутов (через параметр Route Information Option) по каналу 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

В большинстве дистрибутивов Linux параметр accept_ra_rt_info_max_plen по умолчанию равен 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, чтобы отправить сообщения Router Solicitation, и OTBR ответит запрошенными сообщениями RA. Другой вариант — перезапустить функцию Border Routing на пограничном маршрутизаторе.

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

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

noipv6
noipv6rs

Для вступления изменений в силу необходимо перезагрузить систему.

Подготовка хоста macOS

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

Проверьте связь с именем хоста или IPv6-адресом, выполнив команду ping.

Теперь мы можем проверить доступность хоста 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:

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

7. Конечное устройство. Отключите службу.

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

> srp client host remove
Done

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

8. Поздравляем!

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

Что дальше?

Посмотрите некоторые из этих практических занятий по программированию...

Справочная документация