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

1. Введение

7299534792dd9439.png

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

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

Что такое 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 и устройство потока, а затем включить и проверить связь между устройствами потока и хостами IPv4 в Интернете через пограничный маршрутизатор OpenThread.

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

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

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

  • Рабочая станция Linux для создания и прошивки Thread NCP, интерфейса командной строки OpenThread и тестирования подключения IPv4.
  • Raspberry Pi 4 с 4 ГБ ОЗУ для пограничного маршрутизатора Thread. Ваша рабочая станция Linux должна быть доступна по IPv4 с этого устройства.
  • 2 платы Nordic Semiconductor nRF52840 DK.

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

c3cd2e081bc052fd.png

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

Выполните шаг настройки OTBR в лаборатории кода Thread Border Router — двунаправленное подключение IPv6 и обнаружение служб на основе DNS , чтобы создать граничный маршрутизатор OpenThread со следующим изменением:

В разделе «Сборка и установка OTBR» вам нужно указать сценарию включить транслятор NAT64 в OpenThread, установив для переменной среды NAT64 значение 1 , а NAT64_SERVICE — значение openthread . Выполните следующую команду перед шагом:

$ export NAT64=1 NAT64_SERVICE=openthread

Продолжите работу с лабораторным кодом Thread Border Router — двунаправленное подключение IPv6 и обнаружение служб на основе DNS, как написано. После Form a Thread network вы можете убедиться, что граничный маршрутизатор публикует префикс NAT64 с помощью команд интерфейса командной строки OpenThread.

Во-первых, убедитесь, что наш пограничный маршрутизатор запущен и работает, а NAT64 включен на пограничном маршрутизаторе:

$ sudo ot-ctl state
leader
Done
$ sudo ot-ctl nat64 enable
Done
$ sudo ot-ctl nat64 state
PrefixManager: Active
Translator: Active
Done

Мы должны увидеть, что OTBR выступает в качестве лидера потока, а префикс NAT64 (в нашем случае fd4c:9574:3720:2:0:0::/96 ) в сетевых данных потока:

$ sudo ot-ctl netdata show
Prefixes:
fd4c:9574:3720:1::/64 paos low 0800
Routes:
fd49:7770:7fc5:0::/64 s med 0800
fd4c:9574:3720:2:0:0::/96 sn low 0800
Services:
44970 01 41000500000e10 s 0800
44970 5d fdd20e532b87b93f50ad4eea0450f1bfd11f s 0800
Done

Префикс 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_JOINER=ON -DOT_COMMISSIONER=ON -DOT_DNS_CLIENT=ON -DOT_SRP_CLIENT=ON -DOT_ECDSA=ON

Продолжите работу с сетью Build a Thread с платами nRF52840 и лабораторией кода OpenThread, как написано. После того как на конечное устройство будет загружен образ CLI, следуйте указаниям Thread Border Router — двунаправленное подключение IPv6 и обнаружение службы на основе DNS, чтобы настроить конечное устройство Thread.

Подождите несколько секунд после настройки конечного устройства Thread и убедитесь, что подключение к сети Thread прошло успешно. Вы должны найти префикс NAT64 в сетевых данных (в нашем случае fd4c:9574:3720:2:0:0::/96 ):

> netdata show
Prefixes:
fd4c:9574:3720:1::/64 paos low 0800
Routes:
fd49:7770:7fc5:0::/64 s med 0800
fd4c:9574:3720:2:0:0::/96 sn low 0800
Services:
44970 01 41000500000e10 s 0800
44970 5d fdd20e532b87b93f50ad4eea0450f1bfd11f s 0800
Done

Убедитесь, что сетевые данные совпадают с данными из OTBR.

4. Общайтесь с хостами IPv4 с конечного устройства Thread.

Теперь вы можете общаться с хостами в сети IPv4 с конечного устройства, которое мы только что настроили.

Отправлять эхо-запросы ICMP на хосты IPv4

Из интерфейса командной строки нашего конечного устройства Thread:

> ping 8.8.8.8
Pinging synthesized IPv6 address: fd4c:9574:3720:2:0:0:808:808
16 bytes from fd4c:9574:3720:2:0:0:808:808: icmp_seq=15 hlim=119 time=48ms
1 packets transmitted, 1 packets received. Packet loss = 0.0%. Round-trip min/avg/max = 48/48.0/48 ms.
Done

Пограничный маршрутизатор создает элемент сопоставления NAT64 для этого устройства с помощью команды nat64 mappings :

$ sudo ot-ctl nat64 mappings
|                  | Address                                                     |        | 4 to 6                  | 6 to 4                  |
+------------------+-------------------------------------------------------------+--------+-------------------------+-------------------------+
| ID               | IPv6                                     | IPv4             | Expiry | Pkts     | Bytes        | Pkts     | Bytes        |
+------------------+------------------------------------------+------------------+--------+----------+--------------+----------+--------------+
| 377ee63dd3127f1a |     fd4c:9574:3720:1:1d61:b4c1:494f:f975 |  192.168.255.254 |  7190s |        1 |           16 |        1 |           16 |
|                  |                                                                  TCP |        0 |            0 |        0 |            0 |
|                  |                                                                  UDP |        0 |            0 |        0 |            0 |
|                  |                                                                 ICMP |        1 |           16 |        1 |           16 |
Done

fd4c:9574:3720:1:1d61:b4c1:494f:f975 должен быть IPv6-адресом вашего устройства Thread.

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

Отправка DNS-запросов на DNS-серверы IPv4

Используйте dns resolve4 для разрешения имени хоста в сети IPv4. Адрес DNS-сервера также может быть адресом IPv4:

> dns resolve4 example.com 8.8.8.8
Synthesized IPv6 DNS server address: fd4c:9574:3720:2:0:0:808:808
DNS response for example.com. - fd4c:9574:3720:2:0:0:5db8:d822 TTL:20456 
Done

Связь через TCP

Можно установить TCP-соединения между конечным устройством и хостами в сети IPv4.

Предположим, что 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: fd4c:9574:3720: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

Можно обмениваться данными с помощью UDP между устройствами Thread и хостами в сети IPv4.

Предположим, что IP-адрес вашего хоста Linux IPv4 — 192.168.0.2 .

Используйте nc для прослушивания UDP-соединений:

$ nc -u -l 0.0.0.0 12345

С конечного устройства потока установите UDP-соединение и отправьте сообщения на хост Linux IPv4:

> udp open
Done
> udp connect 192.168.0.2 12345
Connecting to synthesized IPv6 address: fd4c:9574:3720: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 fd4c:9574:3720:2:0:0:c0a8:2 12345 world

5. Включите NAT64 на пограничном маршрутизаторе.

Вы можете включить или отключить NAT64 в любое время. Используйте nat64 disable , чтобы отключить NAT64. И используйте nat64 state для проверки состояния NAT64.

$ sudo ot-ctl nat64 disable
Done
$ sudo ot-ctl nat64 state
PrefixManager: Disabled
Translator: Disabled
Done

После отключения устройство больше не публикует префикс NAT64:

$ sudo ot-ctl netdata show
Prefixes:
fd4c:9574:3720:1::/64 paos low 0800
Routes:
fd49:7770:7fc5:0::/64 s med 0800
Services:
44970 01 41000500000e10 s 0800
44970 5d fdd20e532b87b93f50ad4eea0450f1bfd11f s 0800
Done

Кроме того, устройства в сети Thread больше не могут получить доступ к хосту IPv4 через этот пограничный маршрутизатор.

Из интерфейса командной строки нашего конечного устройства Thread:

> ping 8.8.8.8
Error 13: InvalidState

Используйте nat64 enable , чтобы включить NAT64. Прежде чем менеджер префиксов начнет объявлять префикс NAT64, может пройти некоторое время:

$ sudo ot-ctl nat64 enable
Done
$ sudo ot-ctl nat64 state
PrefixManager: Idle
Translator: NotWorking
Done

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

$ sudo ot-ctl nat64 state
PrefixManager: Active
Translator: Active
Done
$ sudo ot-ctl netdata show
Prefixes:
fd4c:9574:3720:1::/64 paos low 0800
Routes:
fd49:7770:7fc5:0::/64 s med 0800
fd4c:9574:3720:2:0:0::/96 sn low 0800
Services:
44970 01 41000500000e10 s 0800
44970 5d fdd20e532b87b93f50ad4eea0450f1bfd11f s 0800
Done

Обратите внимание, что отключение NAT64 очистит таблицу сопоставления:

$ sudo ot-ctl nat64 mappings
|                  | Address                                                     |        | 4 to 6                  | 6 to 4                  |
+------------------+-------------------------------------------------------------+--------+-------------------------+-------------------------+
| ID               | IPv6                                     | IPv4             | Expiry | Pkts     | Bytes        | Pkts     | Bytes        |
+------------------+------------------------------------------+------------------+--------+----------+--------------+----------+--------------+
Done

6. Перенаправлять DNS-запросы на вышестоящие DNS-серверы.

Когда NAT64 включен на пограничном маршрутизаторе, OpenThread попытается перенаправить DNS-запросы для интернет-доменов на вышестоящие DNS-серверы.

Эта функция поддерживается внутренним сервером DNS-SD, поэтому необходимо убедиться, что сервер DNS-SD включен.

$ sudo ot-ctl srp server state
running
Done

Если он не running , то включите его:

$ sudo ot-ctl srp server enable
Done

Убедитесь, что восходящий DNS-прокси включен:

$ sudo ot-ctl dns server upstream
Enabled
Done

Если он не Enabled , то включите его:

$ sudo ot-ctl dns server upstream enable
Done

На конечных устройствах убедитесь, что клиент SRP включен, чтобы он отправлял DNS-запросы на пограничный маршрутизатор:

> srp client state
Enabled
Done

Если он не Enabled , то включите его:

> srp client autostart enable
Done

На вашем конечном устройстве убедитесь, что DNS-сервером по умолчанию является пограничный маршрутизатор:

> dns config
Server: [fdd2:0e53:2b87:b93f:50ad:4eea:0450:f1bf]:53
ResponseTimeout: 6000 ms
MaxTxAttempts: 3
RecursionDesired: yes
Done

IPv6-адрес сервера ( fdd2:0e53:2b87:b93f:50ad:4eea:0450:f1bf в приведенном выше примере) должен быть одним из адресов вашего пограничного маршрутизатора OpenThread.

Теперь вы можете отправлять DNS-запросы для интернет-доменов с конечного устройства:

> dns resolve example.com
DNS response for example.com. - 2606:2800:220:1:248:1893:25c8:1946 TTL:8720 
Done
> dns resolve4 example.com
DNS response for example.com. - fd4c:9574:3720:2:0:0:5db8:d822 TTL:20456 
Done

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

Поздравляем, вы успешно настроили граничный маршрутизатор с поддержкой NAT64 и использовали его для предоставления доступа в Интернет конечным устройствам Thread!

дальнейшее чтение

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