1. Введение
Что такое нить?
Thread — это протокол беспроводной ячеистой сети с низким энергопотреблением на основе IP, который обеспечивает безопасную связь между устройствами и между устройствами и облаком. Сети потоков могут адаптироваться к изменениям топологии, чтобы избежать единичных сбоев.
Что такое OpenThread?
OpenThread, выпущенный Google, представляет собой реализацию Thread® с открытым исходным кодом.
Что такое пограничный маршрутизатор OpenThread?
OpenThread Border Router (OTBR), выпущенный Google, представляет собой реализацию Thread Border Router с открытым исходным кодом.
НАТ64
NAT64 — это механизм, который позволяет узлам в сетях только IPv6 получать доступ к ресурсам в сетях IPv4. Шлюз NAT64 является преобразователем между протоколами IPv4 и протоколами IPv6.
Транслятор NAT64, как часть пограничного маршрутизатора OpenThread, поддерживает трансляцию протоколов TCP, UDP и ICMP (ICMPv6).
Что ты построишь
В этой лабораторной работе вы собираетесь настроить пограничный маршрутизатор OpenThread (OTBR) и устройство Thread, а затем включить и проверить связь между устройствами Thread и узлами IPv4 в Интернете через пограничный маршрутизатор OpenThread.
Что вы узнаете
- Как создать пограничный маршрутизатор OpenThread с функциями NAT64.
- Как взаимодействовать с хостами IPv4 с конечных устройств Thread.
Что вам понадобится
- Рабочая станция Linux для создания и прошивки Thread RCP, интерфейса командной строки OpenThread и тестирования подключения IPv4.
- Raspberry Pi для пограничного маршрутизатора Thread. Ваша рабочая станция Linux должна быть доступна через IPv4 с этого устройства.
- 2 USB-ключа Nordic Semiconductor nRF52840 (один для RCP и один для устройства на конце резьбы).
Топология сети для этой лаборатории кода:
2. Настройка пограничного маршрутизатора OpenThread
Самый быстрый способ настроить OTBR — следовать Руководству по настройке OTBR .
После завершения настройки OTBR используйте ot-ctl
, чтобы убедиться, что служба NAT64 включена на пограничном маршрутизаторе:
> nat64 state PrefixManager: Active Translator: Active Done
Пограничный маршрутизатор потока публикует префикс NAT64 в данных сети потока:
> netdata show Prefixes: fd16:a3d:e170:1::/64 paros low f800 Routes: ::/0 s med f800 fd16:a3d:e170:2:0:0::/96 sn low f800 Services: 44970 5d fd4db3e59738319339c4ee02ca9e2b1dd120 s f800 0 Contexts: fd16:a3d:e170:1::/64 1 sc Commissioning: 60365 - - - Done
Префикс NAT64 отображается как запись маршрута с флагом n
. В приведенном выше примере fd16:a3d:e170:2:0:0::/96
— это префикс NAT64.
Префикс NAT64 будет использоваться устройствами Thread при взаимодействии с хостом IPv4.
3. Настройка устройства окончания резьбы.
Выполните шаг «Настройка FTD» в разделе «Построение сети потоков с помощью плат nRF52840 и лаборатории кода OpenThread», чтобы создать и прошить конечное устройство CLI nRF52840, изменив следующий шаг:
В Build and flash вам необходимо добавить -DOT_DNS_CLIENT=ON
, -DOT_SRP_CLIENT=ON
и -DOT_ECDSA=ON
в командную строку при вызове script/build
:
$ cd ~/src/ot-nrf528xx $ rm -rf build $ script/build nrf52840 USB_trans -DOT_DNS_CLIENT=ON -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON
Продолжайте работу над созданием сети Thread с платами nRF52840 и кодовой лабораторией OpenThread, как написано. После того как на конечном устройстве будет прошит образ CLI, следуйте инструкциям «Присоединить второй узел к сети Thread», чтобы добавить устройство Thread в сеть Thread.
Подождите несколько секунд после настройки конечного устройства Thread и проверьте успешность присоединения к сети Thread. Как указано выше, вы можете просмотреть опубликованный префикс NAT64 в данных сети потоков.
> netdata show Prefixes: fd16:a3d:e170:1::/64 paros low f800 Routes: ::/0 s med f800 fd16:a3d:e170:2:0:0::/96 sn low f800 Services: 44970 5d fd4db3e59738319339c4ee02ca9e2b1dd120 s f800 0 Contexts: fd16:a3d:e170:1::/64 1 sc Commissioning: 60365 - - - Done
Убедитесь, что сетевые данные соответствуют данным OTBR.
4. Общайтесь с хостами IPv4 с конечного устройства Thread.
Теперь вы можете общаться с хостами в сети IPv4 с конечного устройства, которое мы только что настроили.
Отправлять эхо-запросы ICMP на хосты IPv4.
Из CLI нашего конечного устройства Thread:
> ping 8.8.8.8 Pinging synthesized IPv6 address: fd16:a3d:e170:2:0:0:808:808 16 bytes from fd16:a3d:e170:2:0:0:808:808: icmp_seq=1 hlim=109 time=28ms 1 packets transmitted, 1 packets received. Packet loss = 0.0%. Round-trip min/avg/max = 28/28.0/28 ms. Done
Пограничный маршрутизатор создает элемент сопоставления NAT64 для этого устройства с помощью команды nat64 mappings
:
> nat64 mappings | | Address | Ports or ICMP Ids | | 4 to 6 | 6 to 4 | +------------------+-------------------------------------------------------------+-------------------+--------+-------------------------+-------------------------+ | ID | IPv6 | IPv4 | v6 | v4 | Expiry | Pkts | Bytes | Pkts | Bytes | +------------------+------------------------------------------+------------------+---------+---------+--------+----------+--------------+----------+--------------+ | 90b156e3cf609a23 | fd16:a3d:e170:1:492d:bcdb:9f72:6297 | 192.168.255.254 | N/A | N/A | 7162s | 1 | 16 | 1 | 16 | | | TCP | 0 | 0 | 0 | 0 | | | UDP | 0 | 0 | 0 | 0 | | | ICMP | 1 | 16 | 1 | 16 | Done
fd16:a3d:e170:1:492d:bcdb:9f72:6297
должен быть адресом IPv6 вашего устройства Thread.
Запустите эту команду на пограничном маршрутизаторе в любое время, чтобы увидеть, как он считает трафик.
Отправлять DNS-запросы на DNS-серверы IPv4.
Используйте dns resolve4
для разрешения имени хоста в сети IPv4. Адрес DNS-сервера также может быть адресом IPv4:
> dns resolve4 example.com 8.8.8.8 Synthesized IPv6 DNS server address: fd16:a3d:e170:2:0:0:808:808 DNS response for example.com. - fd16:a3d:e170:2:0:0:17c0:e454 TTL:295 fd16:a3d:e170:2:0:0:17d7:88 TTL:295 fd16:a3d:e170:2:0:0:17d7:8a TTL:295 fd16:a3d:e170:2:0:0:6007:80af TTL:295 fd16:a3d:e170:2:0:0:6007:80c6 TTL:295 fd16:a3d:e170:2:0:0:17c0:e450 TTL:295 Done
Общайтесь через TCP
Между конечным устройством и хостами в сети IPv4 можно установить TCP-соединения.
Предположим, что IP-адрес вашего хоста Linux IPv4 — 192.168.0.2
.
На хосте Linux IPv4 используйте nc
для прослушивания TCP-соединений:
$ nc -l 0.0.0.0 12345
С конечного устройства Thread установите TCP-соединение и отправьте сообщения на хост Linux IPv4:
> tcp init Done > tcp connect 192.168.0.2 12345 Connecting to synthesized IPv6 address: fd16:a3d:e170:2:0:0:c0a8:2 Done > tcp send hello
Ваш хост Linux IPv4 выводит:
hello
Вы также можете отправлять сообщения с хоста Linux IPv4 на конечное устройство Thread. Введите «world» и нажмите Enter на хосте Linux IPv4, на котором работает nc
, и ваше конечное устройство Thread выведет:
TCP: Received 6 bytes: world
Общайтесь через UDP
Между устройствами Thread и хостами в сети IPv4 можно взаимодействовать с помощью UDP.
Предположим, что IP-адрес вашего хоста Linux IPv4 — 192.168.0.2
.
Используйте nc
для прослушивания UDP-соединений:
$ nc -u -l 0.0.0.0 12345
С конечного устройства Thread установите UDP-соединение и отправьте сообщения на хост Linux IPv4:
> udp open Done > udp connect 192.168.0.2 12345 Connecting to synthesized IPv6 address: fd16:a3d:e170:2:0:0:c0a8:2 Done > udp send hello Done
Ваш хост Linux IPv4 выводит:
hello
Вы также можете отправлять сообщения с хоста Linux IPv4 на конечное устройство Thread. Введите «world» и нажмите Enter на хосте Linux IPv4, на котором работает nc
, и ваше конечное устройство Thread выведет:
6 bytes from fd16:a3d:e170:2:0:0:c0a8:2 12345 world
5. Переключите NAT64 на пограничном маршрутизаторе.
Вы можете включить или отключить NAT64 в любое время. Используйте nat64 disable
, чтобы отключить NAT64. И используйте nat64 state
, чтобы проверить состояние NAT64.
> nat64 disable Done > nat64 state PrefixManager: Disabled Translator: Disabled Done
После отключения устройство больше не публикует префикс NAT64:
> netdata show Prefixes: fd16:a3d:e170:1::/64 paros low f800 Routes: ::/0 s med f800 Services: 44970 5d fd4db3e59738319339c4ee02ca9e2b1dd120 s f800 0 Contexts: fd16:a3d:e170:1::/64 1 sc Commissioning: 60365 - - - Done
Кроме того, устройства в сети Thread больше не могут получить доступ к хосту IPv4 через этот пограничный маршрутизатор.
Из CLI нашего конечного устройства Thread:
> ping 8.8.8.8 Error 13: InvalidState
Используйте nat64 enable
, чтобы включить NAT64. Прежде чем менеджер префиксов начнет объявлять префикс NAT64, может пройти некоторое время:
> nat64 enable Done > nat64 state PrefixManager: Idle Translator: NotWorking Done
Через несколько секунд компоненты NAT64 должны быть запущены и работать:
> nat64 state PrefixManager: Active Translator: Active Done > netdata show Prefixes: fd16:a3d:e170:1::/64 paros low f800 Routes: ::/0 s med f800 fd16:a3d:e170:2:0:0::/96 sn low f800 Services: 44970 5d fd4db3e59738319339c4ee02ca9e2b1dd120 s f800 0 Contexts: fd16:a3d:e170:1::/64 1 sc Commissioning: 60365 - - - Done
Обратите внимание, что отключение NAT64 очистит таблицу сопоставлений:
> nat64 mappings | | Address | Ports or ICMP Ids | | 4 to 6 | 6 to 4 | +------------------+-------------------------------------------------------------+-------------------+--------+-------------------------+-------------------------+ | ID | IPv6 | IPv4 | v6 | v4 | Expiry | Pkts | Bytes | Pkts | Bytes | +------------------+------------------------------------------+------------------+---------+---------+--------+----------+--------------+----------+--------------+ Done
6. Перенаправлять DNS-запросы на вышестоящие DNS-серверы.
Когда NAT64 включен на пограничном маршрутизаторе, OpenThread попытается перенаправить DNS-запросы для интернет-доменов на вышестоящие DNS-серверы.
На конечном устройстве убедитесь, что DNS-сервером по умолчанию является пограничный маршрутизатор:
> dns config Server: [fd4d:b3e5:9738:3193:39c4:ee02:ca9e:2b1d]:53 ResponseTimeout: 6000 ms MaxTxAttempts: 3 RecursionDesired: yes ServiceMode: srv_txt_opt Nat64Mode: allow Done
IPv6-адрес сервера ( fd4d:b3e5:9738:3193:39c4:ee02:ca9e:2b1d
в приведенном выше примере) должен быть одним из адресов вашего пограничного маршрутизатора OpenThread.
Теперь вы можете отправлять DNS-запросы для интернет-доменов с конечного устройства:
> dns resolve example.com DNS response for example.com. - 2600:1406:3a00:21:0:0:173e:2e65 TTL:161 2600:1406:3a00:21:0:0:173e:2e66 TTL:161 2600:1406:bc00:53:0:0:b81e:94c8 TTL:161 2600:1406:bc00:53:0:0:b81e:94ce TTL:161 2600:1408:ec00:36:0:0:1736:7f24 TTL:161 2600:1408:ec00:36:0:0:1736:7f31 TTL:161 Done > dns resolve4 example.com DNS response for example.com. - fd16:a3d:e170:2:0:0:6007:80af TTL:300 fd16:a3d:e170:2:0:0:6007:80c6 TTL:300 fd16:a3d:e170:2:0:0:17c0:e450 TTL:300 fd16:a3d:e170:2:0:0:17c0:e454 TTL:300 fd16:a3d:e170:2:0:0:17d7:88 TTL:300 fd16:a3d:e170:2:0:0:17d7:8a TTL:300 Done
7. Поздравления
Поздравляем, вы успешно настроили пограничный маршрутизатор с поддержкой NAT64 и использовали его для предоставления доступа в Интернет конечным устройствам Thread!
Дальнейшее чтение
- Руководства OpenThread
- Справочник по интерфейсу командной строки OpenThread
- Справочник по API OpenThread для NAT64
- Справочник по API OpenThread для восходящего DNS
- Абстракция платформы OpenThread для DNS