はじめに
MQTTを使うならもうちょいプロトコルを理解しておいたほうがよいかなと思ったので、パケットを観察してみた。
しなかったこと
AWS IoT(あきらめた)
最初、AWS IoTにpublishしたりsubscribeしたりするところを観察してたけど、tlsで暗号化されてて、復号の仕方がいまいちわかんなかった。なので、まずは、ローカルでmosquittoってのを動かして試すことにした。
コンテナ
Mac上のコンテナで作業したけれど、mosquittoのオフィシャルイメージは使わなかった。既存のコンテナを使ったので。
eclipse-mosquitto - Docker Hub
コンテナを分けるのも考えたけど、めんどくさくなってやめた。
全部localhostでやると、だれがpub/subしたかわからないので、真面目にやるにはこういう環境が必要そう。
DockerとMosquitto™でMQTTに触れる - Qiita
したこと
環境
適当にDockerのコンテナ作って作業した。
debian系。
mosquittoはこんな感じでいれた。
mosquitto-clients
をいれないと、mosquitto-sub
とか使えなかった。
apt-get install mosquitto
apt-get install mosquitto-clients
tcpdump
ここらを参考にしようとしたけど、docker0
が見当たらなかった。
Dockerコンテナの上で流れるパケットをキャプチャ方法 - Qiita
macOSだとないっぽい。他のOSでどう見えるか確認してないけども。
Docker Desktop for Mac のネットワーク機能 | Docker ドキュメント
macOS 上に docker0 ブリッジがない🔗
Docker Desktop for Mac におけるネットワーク機能の実装方法により、ホスト上から docker0 インターフェースを見ることはできません。 このインターフェースは仮想マシン内にあります。
よくわからないので、コンテナ内で、ダンプした。ローカルでしか動かしてないので、lo
を見てる。
tcpdump -i lo -s 0 -w ./hoge4.cap
ちなみに、これでlo
とかeth0
とかの情報みれた。ifconfig
は入ってなかった。
ip a
mosquitto
これで、ブローカーを動かしてそう。
mosquitto -d
subscriber側。
mosquitto_sub -h localhost -t topic/001
publisher側。
mosquitto_pub -h localhost -t topic/001 -m "hello!"
publishすると、subscriber側で、メッセージが表示される。
Wireshark
capファイルは、コンテナからMacに移動して読み込んでる。vscodeだと、右クリックからのDownloadで持ってこれるから楽。コマンド覚えなくても直感的にわかっていい感じ。楽。
上記方法でdumpしたcapファイルをOpenすると、こんな感じで見える。
protocolがMQTTのだけ表示している。
TCPのヘッダ情報とMQTTのパケット情報をいい感じに見れる。
MQTTの情報もいい感じに解析してくれて表示してくれるので、フォーマット知らなくてもそれっぽい情報を理解できる。
encryptされてないので、portは1883。
QoSがAt most once delivery
なこともわかる。
それっぽい流れがみれる。ただ、全部ローカルで動いてるので、だれ(pub or sub or ブローカー)がどれかわかりにくい・・・。
こんな感じ。
- Conn→Conn ack→Sub→Sub ack
- Conn→Conn ack→Pub→Pub→Disconn
最後に
パケットの中身みれると、プロトコルの理解が進む。教科書的な情報だけやと、イメージしにくいので。もうちょい、いろいろ試してみるか。
参考
仕様
ここがやたら詳しい。ありがたや。
MQTT Version 3.1.1 をふりかえる - OPTiM TECH BLOG
しかしそれ故か、中途半端な実装のものが多く、細かい挙動までをカバーしたライブラリ自体は少ないのもまた事実です。
これが、衝撃的。まじか。
こっちの方の記載も参考になった。簡潔で丁寧。
MQTTを調べている - Qiita
wiki
The default unencrypted MQTT port is 1883. The encrypted port is 8883.[19]
確かに、1883やった。
パケットのキャプチャ
先人。
MQTTのパケットを覗いてみた(1) | MQTT and ...
その他
これ、気になる。そのうち試してみたいけど、時間とれるかなぁ。
MQTTの通信を可視化する - shiftr.io - Qiita
mosquitto
参考にした。
ドローン楽しそう。
MQTTブローカーのセットアップ - Qiita
TLS
ここらを参考にdecryptしようとしたけど、よくわからず断念。
HTTPSやから、今回やろうとしてるところとも、雰囲気違いそう、
もうちょい、基礎的な知識が必要そう。勉強したことあった気もするけど、わからんかった。
出直してこよう。
Wireshark Tutorial: Decrypting HTTPS Traffic (Includes SSL and TLS)
HTTPSのパケットをwiresharkで見てみる - Qiita
【解析】https(SSL/TLS)をwiresharkで復号化する方法(SSLKEYLOGFILE),ブラウザで見る方法 | SEの道標
MacでSSLKEYLOGFILE
にログをためるのは、こんな感じらしい。
Wireshark で HTTP/2 over TLS の通信をダンプする方法 · GitHub