Testowanie łączności z brokerem MQTT przy użyciu klientów MQTT
Ważne
Ta strona zawiera instrukcje dotyczące zarządzania składnikami operacji usługi Azure IoT przy użyciu manifestów wdrażania platformy Kubernetes, które są w wersji zapoznawczej. Ta funkcja jest udostępniana z kilkoma ograniczeniami i nie powinna być używana w przypadku obciążeń produkcyjnych.
Zobacz Dodatkowe warunki użytkowania wersji zapoznawczych platformy Microsoft Azure, aby zapoznać się z postanowieniami prawnymi dotyczącymi funkcji platformy Azure, które są w wersji beta lub wersji zapoznawczej albo w inny sposób nie zostały jeszcze wydane jako ogólnie dostępne.
W tym artykule przedstawiono różne sposoby testowania łączności z brokerem MQTT przy użyciu klientów MQTT w środowisku nieprodukcyjnym.
Domyślnie broker MQTT:
-
Wdraża odbiornik obsługujący protokół TRANSPORT Layer Security (TLS) na porcie 18883 z
ClusterIp
typem usługi.ClusterIp
oznacza, że broker jest dostępny tylko z poziomu klastra Kubernetes. Aby uzyskać dostęp do brokera spoza klastra, należy skonfigurować usługę typuLoadBalancer
lubNodePort
. - Akceptuje konta usługi Kubernetes na potrzeby uwierzytelniania połączeń z poziomu klastra. Aby nawiązać połączenie spoza klastra, należy skonfigurować inną metodę uwierzytelniania.
Uwaga
W przypadku scenariuszy produkcyjnych użyj uwierzytelniania za pomocą protokołu TLS i kont usług, aby zabezpieczyć rozwiązanie IoT. Aby uzyskać więcej informacji, zobacz:
- Skonfiguruj protokół TLS z automatycznym zarządzaniem certyfikatami, aby zabezpieczyć komunikację MQTT w brokerze MQTT.
- Skonfiguruj uwierzytelnianie w brokerze MQTT.
- Uwidacznianie usług Kubernetes na urządzeniach zewnętrznych przy użyciu funkcji przekazywania portów lub przełącznika wirtualnego za pomocą usługi Azure Kubernetes Services (AKS) Edge Essentials.
Przed rozpoczęciem zainstaluj lub skonfiguruj operacje usługi Azure IoT. Użyj poniższych opcji, aby przetestować łączność z brokerem MQTT przy użyciu klientów MQTT w środowisku nieprodukcyjnym.
Nawiązywanie połączenia z odbiornikiem domyślnym w klastrze
Pierwszą opcją jest nawiązanie połączenia z poziomu klastra. Ta opcja używa konfiguracji domyślnej i nie wymaga dodatkowych aktualizacji. W poniższych przykładach pokazano, jak nawiązać połączenie z poziomu klastra przy użyciu zwykłego systemu Alpine Linux i powszechnie używanego klienta MQTT przy użyciu konta usługi i domyślnego certyfikatu głównego urzędu certyfikacji.
mqtt-client.yaml
Pobierz wdrożenie z przykładowego repozytorium GitHub.
Ważne
Nie używaj klienta MQTT w środowisku produkcyjnym. Klient jest przeznaczony tylko do celów testowych.
wget https://raw.githubusercontent.com/Azure-Samples/explore-iot-operations/main/samples/quickstarts/mqtt-client.yaml -O mqtt-client.yaml
Zastosuj plik wdrożenia za pomocą narzędzia kubectl:
kubectl apply -f mqtt-client.yaml
pod/mqtt-client created
Po uruchomieniu zasobnika użyj polecenia kubectl exec
, aby uruchomić polecenia wewnątrz zasobnika.
Aby na przykład opublikować komunikat w brokerze, otwórz powłokę wewnątrz zasobnika:
kubectl exec --stdin --tty mqtt-client --namespace azure-iot-operations -- sh
W powłoce zasobnika uruchom następujące polecenie, aby opublikować komunikat w brokerze:
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)
Dane wyjściowe powinny wyglądać mniej więcej tak jak w tym przykładzie:
Client (null) sending CONNECT
Client (null) received CONNACK (0)
Client (null) sending PUBLISH (d0, q0, r0, m1, 'world', ... (5 bytes))
Client (null) sending DISCONNECT
Klient Mosquitto używa tokenu konta usługi zainstalowanego na stronie /var/run/secrets/tokens/broker-sat
do uwierzytelniania za pomocą brokera. Token jest ważny przez 24 godziny. Klient używa również domyślnego certyfikatu głównego urzędu certyfikacji zainstalowanego pod adresem , /var/run/certs/ca.crt
aby zweryfikować łańcuch certyfikatów TLS brokera.
Napiwek
Możesz użyć narzędzia kubectl, aby pobrać domyślny certyfikat głównego urzędu certyfikacji do użycia z innymi klientami. Aby na przykład pobrać domyślny certyfikat głównego urzędu certyfikacji do pliku o nazwie ca.crt
:
kubectl get configmap azure-iot-operations-aio-ca-trust-bundle -n azure-iot-operations -o jsonpath='{.data.ca\.crt}' > ca.crt
Aby zasubskrybować temat, uruchom następujące polecenie:
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)
Dane wyjściowe powinny wyglądać mniej więcej tak jak w tym przykładzie:
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
Klient Mosquitto używa tego samego tokenu konta usługi i certyfikatu głównego urzędu certyfikacji do uwierzytelniania za pomocą brokera i subskrybowania tematu.
Aby usunąć zasobnik, uruchom polecenie kubectl delete pod mqtt-client -n azure-iot-operations
.
Łączenie klientów spoza klastra
Ponieważ domyślny odbiornik brokera jest ustawiony na ClusterIp
typ usługi, nie można nawiązać bezpośredniego połączenia z brokerem spoza klastra. Aby zapobiec niezamierzonym przerwom w komunikacji między wewnętrznymi składnikami operacji IoT, zalecamy zachowanie domyślnego odbiornika niezmodyfikowanego i dedykowanego dla wewnętrznej komunikacji operacji IoT. Chociaż istnieje możliwość utworzenia oddzielnej usługi Kubernetes LoadBalancer
w celu uwidocznienia usługi ip klastra, lepiej jest utworzyć oddzielny odbiornik z różnymi ustawieniami, takimi jak bardziej typowe porty MQTT 1883 i 8883, aby uniknąć nieporozumień i potencjalnych zagrożeń bezpieczeństwa.
Port węzła
Najprostszym sposobem testowania łączności jest użycie NodePort
typu usługi w odbiorniku. Za pomocą <nodeExternalIP>:<NodePort>
tej metody można nawiązać połączenie, jak pokazano w dokumentacji platformy Kubernetes.
Aby na przykład utworzyć nowy odbiornik brokera z NodePort
typem usługi, nazwą aio-broker-nodeport
usługi i nasłuchiwaniem na porcie 1884 (port węzła 31884), wykonaj następujące kroki.
W witrynie Azure Portal przejdź do wystąpienia operacji IoT.
W obszarze Składniki wybierz pozycję Broker MQTT.
Wybierz pozycję Odbiornik brokera MQTT dla pozycji NodePort>Create. Można utworzyć tylko jeden odbiornik na typ usługi. Jeśli masz już odbiornik tego samego typu usługi, możesz dodać więcej portów do istniejącego odbiornika.
Uwaga
Ustawienie uwierzytelniania na Wartość Brak i nieskładnikowanie protokołu TLS powoduje wyłączenie uwierzytelniania i protokołu TLS tylko do celów testowych.
Wprowadź następujące ustawienia:
Ustawienie Wartość Nazwisko aio-broker-nodeport
Service name Pozostaw wartość pustą lub użyj polecenia aio-broker-nodeport
.Port 1884 Uwierzytelnianie Wybierz jedną z istniejących lub braków. Autoryzacja Wybierz jedną z istniejących lub braków. Protokół Wybierz pozycję MQTT. Port węzła 31884 Dodaj ustawienia protokołu TLS do odbiornika, wybierając pozycję Dodaj tls>na porcie. Ten krok nie jest wymagany, jeśli nie potrzebujesz protokołu TLS do testowania. Aby uzyskać więcej informacji, zobacz BrokerListener.
Wybierz pozycję Utwórz , aby utworzyć odbiornik.
Uwaga
Domyślnie na platformie Kubernetes numer portu węzła musi należeć do zakresu od 30000 do 32767.
Pobierz zewnętrzny adres IP węzła:
kubectl get nodes -o yaml | grep ExternalIP -C 1
Dane wyjściowe powinny wyglądać mniej więcej tak jak w tym przykładzie:
- address: 104.197.41.11
type: ExternalIP
allocatable:
--
- address: 23.251.152.56
type: ExternalIP
allocatable:
...
Użyj zewnętrznego adresu IP i portu węzła, aby nawiązać połączenie z brokerem. Aby na przykład opublikować komunikat w brokerze:
mosquitto_pub --host <EXTERNAL_IP> --port 31884 --message "hello" --topic "world" --debug # Add authentication and TLS options matching listener settings
Jeśli w danych wyjściowych nie ma zewnętrznego adresu IP, może być używana konfiguracja platformy Kubernetes, która domyślnie nie uwidacznia zewnętrznego adresu IP węzła, na przykład wiele konfiguracji k3s, k3d lub minikube. W takim przypadku możesz uzyskać dostęp do brokera za pomocą wewnętrznego adresu IP wraz z portem węzła z maszyn w tej samej sieci. Aby na przykład uzyskać wewnętrzny adres IP węzła:
kubectl get nodes -o yaml | grep InternalIP -C 1
Dane wyjściowe powinny wyglądać mniej więcej tak jak w tym przykładzie:
- address: 172.19.0.2
type: InternalIP
allocatable:
Następnie użyj wewnętrznego adresu IP i portu węzła, aby nawiązać połączenie z brokerem z maszyny w tym samym klastrze. Jeśli platforma Kubernetes jest uruchomiona na komputerze lokalnym, podobnie jak w przypadku k3 z jednym węzłem, często można użyć localhost
zamiast wewnętrznego adresu IP. Jeśli platforma Kubernetes jest uruchomiona w kontenerze platformy Docker, na przykład k3d, wewnętrzny adres IP odpowiada adresowi IP kontenera i powinien być dostępny z maszyny hosta.
Moduł równoważenia obciążenia
Innym sposobem uwidocznienia brokera w Internecie jest użycie LoadBalancer
typu usługi. Ta metoda jest bardziej złożona i może wymagać większej liczby konfiguracji, takich jak konfigurowanie przekazywania portów.
Aby na przykład utworzyć nowy odbiornik brokera z LoadBalancer
typem usługi, nazwą aio-broker-loadbalancer
usługi i nasłuchiwaniem na porcie 1883, wykonaj następujące kroki.
W witrynie Azure Portal przejdź do wystąpienia operacji IoT.
W obszarze Składniki wybierz pozycję Broker MQTT.
Wybierz pozycję Odbiornik brokera MQTT dla pozycji NodePort>Create. Można utworzyć tylko jeden odbiornik na typ usługi. Jeśli masz już odbiornik tego samego typu usługi, możesz dodać więcej portów do istniejącego odbiornika.
Uwaga
Ustawienie uwierzytelniania na Wartość Brak i nieskładnikowanie protokołu TLS powoduje wyłączenie uwierzytelniania i protokołu TLS tylko do celów testowych.
Wprowadź następujące ustawienia:
Ustawienie Wartość Nazwisko aio-broker-loadbalancer
Service name Pozostaw wartość pustą lub użyj polecenia aio-broker-loadbalancer
.Port 1883 Uwierzytelnianie Wybierz jedną z istniejących lub braków. Autoryzacja Wybierz jedną z istniejących lub braków. Protokół Wybierz pozycję MQTT. Dodaj ustawienia protokołu TLS do odbiornika, wybierając pozycję Dodaj tls>na porcie. Ten krok nie jest wymagany, jeśli nie potrzebujesz protokołu TLS do testowania. Aby uzyskać więcej informacji, zobacz BrokerListener.
Wybierz pozycję Utwórz , aby utworzyć odbiornik.
Wybierz pozycję Utwórz , aby utworzyć odbiornik.
Pobierz zewnętrzny adres IP dla usługi brokera:
kubectl get service aio-broker-loadbalancer --namespace azure-iot-operations
Jeśli dane wyjściowe wyglądają podobnie do następującego przykładu:
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
Następnie do usługi modułu równoważenia obciążenia przypisano zewnętrzny adres IP. Aby nawiązać połączenie z brokerem, możesz użyć zewnętrznego adresu IP i portu. Aby na przykład opublikować komunikat w brokerze:
mosquitto_pub --host <EXTERNAL_IP> --port 1883 --message "hello" --topic "world" --debug # Add authentication and TLS options matching listener settings
Jeśli zewnętrzny adres IP nie jest przypisany, może być konieczne użycie przekazywania portów lub przełącznika wirtualnego w celu uzyskania dostępu do brokera.
Używanie przekierowania portów
W przypadku minikube, rodzaju i innych systemów emulacji klastra zewnętrzny adres IP może nie zostać automatycznie przypisany. Na przykład stan może być wyświetlany jako Oczekujące.
Aby uzyskać dostęp do brokera, przekaż port odbiornika brokera do hosta.
# 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
Pozostaw polecenie przekierowywania portów uruchomione w terminalu.
Połącz się z brokerem na porcie hosta przy użyciu tej samej konfiguracji uwierzytelniania i protokołu TLS, co przykład bez przekazywania portów.
Aby uzyskać więcej informacji na temat minikube, zobacz Use Port Forwarding to Access Applications in a Cluster (Używanie przekazywania portów do uzyskiwania dostępu do aplikacji w klastrze).
Przekazywanie portów w usłudze AKS Edge Essentials
W przypadku usługi AKS Edge Essentials należy wykonać kilka kolejnych kroków. W usłudze AKS Edge Essentials uzyskanie zewnętrznego adresu IP może nie wystarczyć do nawiązania połączenia z brokerem. Może być konieczne skonfigurowanie przekierowania portów i otwarcie portu w zaporze w celu zezwolenia na ruch do usługi brokera.
Najpierw uzyskaj zewnętrzny adres IP odbiornika modułu równoważenia obciążenia brokera:
kubectl get service broker-loadbalancer --namespace azure-iot-operations
Dane wyjściowe powinny wyglądać podobnie do poniższego przykładu:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE broker-loadbalancer LoadBalancer 10.x.x.x 192.168.0.4 1883:30366/TCP 14h
Skonfiguruj przekazywanie portów do
broker-loadbalancer
usługi na zewnętrznym adresie192.168.0.4
IP i porcie1883
:netsh interface portproxy add v4tov4 listenport=1883 connectport=1883 connectaddress=192.168.0.4
Otwórz port zapory, aby zezwolić na ruch do usługi brokera:
New-NetFirewallRule -DisplayName "AIO MQTT Broker" -Direction Inbound -Protocol TCP -LocalPort 1883 -Action Allow
Użyj publicznego adresu IP hosta, aby nawiązać połączenie z brokerem MQTT.
Aby uzyskać więcej informacji na temat przekierowywania portów, zobacz Uwidacznianie usług Kubernetes na urządzeniach zewnętrznych.
Dostęp za pośrednictwem hosta lokalnego
Niektóre dystrybucje platformy Kubernetes mogą uwidaczniać brokera MQTT na porcie w systemie hosta (localhost
) w ramach konfiguracji klastra. Użyj tego podejścia, aby ułatwić klientom na tym samym hoście dostęp do brokera MQTT.
Aby na przykład utworzyć klaster k3d mapujący domyślny port MQTT brokera MQTT 1883 na localhost:1883
:
k3d cluster create --port '1883:1883@loadbalancer'
Lub zaktualizować istniejący klaster:
k3d cluster edit <CLUSTER_NAME> --port-add '1883:1883@loadbalancer'
Następnie użyj polecenia localhost
i port, aby nawiązać połączenie z brokerem. Aby na przykład opublikować komunikat w brokerze:
mosquitto_pub --host localhost --port 1883 --message "hello" --topic "world" --debug # Add authentication and TLS options matching listener settings
Wyłącz tylko protokół TLS i uwierzytelnianie na potrzeby testowania
Powodem, dla którego broker MQTT domyślnie używa uwierzytelniania za pomocą protokołu TLS i kont usług, jest zapewnienie bezpiecznego domyślnie środowiska, które minimalizuje przypadkowe narażenie rozwiązania IoT na osoby atakujące. Nie należy wyłączać protokołu TLS i uwierzytelniania w środowisku produkcyjnym. Uwidacznianie brokera MQTT w Internecie bez uwierzytelniania i tls może prowadzić do nieautoryzowanego dostępu, a nawet rozproszonych ataków typu "odmowa usługi".
Ostrzeżenie
Jeśli rozumiesz czynniki ryzyka i musisz użyć niezabezpieczonego portu w dobrze kontrolowanym środowisku, możesz wyłączyć protokół TLS i uwierzytelnianie na potrzeby testowania, usuwając tls
ustawienia i z authenticationRef
konfiguracji odbiornika.
W witrynie Azure Portal przejdź do wystąpienia operacji IoT.
W obszarze Składniki wybierz pozycję Broker MQTT.
Wybierz odbiornik brokera MQTT dla węzłaPort lub odbiornika brokera MQTT dla modułu LoadBalancer>Create. Można utworzyć tylko jeden odbiornik na typ usługi. Jeśli masz już odbiornik tego samego typu usługi, możesz dodać więcej portów do istniejącego odbiornika.
Uwaga
Ustawienie uwierzytelniania na Wartość Brak i nieskładnikowanie protokołu TLS powoduje wyłączenie uwierzytelniania i protokołu TLS tylko do celów testowych.
Wprowadź następujące ustawienia:
Ustawienie Wartość Nazwisko Wprowadź nazwę odbiornika. Service name Wprowadź nazwę usługi. Port Wprowadź numer portu. Uwierzytelnianie Wybierz pozycję Brak. Autoryzacja Wybierz pozycję Brak. Protokół Wybierz pozycję MQTT. Port węzła Wprowadź liczbę z zakresu od 30000 do 32767, jeśli używasz portu węzła. Wybierz pozycję Utwórz , aby utworzyć odbiornik.