Поделиться через


Тестирование подключения к брокеру MQTT с помощью клиентов MQTT

Внимание

На этой странице содержатся инструкции по управлению компонентами Операций Интернета вещей Azure с помощью манифестов развертывания Kubernetes, которые доступны в предварительной версии. Эта функция предоставляется с несколькими ограничениями и не должна использоваться для рабочих нагрузок.

Юридические условия, применимые к функциям Azure, которые находятся в состоянии бета-версии, предварительной версии или иным образом еще не выпущены в общедоступной версии, см. на странице Дополнительные условия использования предварительных версий в Microsoft Azure.

В этой статье показаны различные способы проверки подключения к брокеру MQTT с клиентами MQTT в непроизводственных средах.

По умолчанию брокер MQTT:

Внимание

Для рабочих сценариев следует использовать проверку подлинности учетных записей TLS и служб для защиты решения Интернета вещей. Дополнительные сведения см. в разделе:

Перед началом установки или настройки операций Интернета вещей. Используйте следующие параметры для проверки подключения к брокеру MQTT с клиентами MQTT в непроизводной среде.

Подключение к прослушивателю по умолчанию в кластере

Первым вариантом является подключение из кластера. Этот параметр использует конфигурацию по умолчанию и не требует дополнительных обновлений. В следующих примерах показано, как подключиться из кластера с помощью обычного альпийского linux и часто используемого клиента MQTT, используя учетную запись службы и сертификат корневого ЦС по умолчанию.

Скачайте mqtt-client.yaml развертывание из примера репозитория GitHub.

Внимание

Не используйте клиент MQTT в рабочей среде. Клиент предназначен только для тестирования.

wget https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/mqtt-client.yaml -O mqtt-client.yaml

Примените файл развертывания с kubectl.

kubectl apply -f mqtt-client.yaml
pod/mqtt-client created

После запуска pod используйте kubectl exec для выполнения команд внутри модуля pod.

Например, чтобы опубликовать сообщение в брокере, откройте оболочку внутри модуля pod:

kubectl exec --stdin --tty mqtt-client --namespace azure-iot-operations -- sh

В оболочке pod выполните следующую команду, чтобы опубликовать сообщение брокеру:

mosquitto_pub --host aio-broker --port 18883 --message "hello" --topic "world" --debug --cafile /var/run/certs/ca.crt -D CONNECT authentication-method 'K8S-SAT' -D CONNECT authentication-data $(cat /var/run/secrets/tokens/broker-sat)

Результат должен выглядеть следующим образом:

Client (null) sending CONNECT
Client (null) received CONNACK (0)
Client (null) sending PUBLISH (d0, q0, r0, m1, 'world', ... (5 bytes))
Client (null) sending DISCONNECT

Клиент mosquitto использует маркер учетной записи службы, подключенный для /var/run/secrets/tokens/broker-sat проверки подлинности с помощью брокера. Маркер действителен в течение 24 часов. Клиент также использует сертификат корневого ЦС по умолчанию, подключенный для /var/run/certs/ca.crt проверки цепочки сертификатов TLS брокера.

Совет

Вы можете скачать kubectl корневой сертификат ЦС по умолчанию для использования с другими клиентами. Например, чтобы скачать сертификат корневого ЦС по умолчанию в файл с именем ca.crt:

kubectl get configmap azure-iot-operations-aio-ca-trust-bundle -n azure-iot-operations -o jsonpath='{.data.ca\.crt}' > ca.crt

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

mosquitto_sub --host aio-broker --port 18883 --topic "world" --debug --cafile /var/run/certs/ca.crt -D CONNECT authentication-method 'K8S-SAT' -D CONNECT authentication-data $(cat /var/run/secrets/tokens/broker-sat)

Результат должен выглядеть следующим образом:

Client (null) sending CONNECT
Client (null) received CONNACK (0)
Client (null) sending SUBSCRIBE (Mid: 1, Topic: world, QoS: 0, Options: 0x00)
Client (null) received SUBACK
Subscribed (mid: 1): 0

Клиент mosquitto использует тот же маркер учетной записи службы и сертификат корневого ЦС для проверки подлинности с помощью брокера и подписки на раздел.

Чтобы удалить модуль pod, выполните команду kubectl delete pod mqtt-client -n azure-iot-operations.

Подключение клиентов извне кластера

Так как прослушиватель брокера по умолчанию имеет тип службы ClusterIp, вы не можете подключиться к брокеру за пределами кластера напрямую. Чтобы предотвратить непреднамеренное нарушение взаимодействия между внутренними компонентами операций Интернета вещей Azure, рекомендуется сохранить прослушиватель по умолчанию не измененным и выделенным для внутреннего взаимодействия AIO. Хотя можно создать отдельную службу Kubernetes LoadBalancer для предоставления IP-службы кластера, лучше создать отдельный прослушиватель с разными параметрами, например более распространенный порт MQTT 1883 и 8883, чтобы избежать путаницы и потенциальных рисков безопасности.

Порт узла

Самый простой способ проверить подключение — использовать тип службы NodePort в прослушивателе. С помощью этого можно <nodeExternalIP>:<NodePort> подключиться, как в документации По Kubernetes.

Например, чтобы создать прослушиватель брокера с типом службы портов узла, именем aio-broker-nodeportслужбы и прослушивать порт 1884 (порт узла 31884):

  1. В портал Azure перейдите к экземпляру Операций Интернета вещей.

  2. В разделе "Компоненты" выберите MQTT Broker.

  3. Выберите прослушиватель брокера MQTT для NodePort>Create. Вы можете создать только один прослушиватель для каждого типа службы. Если у вас уже есть прослушиватель одного типа службы, можно добавить дополнительные порты в существующий прослушиватель.

    Внимание

    Установка проверки подлинности в значение None и не настройка TLS отключает проверку подлинности и TLS только для тестирования.

    Введите следующие параметры:

    Параметр Значение
    Имя. aio-broker-nodeport
    Service name Оставьте пустым или aio-broker-nodeport
    Порт 1884
    Проверка подлинности Выберите существующий или нет
    Авторизация Выберите существующий или нет
    Протокол Выбор MQTT
    Порт узла 31884
  4. Добавьте параметры TLS в прослушиватель, нажав кнопку "Добавить TLS>" на порт. Этот шаг не требуется, если для тестирования не требуется TLS. Дополнительные сведения см. в разделе BrokerListener.

  5. Нажмите кнопку "Создать" , чтобы создать прослушиватель.

Примечание.

По умолчанию Kubernetes номер порта узла должен находиться в диапазоне 30000–32767.

Получите внешний IP-адрес узла:

kubectl get nodes -o yaml | grep ExternalIP -C 1

Результат должен выглядеть следующим образом:

    - address: 104.197.41.11
      type: ExternalIP
    allocatable:
--
    - address: 23.251.152.56
      type: ExternalIP
    allocatable:
...

Используйте внешний IP-адрес и порт узла для подключения к брокеру. Например, чтобы опубликовать сообщение в брокере, выполните следующие действия.

mosquitto_pub --host <EXTERNAL_IP> --port 31884 --message "hello" --topic "world" --debug # Add authentication and TLS options matching listener settings

Если в выходных данных нет внешнего IP-адреса, возможно, вы используете настройку Kubernetes, которая не предоставляет внешний IP-адрес узла по умолчанию, как и многие настройки k3s, k3d или minikube. В этом случае вы можете получить доступ к брокеру с внутренним IP-адресом вместе с портом узла с компьютеров в той же сети. Например, чтобы получить внутренний IP-адрес узла:

kubectl get nodes -o yaml | grep InternalIP -C 1

Результат должен выглядеть следующим образом:

    - address: 172.19.0.2
      type: InternalIP
    allocatable:

Затем используйте внутренний IP-адрес и порт узла для подключения к брокеру с компьютера в одном кластере. Если Kubernetes работает на локальном компьютере, например с одним узлом k3s, можно часто использовать localhost вместо внутреннего IP-адреса. Если Kubernetes работает в контейнере Docker, например k3d, внутренний IP-адрес соответствует IP-адресу контейнера и должен быть доступен с хост-компьютера.

Подсистема балансировки нагрузки

Еще одним способом предоставления брокера в Интернете является использование типа службы LoadBalancer . Этот метод является более сложным и может потребовать дополнительной конфигурации, например настройки перенаправления портов.

Например, чтобы создать прослушиватель брокера с типом службы подсистемы балансировки нагрузки, именем aio-broker-loadbalancerслужбы и прослушивателем через порт 1883:

  1. В портал Azure перейдите к экземпляру Операций Интернета вещей.

  2. В разделе "Компоненты" выберите MQTT Broker.

  3. Выберите прослушиватель брокера MQTT для NodePort>Create. Вы можете создать только один прослушиватель для каждого типа службы. Если у вас уже есть прослушиватель одного типа службы, можно добавить дополнительные порты в существующий прослушиватель.

    Внимание

    Установка проверки подлинности в значение None и не настройка TLS отключает проверку подлинности и TLS только для тестирования.

    Введите следующие параметры:

    Параметр Значение
    Имя. aio-broker-loadbalancer
    Service name Оставьте пустым или aio-broker-loadbalancer
    Порт 1883
    Проверка подлинности Выберите существующий или нет
    Авторизация Выберите существующий или нет
    Протокол Выбор MQTT
  4. Добавьте параметры TLS в прослушиватель, нажав кнопку "Добавить TLS>" на порт. Этот шаг не требуется, если для тестирования не требуется TLS. Дополнительные сведения см. в разделе BrokerListener.

  5. Нажмите кнопку "Создать" , чтобы создать прослушиватель.

  6. Нажмите кнопку "Создать" , чтобы создать прослушиватель.

Получите внешний IP-адрес для службы брокера:

kubectl get service aio-broker-loadbalancer --namespace azure-iot-operations

Если выходные данные выглядят примерно так:

NAME                      TYPE           CLUSTER-IP      EXTERNAL-IP   PORT(S)          AGE
aio-broker-loadbalancer   LoadBalancer   10.x.x.x        x.x.x.x       1883:30382/TCP   83s

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

mosquitto_pub --host <EXTERNAL_IP> --port 1883 --message "hello" --topic "world" --debug # Add authentication and TLS options matching listener settings

Если внешний IP-адрес не назначен, может потребоваться использовать перенаправление портов или виртуальный коммутатор для доступа к брокеру.

Использование перенаправления портов

При использовании миникубе, типа и других систем эмуляции кластера внешний IP-адрес может не назначаться автоматически. Например, может отображаться состояние "Ожидание ".

  1. Чтобы получить доступ к брокеру, перенаправите порт прослушивателя брокера на узел.

    # Using aio-broker-loadbalancer service name and listener port 1883 as example
    kubectl port-forward --namespace azure-iot-operations service/aio-broker-loadbalancer <HOST_PORT>:1883
    
  2. Оставьте команду пересылки портов, запущенную в терминале.

  3. Подключитесь к брокеру через порт узла с той же конфигурацией проверки подлинности и TLS, что и пример без перенаправления портов.

Дополнительные сведения о миникубе см. в разделе "Использование перенаправления портов для доступа к приложениям в кластере"

Переадресация портов в AKS Edge Essentials

Для Служба Azure Kubernetes Edge Essentials необходимо выполнить несколько дополнительных действий. При использовании AKS Edge Essentials получение внешнего IP-адреса может быть недостаточно для подключения к брокеру. Возможно, потребуется настроить перенаправление портов и открыть порт в брандмауэре, чтобы разрешить трафик службе брокера.

  1. Сначала получите внешний IP-адрес прослушивателя подсистемы балансировки нагрузки брокера:

    kubectl get service broker-loadbalancer --namespace azure-iot-operations
    

    Выходные данные должны выглядеть примерно так:

    NAME                    TYPE           CLUSTER-IP     EXTERNAL-IP   PORT(S)          AGE
    broker-loadbalancer     LoadBalancer   10.x.x.x       192.168.0.4   1883:30366/TCP   14h
    
  2. Настройте перенаправление портов в broker-loadbalancer службу по внешнему IP-адресу 192.168.0.4 и порту 1883:

    netsh interface portproxy add v4tov4 listenport=1883 connectport=1883 connectaddress=192.168.0.4
    
  3. Откройте порт в брандмауэре, чтобы разрешить трафик службе брокера:

    New-NetFirewallRule -DisplayName "AIO MQTT Broker" -Direction Inbound -Protocol TCP -LocalPort 1883 -Action Allow
    
  4. Используйте общедоступный IP-адрес узла для подключения к брокеру MQTT.

Дополнительные сведения о переадресации портов см. в разделе "Предоставление служб Kubernetes внешним устройствам".

Доступ через localhost

Некоторые дистрибутивы Kubernetes могут предоставлять брокер MQTT порту на хост-системе (localhost) в рамках конфигурации кластера. Используйте этот подход, чтобы упростить доступ клиентов к брокеру MQTT на одном узле.

Например, чтобы создать кластер K3d с сопоставлением порта MQTT по умолчанию MQTT брокера MQTT 1883 с localhost:1883:

k3d cluster create --port '1883:1883@loadbalancer'

Или обновить существующий кластер:

k3d cluster edit <CLUSTER_NAME> --port-add '1883:1883@loadbalancer'

Затем используйте localhost порт для подключения к брокеру. Например, чтобы опубликовать сообщение в брокере, выполните следующие действия.

mosquitto_pub --host localhost --port 1883 --message "hello" --topic "world" --debug # Add authentication and TLS options matching listener settings

Отключить протокол TLS и проверку подлинности только для тестирования

Причина, по которой брокер MQTT использует проверку подлинности TLS и учетных записей служб по умолчанию, — обеспечить безопасный по умолчанию интерфейс, который минимизирует непреднамеренное воздействие решения Интернета вещей злоумышленникам. Вы не должны отключать TLS и проверку подлинности в рабочей среде. Предоставление брокера MQTT в Интернет без проверки подлинности и TLS может привести к несанкционированным доступом и даже атакам DDOS.

Предупреждение

Если вы понимаете риски и должны использовать небезопасный порт в хорошо управляемой среде, вы можете отключить TLS и проверку подлинности для целей тестирования, удалив tls параметры из authenticationRef конфигурации прослушивателя.

  1. В портал Azure перейдите к экземпляру Операций Интернета вещей.

  2. В разделе "Компоненты" выберите MQTT Broker.

  3. Выберите прослушиватель брокера MQTT для прослушивателя брокера NodePort или MQTT для LoadBalancer>Create. Вы можете создать только один прослушиватель для каждого типа службы. Если у вас уже есть прослушиватель одного типа службы, можно добавить дополнительные порты в существующий прослушиватель.

    Внимание

    Установка проверки подлинности в значение None и не настройка TLS отключает проверку подлинности и TLS только для тестирования.

    Введите следующие параметры:

    Параметр Значение
    Имя. Введите имя прослушивателя
    Service name Введите имя службы
    Порт Введите номер порта
    Проверка подлинности Выберите Нет.
    Авторизация Выберите Нет.
    Протокол Выбор MQTT
    Порт узла Введите число от 30000 до 32767 при использовании порта узла
  4. Нажмите кнопку "Создать" , чтобы создать прослушиватель.