Python을 사용하여 mqtt 연결을 만들려고 합니다. 문제를 재현하는 가장 짧은 코드는 다음과 같습니다.
import paho.mqtt.client as paho
client = paho.Client('myClient')
client.username_pw_set('user', 'password')
client.connect('my.broker.com')
마지막 줄에서 나는 얻는다.
ConnectionRefusedError: [Errno 111] Connection refused
흥미롭게도 서버는 연결을 거부하지 않았습니다. connect()
로깅이 있으며 실제 요청 전에 연결이 거부된 것 같습니다.
Windows 컴퓨터에서 스크립트를 시도했는데 Ubuntu에서는 제대로 실행되었지만 Fedora 37(연결이 거부됨)이 있는 컴퓨터에서 실행해야 합니다. 일부 구성이 잘못되었다고 생각하지만 기본적인 Linux 지식이 있는데 어디서 찾을 수 있는지 모르겠습니다. 저는 두 Linux의 현재 상태를 모릅니다. 어떤 방식으로든 설정되어 있을 수 있지만 Windows 시스템의 기본 설정은 양호합니다. 구글링을 해보니 다음과 같은 제안이 있었습니다.
- 로컬 mqtt 브로커 실행(원격 브로커에 연결해야 하므로 적합하지 않음)
- 방화벽 규칙을 확인하세요(다른 컴퓨터가 프록시에 연결할 수 있으므로 네트워크에 방화벽이 없는 것 같습니다).
- iptables 확인(필터링 규칙이 표시되지 않음)
내가 확인할 수 있는 다른 제안 사항이 있나요? 소켓 생성에 대해 Fedora 또는 Linux 전체에 대한 제한 사항이 있습니까?
답변1
유닉스 전체:
일반적으로 루트만 1023 이하의 포트 번호를 사용할 수 있지만 MQTT 기본 포트 번호는 1883이므로 문제가 되지 않습니다.
페도라 특정:
Fedora는 기본적으로 SELinux를 사용하지만 여기에 적용되는 방식으로 일반 사용자의 대화형 세션을 제한해서는 안 됩니다. 그러나 특정 서비스(예: 네트워크 서버 CGI 스크립트 또는 기타 스크립트)를 통해 스크립트를 실행하는 경우 SELinux가 이를 허용하도록 구성되지 않은 한 스크립트가 나가는 네트워크 연결을 열지 못할 수 있습니다.
기본 연결 테스트:
telnet
netcat( )이 설치되어 있는 경우 nc
다음 명령을 사용하여 연결을 테스트하십시오.
telnet my.broker.com 1883
또는
nc -v my.broker.com 1883
각기.
traceroute
이미 설치 되어 있다면 다음을 실행하세요.전송 제어 프로토콜추적 경로애플리케이션에 필요한 특정 포트에서(SSL/TLS가 없는 MQTT의 기본값은 1883입니다):
sudo traceroute -T -p 1883 my.broker.com
프록시에 대한 기본 TCP 연결이 성공적으로 설정되면 이를 명시적으로 telnet
알려 nc
줍니다.
네트워크에서 연결 시도가 중단되는 경우 traceroute -T
이를 식별하는 데 도움이 됩니다.