Пограничный маршрутизатор потока — обеспечивает доступ в Интернет через NAT64.

1. Введение

7299534792dd9439.png

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

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

Что такое OpenThread?

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

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

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

NAT64

NAT64 — это механизм, позволяющий хостам в сетях, использующих только IPv6, получать доступ к ресурсам в сетях IPv4. Шлюз NAT64 является транслятором между протоколами IPv4 и IPv6.

Транслятор NAT64, входящий в состав OpenThread Border Router, поддерживает преобразование протоколов TCP, UDP и ICMP (ICMPv6).

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

В этом практическом задании вы настроите пограничный маршрутизатор OpenThread (OTBR) и устройство Thread, а затем включите и проверите связь между устройствами Thread и хостами IPv4 в Интернете через пограничный маршрутизатор OpenThread.

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

  • Как собрать пограничный маршрутизатор OpenThread с функциями NAT64.
  • Как взаимодействовать с хостами IPv4 с устройств Thread.

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

  • Рабочая станция под управлением Linux для сборки и прошивки Thread RCP, интерфейса командной строки OpenThread и тестирования IPv4-подключения.
  • Для работы с пограничным маршрутизатором Thread требуется Raspberry Pi. Ваша рабочая станция под управлением Linux должна быть доступна по протоколу IPv4 с этого устройства.
  • 2 USB-адаптера Nordic Semiconductor nRF52840 (один для RCP, другой для концевого устройства Thread).

Топология сети для данной практической работы:

c3cd2e081bc052fd.png

2. Настройка пограничного маршрутизатора OpenThread.

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

После завершения настройки OTBR используйте ot-ctl для проверки того, что служба NAT64 включена на пограничном маршрутизаторе:

> nat64 state
PrefixManager: Active
Translator: Active
Done

Пограничный маршрутизатор Thread публикует префикс NAT64 в сетевых данных Thread:

> 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. Настройка устройства для завершения потока

Для сборки и прошивки конечного устройства nRF52840 CLI выполните следующие действия, описанные в шаге «Настройка FTD» из практического руководства по созданию сети Thread с использованием плат nRF52840 и OpenThread , внеся изменения в следующий шаг:

При сборке и прошивке необходимо добавить к командной строке -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 можно посмотреть в данных сети Thread.

> 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

Из командной строки нашего конечного устройства 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

В сети IPv4 возможна связь по протоколу UDP между устройствами Thread и хостами.

Предположим, 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 через этот пограничный маршрутизатор.

Из командной строки нашего конечного устройства 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!

Дополнительная информация

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