우분투&mqtt 트러블 슛팅, mqttBroker의 모든것

낭만개발자·2021년 1월 23일
1

우분투에 설치된 MQTT 브로커 포트가 안열림.

우분투에 MQTT브로커를 설치한 후 기본 실행하면 기본 포트가
127.0.0.1:1883에 run 한다.
그래서 우선 우분투 iptables로 포트 1883을 열고 127.0.0.1:1883에 포트포워딩을 하면 되겠다 생각했는데 레퍼런스를 찾아보니 다들 아니 대부분 0.0.0.0에 서버 바인딩을 하라는 것이었다.

https://stackoverflow.com/questions/45260068/setting-up-mosquitto-on-home-server

찾아보니 mosquitto.conf 파일을 vim으로 listening 1833 0.0.0.0으로 insert 하고

해결1

run command를 mosquitto -c mosquitto.conf -v 해서 적용하라는 것이었다.
(-c conf파일 적용도 처음 알았다. 이거 알기 전까지 시간이 많이 소모되었다.. api문서는언제 시간내서 한번 정독을 해야 겠다 !!!)

vim mosquitto.conf 파일을 열어보면 아래와 같이 설정되어 있다.
아래 allow_anonymous true 값이 없을땐 default로 false가 되어 있는데, 자꾸 authorized error가 떳다.. 권한에러
그래서 api문서 좀 읽어보니 저게 필요하겠다 싶어 true 주니 권한에러 안 뜨더라..

그리고 우분투의 방화병 정책 iptables에서 INPUT OUTPUT에 포트를 개방해서 들어오고 나갈수 있게 설정하고,
stakoverflow 보면 포트 포워딩까지 해줘야 한다고 했다.

포트 열려있는지는 아래서 체크하면 된다. (나랑 같이 싸운 포트 오픈 체크 페이지..)
https://www.yougetsignal.com/tools/open-ports/

열린 포트 보려면 간단하게 netstat -ntlp 입력하면 된다. TCP 중에서(t), Listening상태[열린포트]인 애들만(l), 상세정보까지(p), 10진수 숫자로(n) 표기한다.
netstat -ano도 편하다. windows에선 항상 저걸 사용해서.. ㅎ
그러면 아래처럼 뜨는데 Recv-Q, Send-Q는 받았는데 처리못한거, 보냈는데 처리 못한거란다.. 현재는 22번 ssh가 ESTABLISHED 상태다. 포트 22번이 열려있다.

여기서 내가 또 해맨게 포트 포워딩을 하면 오히려 port가 close가 되는 것이었다.
인터넷 찾아보니 프리라우팅 하는 방법이,

iptables -A PREROUTING -t nat -p tcp  -d 220.92.18.202  --dport 1883 -j DNAT --to 0.0.0.0:1883
iptables -A PREROUTING -t nat -p tcp  -d 220.92.18.202  --dport 1883 -j DNAT --to 127.0.0.1:1883

이고 그전에 FORWARD단에서 가로채니 그것도 ACCEPT 설정해줘야 해서

iptables -A FORWARD -p tcp --dport 1883 -d 0.0.0.0 -j ACCEPT 
iptables -A FORWARD -p tcp --dport 1883 -d 127.0.0.1 -j ACCEPT

0.0.0.0:183, 127.0.0.1 둘다 테스트해보았다. 그랬더니
prerouting 적용하자마자 위에 yougetsignal 사이트에서 내 서버 포트가 계속 closed 되는 것이었다. 이미 Broker hosting이 0.0.0.0으로 되어 있어서 포트 포워딩 설정하면 중복이되니까 맛이 가는건가??왜 포트 closed 가 되는지 이해가 안갔음.

해결2

어쨋든 포트포워딩은 다 빼버리니까 connect이 되었다. 즉 적용된건 1883포트를 INPUT OUTPUT를 accept으로 설정했고,
브로커를 돌렸다
(알게 된점은 해당 포트 방화벽을 열었다 하더라도 실제 프로그램이 작동하지 않으면 포트는 closed 된다는 것이었다. 열려 있는게 아니라..이런건 블로그 e북등을 봐도 가르쳐 주는 사람이 없다 질문해서 알아내야 한다..)

이 포트 여는데 거의 2~3일이 걸렸다. ㅠㅠ 레퍼런스대로 해서 안됐을때가 본 실력이 나오는듯하다..

추가

아래 publish subscription 테스트.
즉 .conf 파일에서 listening 설정을 1883 0.0.0.0 으로 바인딩 해두면 내부 locallost나 127.0.0.1 로 통신이 가능하다...
(PREROUTING이나 FORWARD 설정을 안해도 리스닝을 0.0.0.0 해두니 자동으로 외부 1883과 내부 로컬 1883 포트가 포워딩이 된다니.. 신기하네)

systemctl 명령어

시스템 서비스를 컨트롤 할 수 있는 명령어. /etc/init.d 디렉토리에 있는 링크파일들을 시작, 종료, 재시작등을 할 수 있다. init.d 디렉토리는 리눅스에 사용할 수 있는 프로그램 실행 파일 링크 enable오는 위치.

systemctl enable /diable 은 부팅시 자동실행 여부를 선택하는 것 이고 systemctl start/stop 은 지금 서비스를 켜고 끄는 것을 의미한다.

systemctl enable 해당 서비스 :부팅시 자동 시작
systemctl disable 해당 서비스 :부팅시 사용 안함
systemctl start 해당 서비스 :지금 일반 시작
systemctl stop 해당서비스 :지금 멈춤
sudo systemctl reset-failed :불필요한 서비스 삭제
sudo journalctl | grep 내서비스이름 : 자세한 오류 및 기록 확인

아래는 예전 버전(centOS 6인가..)
ex) service start mosquitto

  • start : 중지된 서비스 시작
  • stop : 실행 중 서비스 중지
  • restart : 중지된거 시작, reload : 연결을 끊지 않는 채 서비스 설정 리로드, status : 서비스 실행 여부를 나타냄.

mosquitto.conf 설정 파일

참조 : https://m.blog.naver.com/PostView.nhn?blogId=phkaa&logNo=220937990534&proxyReferer=https:%2F%2Fwww.google.com%2F

패스워드 파일 위치 예제: /usr/local/etc/mosquitto/pwfile.example

참고 네이버 블로그:http://spectrumdig.blogspot.kr/2016/02/mqtt-broker-mosquitto.html

mosquitto.conf 파일 적용하려면 broker를 restart해줘야 한다.

eng:Quick Guide to The Mosquitto.conf File With Examples
http://www.steves-internet-guide.com/mossquitto-conf-file/

etc

  • mobaXterm 한글 깨지는 현상
    터미널 창에서 오른쪽 마우스키 누르시고 change terminal settings-> Windows->Translation->Remote character set: Use font encoding 선택 하시고 Windows-> Apperance 에서 한글 지원 폰트로 변경 하시면 됩니다
    https://okky.kr/article/459132

ssh vs ssl의 차이점

ssh : ​Secure Shell Protocol
원격 조종에 있어 보안성 유지. 보통 22번 포트
원격접속 패킷을 보낼 때 데이터를 암호화 시켜줌. 자료를 올릴때 sftp를 사용
ssl : Secure Sockets Layer, 웹서버 인증이나 서버 인증.
웹브라우저와 서버간의 통신이 암호화 되므로 중간에 패킷을 가로챌수 없도록 하는 솔루션. 웹상에 결제나 인터넷 뱅킹과 같은 중요한 일을 할 때 사용되는 방식.
클라이언트가 서버에 접속하게 되면 서버 인증서를 정송 받음.

[AWS] 가장쉽게 VPC 개념잡기

https://medium.com/harrythegreat/aws-%EA%B0%80%EC%9E%A5%EC%89%BD%EA%B2%8C-vpc-%EA%B0%9C%EB%85%90%EC%9E%A1%EA%B8%B0-71eef95a7098

TCP/IP 이론 — IP 주소, 서브넷 마스크 그리고 기본 게이트웨이

ipconfg 치면 나오는 화면 중
이더넷 어댑터 : pc의 랜카드, 이더넷은 LAN 영역에서 사용하는 표준 기술
IPv4 : 0.0.0.0부터 255.255.255.255까지, 총 2의 32승 만큼의 주소를 가질 수 있다.
IP주소에는 클래스 개념이 있는데, 이는 번호의 영역이다.
A클래스 1~126, B클래스 128~ 191, C클래스 192~223
192.x..는 C클래스에 속함.
127번은 localhost 127.0.0.1번으로 자기 자신 주소이기에 클래스에서 제외함. 루프백 주소(loopback address)라고도 함.

서브넷 마스크 : IP주소와 쌍을 이뤄서 사용하는 개념. IP주소를 이 서브넷 마스크를 이요해 표기하는데 이를 서비넷 마스크 표기법이라 칭함.
192.168.0.4 의 IPv4가 있다 하면, 서브넷 마스크는 255.255.255.0인데 129.168.0에 255.255.255가 대응하고 4와 0이 대응하는 것을 알 수 있다. 이 때, 255,255,255에 대응하는 192. 168.0을 네트워크 ID라 하며 0에 대응하는 4를 호스트 ID라 한다. 서브넷 마스크의 네트워크 ID가 전화번호에 국번에 해당한다면 일련번호가 호스트 ID에 해당함.

기본 게이트 웨이: 게이트웨이를 다른말로 라우터. 소프트웨어 측면을 강조할 때 게이트웨이, 하드웨어적 측면 강조할 땐 라우터.
보통 무선 공유기를 사용하면 무선공유기가 게이트웨이(=라우터) ex) 192.168.0.1 같은 것..
게이트 웨이는 인터넷으로 접속하기 위한 일종의 관문 역할. 라우터는 인터넷 공간에서 각기 다른 호스트 사이를 연결해주는 기능을 수행하는데 이러한 기능을 라우팅이라 부른다.

pc와 게이트웨이 사이에 설정된 네트워크 ID는 동일하다고 볼 수 있다. ex)192.168.0 까지는 동일함. 스마트폰도 같은 wifi를 공유기 통해 사용한다면..
이처럼 동일한 네트워크 ID를 공유하는 장치들의 공간을 LAN(Local Area Network)영역이라고 한다. 그럼 호스트 ID는 랜 내부에서 사용되는 호스트들을 구분하기 위한 식별자이다.

LAN영역 안에도 많은 호스트(노트북은 1번, 스마트폰은 2번) 끼리 연결하는 경우, 다른 말로 출발지 IP주소와 목적지 IP주소의 네트워크 ID가 동일한 경우인데, 이런 경우네느 스위칭 이라고 부른다.

https://medium.com/pocs/tcp-ip-%EC%9D%B4%EB%A1%A0-ip-%EC%A3%BC%EC%86%8C-%EC%84%9C%EB%B8%8C%EB%84%B7-%EB%A7%88%EC%8A%A4%ED%81%AC-%EA%B7%B8%EB%A6%AC%EA%B3%A0-%EA%B8%B0%EB%B3%B8-%EA%B2%8C%EC%9D%B4%ED%8A%B8%EC%9B%A8%EC%9D%B4-ccd6d832711e

profile
낭만닥터와 슬의를 보고 저런 개발자가 되어야 겠다고 꿈꿔봅니다.

0개의 댓글