1. Введение
Happy — это инструмент, созданный лабораторией Nest для легкой оркестровки смоделированных сетевых топологий. Happy полезен для разработки и тестирования домашних сетей IoT.
С Хэппи вы можете:
- Тестируйте сетевые протоколы и другие распределенные программы выполнения на одном компьютере для разработки Linux без использования оборудования IoT-устройства.
- Выполнение автоматизированного функционального тестирования в сети
- Запустите несколько одновременных параллельных сетей в одной системе, чтобы повысить производительность тестирования.
В этой лаборатории кода вы узнаете, как начать работу с Happy, а также познакомитесь с основами Weave для устройств IoT. Реализация Weave, которую вы будете использовать, — это OpenWeave , версия с открытым исходным кодом, выпущенная Nest.
Что вы узнаете
- Как построить Happy и OpenWeave
- Как вручную создать смоделированную сеть IoT
- Как управлять пользовательскими топологиями
- Как подключить смоделированную сеть Happy к Интернету
- Основы плетения
Что вам понадобится
- Linux-машина, физическая или виртуальная
- Git-клиент или cli
- Питон 2.7
- Базовое понимание концепций сетей и маршрутизации
2. Начать
Установите набор инструментов и зависимости
Чтобы собрать Happy и Weave, убедитесь, что у вас установлена поддерживаемая цепочка инструментов и все зависимости.
$ sudo apt-get update $ sudo apt-get install -y autotools-dev build-essential git lcov \ libdbus-1-dev libglib2.0-dev libssl-dev \ libudev-dev make python2.7 software-properties-common \ python-setuptools bridge-utils python-lockfile \ python-psutil $ sudo apt-get install -y --force-yes gcc-arm-none-eabi $ sudo apt-get update -qq
Получить исходный код
Клонируйте репозитории Happy и OpenWeave Git из командной строки:
$ cd ~ $ git clone https://github.com/openweave/happy.git $ git clone https://github.com/openweave/openweave-core.git
Установить Хэппи
Установите Happy из корневого каталога Happy:
$ cd ~/happy $ make
Подтвердить удачную установку
Команды Happy теперь должны быть доступны из командной строки:
$ happy-state State Name: happy NETWORKS Name Type State Prefixes NODES Name Interface Type IPs
Установить OpenWeave
Установите OpenWeave из корневого каталога OpenWeave:
$ cd ~/openweave-core $ make -f Makefile-Standalone
Настройте Happy с OpenWeave
Чтобы использовать OpenWeave с Happy, вам нужно сообщить Happy, где найти установку Weave. Обновите конфигурацию Happy, указав путь к /src/test-apps
в вашей сборке OpenWeave:
$ happy-configuration weave_path ~/openweave-core/build/x86_64-unknown-linux-gnu/src/test-apps
Подтвердите конфигурацию:
$ happy-configuration User Happy Configuration weave_path ~/openweave-core/build/x86_64-unknown-linux-gnu/src/test-apps
Проверьте установку OpenWeave
Команды Weave, необходимые в этой лаборатории кода, доступны из командной строки:
$ weave-fabric-add -h weave-fabric-add creates a weave fabric. weave-fabric-add [-h --help] [-q --quiet] [-i --id <FABRIC_ID>] Example: $ weave-fabric-add 123456 Creates a Weave Fabric with id 123456 return: 0 success 1 fail
Если вы получаете сообщение об ошибке weave-fabric-add: command not found
, обновите PATH
среды PATH, указав путь, используемый для двоичных файлов Happy:
$ export PATH=$PATH:~/openweave-core/src/test-apps/happy/bin
3. Ваша первая топология
Давайте создадим следующую топологию из трех узлов с помощью Happy.
Эта топология является примером простой домашней сети (HAN). В этой HAN два узла соединены вместе в сети Thread, и один из этих узлов подключается к третьему через Wi-Fi. Этот узел также можно подключить к домашнему беспроводному маршрутизатору, чтобы обеспечить подключение к Интернету для всей сети HAN. Подробнее об этом позже.
Сначала создайте три узла:
$ happy-node-add 01ThreadNode $ happy-node-add 02BorderRouter $ happy-node-add 03WiFiNode
Убедимся, что они существуют:
$ happy-node-list 01ThreadNode 02BorderRouter 03WiFiNode
Теперь давайте создадим несколько сетей:
$ happy-network-add ThreadNetwork thread $ happy-network-add WiFiNetwork wifi
Убедитесь, что сети существуют:
$ happy-network-list ThreadNetwork WiFiNetwork
Проверьте счастливое состояние:
$ happy-state State Name: happy NETWORKS Name Type State Prefixes ThreadNetwork thread UP WiFiNetwork wifi UP NODES Name Interface Type IPs 01ThreadNode 02BorderRouter 03WiFiNode
Недостаточно просто запустить сеть — мы должны добавить в сети узлы. Следуя нашей диаграмме топологии, добавьте каждый узел в соответствующую сеть (сети):
$ happy-node-join 01ThreadNode ThreadNetwork $ happy-node-join 02BorderRouter ThreadNetwork $ happy-node-join 02BorderRouter WiFiNetwork $ happy-node-join 03WiFiNode WiFiNetwork
Обратите внимание, что 02BorderRouter
был добавлен как в ThreadNetwork
, так и WiFiNetwork
. Это связано с тем, что в качестве пограничного маршрутизатора в нашей сети HAN этот узел соединяет вместе две отдельные сети.
Проверьте счастливое состояние. Интерфейсы каждого узла включены:
$ happy-state State Name: happy NETWORKS Name Type State Prefixes ThreadNetwork thread UP WiFiNetwork wifi UP NODES Name Interface Type IPs 01ThreadNode wpan0 thread 02BorderRouter wpan0 thread wlan0 wifi 03WiFiNode wlan0 wifi
Теперь наша топология выглядит так:
Последним шагом в создании нашей сети Happy является назначение IP-адресов каждому интерфейсу на каждом узле. Укажите префикс IP для сети, и Happy автоматически назначит вам IP-адреса.
Поскольку протокол Thread использует IPv6, добавьте префикс IPv6 в сеть Thread:
$ happy-network-address ThreadNetwork 2001:db8:1:2::
Проверьте счастливое состояние. Интерфейсы Thread на каждом узле Thread имеют IP-адреса:
$ happy-state State Name: happy NETWORKS Name Type State Prefixes ThreadNetwork thread UP 2001:0db8:0001:0002/64 WiFiNetwork wifi UP NODES Name Interface Type IPs 01ThreadNode wpan0 thread 2001:0db8:0001:0002:3e36:13ff:fe33:732e/64 02BorderRouter wpan0 thread 2001:0db8:0001:0002:a651:3eff:fe92:6dbc/64 wlan0 wifi 03WiFiNode wlan0 wifi
Для сети WiFi добавьте префиксы IPv4 и IPv6:
$ happy-network-address WiFiNetwork 2001:db8:a:b:: $ happy-network-address WiFiNetwork 10.0.1.0
Еще раз проверьте состояние счастья. Всем интерфейсам назначены IP-адреса, по два на каждый интерфейс Wi-Fi:
$ happy-state State Name: happy NETWORKS Name Type State Prefixes ThreadNetwork thread UP 2001:0db8:0001:0002/64 WiFiNetwork wifi UP 2001:0db8:000a:000b/64 10.0.1/24 NODES Name Interface Type IPs 01ThreadNode wpan0 thread 2001:0db8:0001:0002:3e36:13ff:fe33:732e/64 02BorderRouter wpan0 thread 2001:0db8:0001:0002:a651:3eff:fe92:6dbc/64 wlan0 wifi 10.0.1.2/24 2001:0db8:000a:000b:426c:38ff:fe90:01e6/64 03WiFiNode wlan0 wifi 2001:0db8:000a:000b:9aae:2bff:fe71:62fa/64 10.0.1.3/24
Вот наша обновленная топология:
4. Проверьте подключение
Теперь, когда наша сеть Happy настроена и работает, давайте проверим ее подключение, пропинговав другие узлы с 01ThreadNode
:
$ happy-ping 01ThreadNode 02BorderRouter [Ping] ping from 01ThreadNode to 02BorderRouter on address 10.0.1.2 -> 100% packet loss [Ping] ping from 01ThreadNode to 02BorderRouter on address 2001:0db8:0001:0002:a651:3eff:fe92:6dbc -> 0% packet loss [Ping] ping from 01ThreadNode to 02BorderRouter on address 2001:0db8:000a:000b:426c:38ff:fe90:01e6 -> 100% packet loss $ happy-ping 01ThreadNode 03WiFiNode [Ping] ping from 01ThreadNode to 03WiFiNode on address 2001:0db8:000a:000b:9aae:2bff:fe71:62fa -> 100% packet loss [Ping] ping from 01ThreadNode to 03WiFiNode on address 10.0.1.3 -> 100% packet loss
Команда happy-ping
пытается пропинговать каждый IP-адрес для каждого интерфейса на целевом узле. Мы можем игнорировать адреса IPv4, потому что Thread использует только IPv6.
Обратите внимание, что только один ping IPv6 был успешным: на интерфейсе 02BorderRouter
wpan0
, который является единственным адресом, к 01ThreadNode
может напрямую обратиться:
Не удалось использовать другие адреса IPv6, так как не включена переадресация между wpan0
и wlan0
на 02BorderRouter
. Таким образом, 01ThreadNode
понятия не имеет о существовании 03WiFiNode
или о том, как к нему добраться. Happy запустил смоделированную сеть, но не включил всю маршрутизацию и пересылку между узлами.
Добавить маршруты
Чтобы направить трафик IPv6 через HAN, добавьте правильные маршруты к каждому узлу в каждой сети в обоих направлениях (чтобы команда ping знала, как вернуться к исходному узлу).
Для каждого узла вам необходимо знать:
- ближайший сетевой шлюз — в данном случае
02BorderRouter
для обоих - целевая сеть — куда идти после шлюза
Для нашей трехузловой сети это дает нам следующее:
из исходной сети | в целевую сеть | через шлюз |
| | |
| | |
Это можно сделать индивидуально для каждого узла с помощью happy-node-route
, но проще сделать это для всех узлов в каждой сети с помощью happy-network-route
.
$ happy-network-route -a -i ThreadNetwork -t default -v 02BorderRouter -p 2001:db8:1:2::/64 $ happy-network-route -a -i WiFiNetwork -t default -v 02BorderRouter -p 2001:db8:a:b::/64
Для объяснения флагов командной строки используйте happy-network-route -h
.
Команда happy-network-route
также при необходимости включает переадресацию IPv4 и IPv6 для каждого узла. Это позволяет маршрутизировать трафик от одного интерфейса к другому внутри узла.
Теперь повторите пинг:
$ happy-ping 01ThreadNode 02BorderRouter [Ping] ping from 01ThreadNode to 02BorderRouter on address 10.0.1.2 -> 100% packet loss [Ping] ping from 01ThreadNode to 02BorderRouter on address 2001:0db8:0001:0002:a651:3eff:fe92:6dbc -> 0% packet loss [Ping] ping from 01ThreadNode to 02BorderRouter on address 2001:0db8:000a:000b:426c:38ff:fe90:01e6 -> 0% packet loss
Оба пинга IPv6 работают! При включенной пересылке он знает, как добраться до интерфейса wlan0
. Пинг IPv4 по-прежнему не работает, потому что мы настроили только маршруты и переадресацию IPv6 (также потому, что Thread не работает поверх IPv4).
Поскольку мы добавили сетевые маршруты в обе стороны, давайте пропингуем сети:
$ happy-ping 01ThreadNode 03WiFiNode [Ping] ping from 01ThreadNode to 03WiFiNode on address 2001:0db8:000a:000b:9aae:2bff:fe71:62fa -> 0% packet loss [Ping] ping from 01ThreadNode to 03WiFiNode on address 10.0.1.3 -> 100% packet loss
Пинг IPv6 работает как положено. Теперь у вас есть полнофункциональная смоделированная HAN IPv6.
Чтобы обеспечить более безопасный и надежный способ соединения всего вместе, давайте добавим Weave поверх HAN.
5. Добавляем переплетение
Weave — это уровень сетевых приложений, обеспечивающий безопасную и надежную коммуникационную основу для продуктов Nest. Мы можем добавить функциональность Weave с помощью OpenWeave, версии Weave с открытым исходным кодом.
Реализация Weave называется «ткань». Ткань Weave — это сеть, которая включает в себя все узлы HAN, службу Nest и любые мобильные устройства, участвующие в HAN. Он находится поверх HAN и обеспечивает более простую маршрутизацию по различным базовым технологиям сетевых каналов (например, Thread или Wi-Fi).
Создайте структуру Weave для своей HAN, используя fab1
в качестве идентификатора структуры, затем настройте все узлы для Weave:
$ weave-fabric-add fab1 $ weave-node-configure
Теперь, когда Weave настроен, проверьте состояние Happy:
$ happy-state State Name: happy NETWORKS Name Type State Prefixes ThreadNetwork thread UP 2001:0db8:0001:0002/64 WiFiNetwork wifi UP 2001:0db8:000a:000b/64 10.0.1/24 NODES Name Interface Type IPs 01ThreadNode wpan0 thread 2001:0db8:0001:0002:3e36:13ff:fe33:732e/64 fd00:0000:fab1:0006:6bca:9502:eb69:11e7/64 02BorderRouter wpan0 thread fd00:0000:fab1:0006:6a6a:f236:eb69:11e7/64 2001:0db8:0001:0002:a651:3eff:fe92:6dbc/64 wlan0 wifi fd00:0000:fab1:0001:6a6a:f236:eb69:11e7/64 10.0.1.2/24 2001:0db8:000a:000b:426c:38ff:fe90:01e6/64 03WiFiNode wlan0 wifi 2001:0db8:000a:000b:9aae:2bff:fe71:62fa/64 10.0.1.3/24 fd00:0000:fab1:0001:6b82:6e60:eb69:11e7/64
Каждый узел был добавлен в структуру Weave, и каждый интерфейс имеет новый IPv6-адрес, начинающийся с fd00
. Чтобы получить больше информации о ткани Weave, используйте команду weave-state
:
$ weave-state State Name: weave NODES Name Weave Node Id Pairing Code 01ThreadNode 69ca9502eb6911e7 8ZJB5Q 02BorderRouter 686af236eb6911e7 B5YV3P 03WiFiNode 69826e60eb6911e7 L3VT3A FABRIC Fabric Id Global Prefix fab1 fd00:0000:fab1::/48
Вот наша обновленная топология со значениями Weave, выделенными синим цветом:
Ткать ткань
В состояниях Weave и Happy появилось много новой информации. Начнем с ткани из weave-state
:
FABRIC Fabric Id Global Prefix fab1 fd00:0000:fab1::/48
Weave использует префикс IPv6 fd00::/48
для каждого узла. Адреса в этом блоке называются уникальными локальными адресами и предназначены для использования в частных сетях, таких как HAN. В сочетании с идентификатором Fabric создается глобальный префикс Weave, показанный выше.
Узлы плетения
Каждому узлу в ткани Weave назначается уникальный идентификатор узла вместе с кодом сопряжения:
NODES Name Weave Node Id Pairing Code 01ThreadNode 69ca9502eb6911e7 8ZJB5Q 02BorderRouter 686af236eb6911e7 B5YV3P 03WiFiNode 69826e60eb6911e7 L3VT3A
Идентификатор узла глобально идентифицирует узел в структуре Weave. Код сопряжения используется в качестве «удостоверения участника» в процессе сопряжения и обычно печатается вместе с QR-кодом продукта.
Например, если вы посмотрите на QR-код Nest Protect или Nest Cam, вы заметите строку из 6 символов, которую часто называют ключом входа. Это Код Сопряжения Плетения.
Weave использует комбинацию глобального префикса, идентификатора фабрики и идентификатора узла для создания специфичных для Weave IPv6-адресов для каждого узла и интерфейса в фабрике.
Сплетите адреса
Обратите внимание, что в топологии Happy есть четыре новых адреса IPv6, все они начинаются с нашего глобального префикса Weave fd00:0000:fab1::/48
.
NODES Name Interface Type IPs 01ThreadNode wpan0 thread 2001:0db8:0001:0002:3e36:13ff:fe33:732e/64 fd00:0000:fab1:0006:6bca:9502:eb69:11e7/64 02BorderRouter wpan0 thread fd00:0000:fab1:0006:6a6a:f236:eb69:11e7/64 2001:0db8:0001:0002:a651:3eff:fe92:6dbc/64 wlan0 wifi fd00:0000:fab1:0001:6a6a:f236:eb69:11e7/64 10.0.1.2/24 2001:0db8:000a:000b:426c:38ff:fe90:01e6/64 03WiFiNode wlan0 wifi 2001:0db8:000a:000b:9aae:2bff:fe71:62fa/64 10.0.1.3/24 fd00:0000:fab1:0001:6b82:6e60:eb69:11e7/64
Протоколы Weave используют эти адреса для связи через ткань Weave, а не стандартные адреса IPv6, назначенные каждому узлу.
Сетевой шлюз Weave
Узлы Weave в сети Thread должны знать, где выйти из этой сети. Сетевой шлюз Weave — обычно на пограничном маршрутизаторе потоков — обеспечивает эту функциональность.
В нашем примере топологии давайте назначим узел BorderRouter в качестве сетевого шлюза Weave:
$ weave-network-gateway ThreadNetwork 02BorderRouter
Эта команда добавляет маршрут от всех узлов Thread к подсети структуры Weave ( fd:0:fab1::/48
) через интерфейс Thread узла BorderRouter
( wpan0
), что позволяет каждому узлу Thread достигать любого узла Weave за пределами сети Thread. Это аналогично команде happy-network-route
, которую мы использовали ранее, но специфичной для маршрутов ткани Weave.
6. Обслуживание топологии
Что делает Happy таким мощным, так это то, что он легко управляет всей настройкой и демонтажем смоделированной топологии.
Сохраните свою топологию Happy для дальнейшего использования:
$ happy-state -s codelab.json
Это помещает файл JSON с полной топологией в вашу корневую папку ~/
. Файл JSON — это копия вашего текущего состояния счастья, которое находится по адресу ~/.happy_state.json
.
После сохранения удалите текущую топологию:
$ happy-state-delete
Это удалит все сетевые пространства имен и связанные с ними конфигурации, найденные в файле ~/.happy-state.json
. Проверьте happy-state
и weave-state
, чтобы подтвердить пустую конфигурацию:
$ happy-state State Name: happy NETWORKS Name Type State Prefixes NODES Name Interface Type IPs $ weave-state State Name: weave NODES Name Weave Node Id Pairing Code FABRIC Fabric Id Global Prefix
Чтобы перезагрузить сохраненную конфигурацию, используйте одну из двух команд:
-
happy-state-load
— не поддерживает плагин Weave -
weave-state-load
— поддерживает плагин Weave
Поэтому, если ваша топология включает Weave, всегда используйте команду weave-state-load
, чтобы применялась ткань Weave и соответствующая конфигурация.
Перезагрузите сохраненную топологию Happy:
$ weave-state-load codelab.json
Проверьте все состояния, чтобы подтвердить успешную загрузку:
$ happy-state State Name: happy NETWORKS Name Type State Prefixes ThreadNetwork thread UP 2001:0db8:0001:0002/64 WiFiNetwork wifi UP 2001:0db8:000a:000b/64 10.0.1/24 NODES Name Interface Type IPs 01ThreadNode wpan0 thread 2001:0db8:0001:0002:eef6:a0ff:feca:6697/64 fd00:0000:fab1:0006:6bca:9502:eb69:11e7/64 02BorderRouter wpan0 thread fd00:0000:fab1:0006:6a6a:f236:eb69:11e7/64 2001:0db8:0001:0002:5e53:bbff:fe05:484b/64 wlan0 wifi 2001:0db8:000a:000b:2e61:fdff:fed9:4fbc/64 fd00:0000:fab1:0001:6a6a:f236:eb69:11e7/64 10.0.1.2/24 03WiFiNode wlan0 wifi fd00:0000:fab1:0001:6b82:6e60:eb69:11e7/64 10.0.1.3/24 2001:0db8:000a:000b:5e8e:c9ff:fed2:bdd1/64 $ weave-state State Name: weave NODES Name Weave Node Id Pairing Code 01ThreadNode 69ca9502eb6911e7 8ZJB5Q 02BorderRouter 686af236eb6911e7 B5YV3P 03WiFiNode 69826e60eb6911e7 L3VT3A FABRIC Fabric Id Global Prefix fab1 fd00:0000:fab1::/48
Ряд предопределенных топологий предоставлен в репозитории Happy как в формате shell-script, так и в формате JSON. Найдите их в ~/happy/topologies
.
OpenWeave также поставляется с некоторыми предварительно определенными топологиями Happy для целей тестирования. Найдите их в ~/openweave-core/src/test-apps/happy/topologies/standalone
.
7. Как это работает
Happy использует сетевые пространства имен Linux для имитации сложных топологий. Как правило, сетевая конфигурация применяется ко всей ОС Linux. Сетевые пространства имен позволяют разделять сетевые конфигурации таким образом, чтобы каждое пространство имен имело собственный набор интерфейсов и таблиц маршрутизации.
Каждый узел и сеть в Happy — это сетевое пространство имен, а ссылки между ними — это сетевые интерфейсы.
Например, используя нашу топологию:
Давайте посмотрим, какие пространства имен Happy создал для этого:
$ ip netns list happy004 happy003 happy002 happy001 happy000
Если вы проверите раздел netns
файла JSON состояния Happy, вы увидите, каким узлам и сетям соответствует каждое пространство имен:
$ happy-state -j | grep "netns" -A 5 "netns": { "01ThreadNode": "000", "02BorderRouter": "001", "03WiFiNode": "002", "ThreadNetwork": "003", "WiFiNetwork": "004",
Журналы времени выполнения
Команды, отправляемые узлам, являются базовыми терминальными командами, выполняемыми из пространства имен каждого узла. Простой способ убедиться в этом — включить журналы времени выполнения Happy.
Откройте второе окно терминала и включите журналы, они будут работать непрерывно в этом окне:
$ happy-state -l
Вернитесь к первому окну и запустите Happy ping:
$ happy-ping 01ThreadNode 02BorderRouter
Проверьте самые последние записи журнала во втором окне терминала. В логах вы должны увидеть такую строчку:
DEBUG [Driver:CallCmd():416] Happy [happy]: > sudo ip netns exec happy000 ping6 -c 1 2001:0db8:0001:0002:5e53:bbff:fe05:484b
Команда happy-ping
— это не что иное, как Happy, запускающая команду ping6
в пространстве имен happy000
( 01ThreadNode
).
Введите узел
Используйте happy-shell
для запуска не-Happy-команд, как если бы вы вошли в один из узлов (сетевые пространства имен):
$ happy-shell 01ThreadNode root@01ThreadNode:#
Симулированные устройства запускаются в каждом пространстве имен и имеют доступ только к конфигурации сети, указанной через Happy.
Проверьте конфигурацию интерфейса для узла. Это будет отличаться от конфигурации вашей ОС и должно отражать то, что указано в состоянии «Счастливо»:
root@01ThreadNode:# ifconfig lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:1 errors:0 dropped:0 overruns:0 frame:0 TX packets:1 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1 RX bytes:152 (152.0 B) TX bytes:152 (152.0 B) wpan0 Link encap:Ethernet HWaddr ec:f6:a0:ca:66:97 inet6 addr: fd00:0:fab1:6:6bca:9502:eb69:11e7/64 Scope:Global inet6 addr: 2001:db8:1:2:eef6:a0ff:feca:6697/64 Scope:Global inet6 addr: fe80::eef6:a0ff:feca:6697/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:32 errors:0 dropped:0 overruns:0 frame:0 TX packets:26 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:2832 (2.8 KB) TX bytes:2348 (2.3 KB)
Используйте exit
, чтобы выйти из пространства имен узла:
root@01ThreadNode:# exit
8. Подключиться к сервису
Поняв, как Happy использует сетевые пространства имен Linux, вы теперь можете понять, что можно подключить смоделированную сеть Happy к Интернету и получить доступ к публичным адресам из смоделированных узлов. Это полезно для подключения смоделированных устройств к реальному сервису (например, Nest Service через Weave).
Услуга в Weave представляет собой облачную инфраструктуру, которая соединяет узлы HAN в модель данных, обеспечивает удаленный доступ и внедряет интеллектуальные контроллеры для создания комплексной экосистемы.
Услуга может быть представлена двумя основными способами с помощью Happy:
- Как смоделированная служба в собственном сетевом пространстве имен (Happy node)
- Как настоящий облачный сервис в Интернете
Предопределенные топологии представлены в ~/happy/topologies
в качестве примера каждого сценария службы.
Симулированный сервис на узле Happy
Удалите все существующие топологии Happy:
$ happy-state-delete
Подтвердите пустое состояние с помощью команд happy-state
и weave-state
.
Загрузите предопределенную топологию с точкой доступа (AP) и сервисными узлами:
$ weave-state-load ~/happy/topologies/thread_wifi_ap_service.json
Проверьте состояния Happy и Weave, чтобы подтвердить топологию. В этой топологии onhub
— это точка доступа, а cloud
— имитируемая служба. Обратите внимание, что оба подключены к сети Internet
типа wan
:
$ happy-state State Name: happy NETWORKS Name Type State Prefixes HomeThread thread UP 2001:0db8:0111:0001/64 HomeWiFi wifi UP 2001:0db8:0222:0002/64 10.0.1/24 Internet wan UP 192.168.100/24 NODES Name Interface Type IPs BorderRouter wpan0 thread 2001:0db8:0111:0001:f624:13ff:fe4a:6def/64 fd00:0000:fab1:0006:1ab4:3000:0000:0005/64 wlan0 wifi 10.0.1.2/24 fd00:0000:fab1:0001:1ab4:3000:0000:0005/64 2001:0db8:0222:0002:9e31:97ff:fe73:29f0/64 ThreadNode wpan0 thread 2001:0db8:0111:0001:c237:fbff:fecc:b082/64 fd00:0000:fab1:0006:1ab4:3000:0000:0009/64 cloud eth0 wan 192.168.100.3/24 onhub wlan0 wifi 10.0.1.3/24 2001:0db8:0222:0002:3266:20ff:fe98:6ee2/64 eth0 wan 192.168.100.2/24 $ weave-state State Name: weave NODES Name Weave Node Id Pairing Code BorderRouter 18B4300000000005 AAA123 ThreadNode 18B4300000000009 AAA123 FABRIC Fabric Id Global Prefix fab1 fd00:0000:fab1::/48
Переплетите туннель
Туннель Weave соединяет структуру Weave со службой. Это безопасный маршрут, по которому передаются сообщения IPv6 UDP между HAN и службой. В этой топологии узел BorderRouter
является сетевым шлюзом Weave, который функционирует как конечная точка туннеля в HAN.
Создайте туннель Weave:
$ weave-tunnel-start BorderRouter cloud
Перепроверьте счастливое состояние. Вы должны увидеть новый интерфейс туннеля с адресом Weave IPv6 на cloud
узле:
NODES Name Interface Type IPs cloud service-tun0 tun fd00:0000:fab1:0005:1ab4:3002:0000:0011/64 eth0 wan 192.168.100.3/24
Теперь вы можете успешно выполнять эхо-запросы между узлами в структуре Weave и глобальным префиксом Weave службы:
$ happy-ping ThreadNode cloud [Ping] ping from ThreadNode to cloud on address fd00:0000:fab1:0005:1ab4:3002:0000:0011 -> 0% packet loss
Настоящий облачный сервис в Интернете
Удалите все существующие топологии Happy:
$ happy-state-delete
Подтвердите пустое состояние с помощью команд happy-state
и weave-state
.
Загрузите предопределенную топологию с узлом точки доступа (AP):
$ weave-state-load ~/happy/topologies/thread_wifi_ap_internet.json
В этой топологии onhub
является точкой доступа. Проверьте счастливое состояние. Это похоже на предыдущую топологию, без Internet
-сети и cloud
узла:
$ happy-state State Name: happy NETWORKS Name Type State Prefixes HomeThread thread UP 2001:0db8:0111:0001/64 HomeWiFi wifi UP 2001:0db8:0222:0002/64 10.0.1/24 NODES Name Interface Type IPs BorderRouter wpan0 thread 2001:0db8:0111:0001:ca3f:71ff:fe53:1559/64 fd00:0000:fab1:0006:1ab4:3000:0000:0006/64 wlan0 wifi 2001:0db8:0222:0002:32e7:dfff:fee2:107a/64 fd00:0000:fab1:0001:1ab4:3000:0000:0006/64 10.0.1.2/24 ThreadNode wpan0 thread 2001:0db8:0111:0001:c2fb:97ff:fe04:64bd/64 fd00:0000:fab1:0006:1ab4:3000:0000:000a/64 onhub wlan0 wifi 10.0.1.3/24 2001:0db8:0222:0002:3a3c:8dff:fe38:999b/64 $ weave-state State Name: weave NODES Name Weave Node Id Pairing Code BorderRouter 18B4300000000006 AAA123 ThreadNode 18B430000000000A AAA123 FABRIC Fabric Id Global Prefix fab1 fd00:0000:fab1::/48
Поскольку каждый узел Happy является сетевым пространством имен, по умолчанию они отделены от общедоступного Интернета. Проверьте это, войдя в узел Happy и пропинговав общедоступный интернет-адрес. Мы будем использовать 8.8.8.8
, один из IPv4-адресов google.com.
$ happy-shell onhub root@onhub:# ping -c2 8.8.8.8 connect: Network is unreachable
Чтобы подключить узел onhub
к Интернету, он должен быть подключен к этому интерфейсу в конфигурации на уровне ОС Linux.
Выход из узла:
root@onhub:# exit
Определите интерфейс для вашего интернет-соединения с помощью команды route
:
$ route Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface default 192.168.1.0 0.0.0.0 UG 0 0 0 em1
Найдите маршрут по default
. Это подключение к Интернету для вашего компьютера с Linux. В столбце Iface
указано, какой интерфейс используется для данного соединения. В приведенном выше примере это em1
.
Используйте happy-internet
для настройки моста, используя интерфейс для вашего маршрута по умолчанию. Для флага --isp
используйте имя интерфейса без конечных номеров. В этом примере это em
. Если ваш интерфейс по умолчанию — eth1
, флаг --isp
будет eth
.
$ happy-internet --node onhub --interface em1 --isp em --seed 249
В выводе happy-state
не будет видимых изменений, но узел onhub
должен иметь подключение к Интернету. Вернемся к узлу и проверим:
$ happy-shell onhub root@onhub:# ping -c2 8.8.8.8 PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. 64 bytes from 8.8.8.8: icmp_seq=1 ttl=56 time=1.81 ms 64 bytes from 8.8.8.8: icmp_seq=2 ttl=56 time=1.81 ms --- 8.8.8.8 ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1001ms rtt min/avg/max/mdev = 1.814/1.816/1.819/0.042 ms
Успех!
DNS
Счастливые узлы не имеют встроенных возможностей DNS. Если вы попытаетесь пропинговать google.com, произойдет сбой:
root@onhub:# ping -c2 google.com ping: unknown host google.com
К счастью, Happy обеспечивает поддержку DNS. Выйдите из узла и найдите DNS-серверы для вашего компьютера с Linux. Обязательно используйте соответствующий интерфейс по умолчанию:
root@onhub:# exit $ nmcli dev list iface em1 | grep domain_name_servers DHCP4.OPTION[13]: domain_name_servers = 172.16.255.1 172.16.255.153 172.16.255.53
Используйте эти DNS-адреса с happy-dns
:
$ happy-dns 172.16.255.1 172.16.255.153 172.16.255.53
Теперь попробуйте пропинговать google.com из узла onhub
:
$ happy-shell onhub root@onhub:# ping -c2 google.com PING google.com (64.233.191.113) 56(84) bytes of data. 64 bytes from ja-in-f113.1e100.net (64.233.191.113): icmp_seq=1 ttl=46 time=36.9 ms 64 bytes from ja-in-f113.1e100.net (64.233.191.113): icmp_seq=2 ttl=46 time=37.0 ms --- google.com ping statistics --- 2 packets transmitted, 2 received, 0% packet loss, time 1001ms rtt min/avg/max/mdev = 36.978/36.995/37.013/0.193 ms
Выйдите из узла onhub
, когда закончите:
root@onhub:# exit
Переплетите туннель
Как и смоделированный сервис, туннель Weave должен быть настроен между смоделированным HAN в Happy и сервисом. В реальной облачной службе используйте IP-адрес или URL-адрес службы в настройке туннеля. Например:
$ weave-tunnel-start BorderRouter mycloud.service.com
9. Уборка
Важно всегда очищать топологии Happy, когда вы закончите с ними, чтобы избежать проблем с конфигурацией вашей сети Linux.
Если вы включили поддержку DNS в своей топологии, удалите ее , повторно запустив эту команду с флагом -d
(удалить). Это необходимо выполнить перед удалением любых узлов Happy, чтобы убедиться, что конфигурация сети правильно обновлена.
$ happy-dns -d 172.16.255.1 172.16.255.153 172.16.255.53
Затем удалите счастливое состояние:
$ happy-state-delete
Иногда некоторые файлы состояния могут оставаться после удаления состояния. Если вы столкнулись с проблемами, и Happy не работает должным образом, удалите состояние с помощью happy-state-delete
а затем используйте следующие команды, чтобы принудительно выполнить оставшуюся очистку:
$ ip netns | xargs -I {} sudo ip netns delete {} $ rm -rf ~/.*state.json $ rm -rf ~/.*state.json.lock
Ваша машина должна вернуться к своей нормальной сетевой конфигурации.
10. Поздравляем!
Теперь вы знаете:
- Как использовать Happy для имитации собственных домашних сетей IoT
- Как подключить топологию Happy к интернету
- Основы Weave через OpenWeave, версию Weave с открытым исходным кодом от Nest.
Следующие шаги
Основываясь на этой Codelab, попробуйте выполнить следующие упражнения:
- Создайте более крупную топологию с несколькими узлами в каждой сети Thread и Wi-Fi и установите связь между всеми узлами.
- Создайте bash-скрипт для загрузки топологии через
happy-state-load
илиweave-state-load
- Изучите другие команды Happy, такие как
happy-traceroute
иhappy-process-*
дальнейшее чтение
Посетите openweave.io , чтобы найти множество ссылок, в том числе: