LinuxでMosquitto MQTT Brokerをマスターする:インストールから実運用まで

Network tutorial - IT technology blog
Network tutorial - IT technology blog

なぜMosquittoは今でもIoTプロジェクトの「王道」なのか?

スマートホームや産業用センサーシステムを構築する際、最大の課題は何百ものデバイス(ESP32やRaspberry Piなど)をサーバーをダウンさせずに接続することです。半年以上の実運用を経て、私は今でもMosquittoを選んでいます。非常に軽量だからです。512MB RAMの安価なVPSでも、わずか10MB未満のリソース消費1,000以上の同時接続をスムーズに処理できます。

MQTTはPublish/Subscribe(出版/購読)モデルで動作します。デバイス同士が直接通信するのではなく、Brokerと呼ばれる中央のハブを介してメッセージをやり取りします。MosquittoはそのBrokerの役割を担い、MQTT v3.1からv5.0までの標準規格に完璧に準拠しています。

以前、ピーク時のパケットロスに悩まされたことがありました。メッセージが数十秒遅延し、不安定なネットワーク向けのデフォルト設定が原因でデバイスが再接続を繰り返していました。この記事では、そうした初心者が陥りがちなミスを回避し、最短ルートで構築する方法を解説します。

Linux(Ubuntu/Debian)へのMosquittoのインストール

ほとんどのLinuxディストリビューションでMosquittoが利用可能です。今回はUbuntu 22.04を使用しますが、DebianやRaspberry Pi OSでも手順は全く同じです。

まず、システムを最新の状態に更新します。

sudo apt update && sudo apt upgrade -y

Broker and Clientパッケージ(コマンドテスト用)を一行でインストールします。

sudo apt install mosquitto mosquitto-clients -y

インストール後、サービスが起動しているか確認します。

sudo systemctl status mosquitto

active (running)と緑色で表示されればOKです。しかし、すぐに使い始めてはいけません。バージョン2.0以降、Mosquittoのセキュリティ設定は非常に厳格になっています。適切に設定しないと、外部デバイスから接続できません。

セキュリティ設定:脆弱性を塞ぐ

デフォルトでは、Mosquittoはlocalhostからの接続のみを許可し、パスワードも不要です。実プロジェクトで使用するには、ポートを開放し認証を設定する必要があります。

1. リスナーと認証の設定

メインの構成ファイルは編集せず、管理やバックアップがしやすいようにconf.d内に専用のファイルを作成しましょう。

sudo nano /etc/mosquitto/conf.d/default.conf

以下の設定内容を貼り付けます:

# すべてのIPからのアクセス用にポート1883を開放
listener 1883 0.0.0.0

# 接続にアカウント認証を必須にする
allow_anonymous false

# パスワードファイルの場所を指定
password_file /etc/mosquitto/passwd

2. ユーザーアカウントの管理

最初のユーザー(例:admin_user)を作成します。パスワードの入力を2回求められます。

sudo mosquitto_passwd -c /etc/mosquitto/passwd admin_user

注意: -cオプションは既存의ユーザーをすべて削除してファイルを新規作成します。2人目以降のユーザーを追加する場合は、データを失わないように-cを外してください。

3. Persistence(永続性)の最適化

サーバーの再起動やネットワークの瞬断時にメッセージが失われないよう、default.confの末尾に以下の行を追加します。

persistence true
persistence_location /var/lib/mosquitto/
# 30分ごとにデータをディスクに保存
autosave_interval 1800

変更を適用するために再起動します:

sudo systemctl restart mosquitto

コマンドによる動作確認

すべてが正常に動作しているか確認するために、データ送信デバイスと受信アプリをシミュレートします。

データ受信 (Subscribe)

ターミナルを開き、リビングの温度センサーからのメッセージを待機します:

mosquitto_sub -h localhost -t "home/livingroom/temp" -u "admin_user" -P "your_password"

データ送信 (Publish)

2つ目のターミナルを開き、28.5度の温度データを送信します:

mosquitto_pub -h localhost -t "home/livingroom/temp" -m "28.5" -u "admin_user" -P "your_password"

最初のターミナルに即座に28.5と表示されれば、Brokerの準備は完了です。

運用ノウハウと高度なセキュリティ

システムをインターネットに公開する場合、ユーザー名とパスワードだけでは不十分です。ポート1883を流れるデータはプレーンテキスト形式であり、傍受されるリスクがあります。

  • SSL/TLSの導入: 常にポート8883を使用し、Let’s Encryptなどの証明書で通信全体を暗号化してください。
  • ACL(アクセス制御リスト)の活用: 詳細な権限設定を行います。温度センサーがドアの解錠コマンド(トピック door/unlock)を送信できてしまうような設定は避けてください。
  • 稼働監視(Monitoring): $SYS/broker/clients/connectedトピックを購読します。この数値が急増した場合、DDoS攻撃やデバイスの接続ループが発生している可能性があります。

Mosquittoを使いこなすのは難しくありませんが、不安定なネットワーク環境で安定稼働させるには工夫が必要です。この記事が、より堅牢なIoTシステムの構築に役立てば幸いです。SSLやACLの設定でエラーが出た場合は、コメント欄で教えてください。サポートします!

Share: