世界を動かす技術を、日本語で。

モダンメッセージング:自分自身のXMPPサーバーを運営する

概要

  • 欧州委員会 によるチャット監視計画の懸念
  • プライバシー保護 のための自分専用XMPPサーバー構築
  • ejabberd を用いた安全なメッセージング環境の設定手順
  • ファイルアップロード・登録・TLS対応 の具体的な設定方法
  • Nginxリバースプロキシ やクライアント選定のポイント

XMPPサーバー構築とプライバシー保護

  • チャットやファイルの監視・流出リスク が高まる現状
  • 欧州委員会による 全チャット・メール自動監視計画 の進行
  • 言論の自由 を守るため、個人でのXMPPサーバー構築の重要性
  • XMPP は低リソース・高可用性・暗号化・多機能を実現
  • Debian系OSRaspberry Pi OS で導入可能

必要なDNS設定

  • xmpp.example.com (メインサーバー)
  • conference.xmpp.example.com (多人数チャット用)
  • proxy.xmpp.example.com (SOCKS5プロキシ用)
  • pubsub.xmpp.example.com (PubSub用)
  • upload.xmpp.example.com (ファイルアップロード用)
  • stun/turn.xmpp.example.com (音声・ビデオ通話用)

ejabberdのインストール方法

  • ProcessOneリポジトリ または GitHubリリース からインストール
  • 必要な ファイアウォールポート の開放(例:5222, 5223, 5269, 5280, 5443, 7777, 3478, 5349)
  • 設定ファイル は /etc/ejabberd/conf/ejabberd.yml か /opt/ejabberd/conf/ejabberd.yml

ejabberdの主要設定

  • プライバシー重視 の設定(mod_bosh, mod_last無効化等)
  • サーバードメイン の指定
  • データベース はsqliteを推奨
  • Diffie-Hellmanパラメータ の生成と設定
  • s2s通信のTLS必須化
  • リスナー設定 (各種ポートごとに役割分担)

管理者ユーザーとACL設定

  • rootユーザー を管理者として登録
  • ACL・アクセスルールの設定で 管理者権限 を明確化

ファイルアップロード機能

  • mod_http_upload を有効化し、アップロードフォルダを作成
  • 最大ファイルサイズ やCORSヘッダーの設定
  • cronジョブ による定期的なファイル削除

登録機能

  • mod_register で登録を許可
  • CAPTCHA によるスパム防止
  • パスワード強度 の設定

TLS証明書とNginxリバースプロキシ

  • ejabberd自身でTLS証明書取得 が可能
  • Nginx 等のリバースプロキシを推奨
  • host-meta/host-meta.json でWebSocket接続の案内

推奨クライアントと追加情報

  • Profanity (CLI)、 Monal (Mac/iOS)などを推奨
  • 公式XMPPサイト で他クライアントも紹介
  • Chat Control に対抗する市民団体情報や解説リンクも参考

まとめ

  • 個人運用XMPPサーバー はプライバシー保護の有力手段
  • ejabberd は堅牢かつ柔軟なXMPPサーバーソフトウェア
  • 設定・運用 にはセキュリティとユーザビリティのバランスが重要
  • Nginx等のリバースプロキシ を組み合わせて安全性向上
  • 信頼できるクライアント を選び、安心してコミュニケーションが可能

Hackerたちの意見

Prosodyを使い始めてもう何年も経つよ。なんで他のサーバーじゃなくてこれを選んだのかは聞かないでね。前はjabber.orgのアカウントを使ってて、当時はjabberでgchatやFacebookメッセンジャーのユーザーともやり取りできてたんだ。でも今は、妻と連絡を取るためだけに使ってる :(

Prosodyは最高だね。ejabberdから乗り換えた理由は忘れちゃったけど、かなり信頼性があって、サポートしてる拡張機能もめちゃくちゃ多かった。ejabberdの設定はちょっと怖かったけど、実際はそんなに難しくなかった。Prosodyはほんとに簡単だった。

Prosodyは設定が簡単で、俺には結構うまくいったよ。通知を受け取るためにシンプルなボットを設定したんだ。全体の設定は素晴らしいけど、通知の部分が超不安定なんだ。使ってるiOSクライアントの問題だと思う。

前回これを試したとき、リアクションをサポートしているiOSクライアントすら見つからなかった。Matrixの複雑さをどれだけ批判してもいいけど、家族に使ってもらうときは、少なくとも現代的な体験ができて、他のメッセンジャーを使うのを諦めた気分にはならないからね。

最近、みんなを移行させようとしたけど、iOSの状況は厳しいね。通知がどのアプリでも全く機能してないみたいで、チャットには大きな問題だよ。それに、たしかSiskinだったかな?グループチャットで送信者の名前やアバターが表示されないから、誰が何を送ったのか分からない。E2EEの動作にも変な挙動があって、グループチャットで困ってる。最初はうまくいってたけど、今は「このメッセージはこのデバイス用に暗号化されていません」みたいなエラーが出て、いくつかのメッセージが読めなくなってる。ちなみに、AndroidのConversationsアプリではすべてうまく動いてるし、正直あんまりマニュアルを読んでないから、怠け者の管理者として自分のせいかもしれない。追記:これはejabberdの話ね。

Monalを使ってるけど、まあまあだね。リアクションが欠けてるのは同意だけど、通知とかは完璧に動いてるから、私にとってはそっちの方が重要だった。

家族がMatrixを使ってた数年間、E2EEの機能がランダムに履歴の復号に失敗して、「この絵文字を合わせてアカウントを解除してね」って画面が出ることが多かった。これに加えて、テキストの文脈では役に立たない不要な機能(連邦、スペース)や、メッセージログを検索する方法がないし、サーバーの管理も必要で…。結局、RCSに戻ったよ。

iOS用のXMPPクライアントで、ちゃんとiOSのHIGに従ってて、見た目がダサくない、使えないものは一つもないよ。フル機能のクライアントもほんとに少ない。macOSのXMPP環境はもっと厳しいね。

それにしても、iOSのウェブプッシュ通知は本当にひどい状態だね。https://webventures.rejh.nl/blog/2024/web-push-ios-one-year/ 誰もがウェブアプリの代替を受け入れるわけじゃないのは分かるけど、iOSがウェブアプリのメッセージサービスを使う可能性を妨げてるのは残念だよね。

最後にこれを試したとき、リアクションをサポートしてるiOSクライアントすら見つけられなかった。Matrixの複雑さをどれだけ嫌ってもいいけど、家族に使ってもらうときは、少なくとも現代的な体験ができて、他のメッセンジャーと比べて全てを失う気がしないんだよね。ちゃんと動いてくれたらいいんだけど。皮肉じゃなくて、アプリはほんとに不安定なんだ。リアクションはいいけど、メッセージ送信機能がちゃんとしてないと意味がないよね。

XMPPは良い現代的なクライアントがなかったから、みんなひどいプロトコルを作って、そのプロトコル用にこういう機能を持つ現代的なクライアントを作ったんだ。そこには完全にスキップできた余分なステップがあって、もっと良くなってたはず。

俺は、Matrixがカスタム絵文字を実装する前に、リアクションをサポートするiOSクライアントを書けると思うよ。

XMPPの潜在的な問題の一つは、デフォルトのポートが公共のWi-Fiでよくブロックされること。nginx-xmppを使ってプロキシする方法もあるけど、アーカイブされてるみたい。だから、HTTPベースのプロトコルの方がネットワーク上ではずっと簡単に感じるし、拡張なしで簡単にリバースプロキシできるものは自己ホスティングしやすくて、インターネット接続のアクセスも広がるよ。

少なくともProsodyはBOSH(HTTP上のXMPP)とWebSocketでの通信を実装してるよ。自分では試したことないけど、人気のある非ブラウザのXMPPアプリやクライアントはあんまり使ってないみたい。

デフォルトのポートはそういうネットワーク(公共のWi-Fiや企業のファイアウォールなど)でよくブロックされるけど、逆に開いてることも多い。5222はWhatsAppが使ってるし、5223はAppleのプッシュ通知が使ってるから、そんなに悪くはないよ。でも、443でXMPPを運用することも全然可能で、これは多くの人気のあるXMPPデプロイメントの特徴なんだ。自己ホスティングするなら、いろんなデプロイ方法のガイドがここにあるよ: https://wiki.xmpp.org/web/Tech_pages/XEP-0368

サードパーティのモジュールは必要なくて、ALPNに基づいてプロキシできるから、ポート443で全部動かせるよ。(https://wiki.xmpp.org/web/Tech_pages/XEP-0368#nginx)ALPNは暗号化されてないと思うけど、公衆Wi-Fiサービスは気にしないよね。

自宅のネットワークでejabberdを動かしてて、Conversations(Androidアプリ)と一緒に使ってるんだ。これで、すべてのデバイスが俺のスマホ、タブレット、PCにステータスを報告してくれる。Dockerと一緒に使えばアップグレードも簡単だし、文句も言わない。RabbitMQに似た感覚があって、あんまり使わなくなったけど、信頼できるソフトだと思ってた。Erlangで書かれてるのが関係あるのかなって思ってる。

XMPPが大好き!通知を逃したことがないし、Matrixにこだわらずもっと早く戻ってくればよかったな。最近もっと注目されるといいなって思ってる。自分でデスクトップクライアントを作って、MumbleみたいなVoIPを統合して、Discordみたいな音声チャンネルを作りたい誘惑に駆られてるけど、俺には無理だな。

「欧州委員会は3年前から、すべてのチャット、メール、メッセンジャーの会話を自動的に監視する計画に取り組んでいる。これが通るなら、そして通らないことを強く願ってるけど、EUは言論の自由を抑圧する国々の方向に進んでいる。」もしこれが実現したら、2つのアプローチがあるだろうね。1. 重要なことはオンラインで共有せず、対面でだけ話す 2. 友達グループには、チャットインフラを運営する技術に詳しい人がいる。面白い記事だけどね :)

  1. 普通の人は監視を受け入れ、技術者は追跡されて黙らされる。今の監視社会とソーシャルネットワークを考えると、(1)や(2)は現実的な選択肢には見えないな。

#2についてだけど、俺とほとんどの友達や家族はアメリカにいるけど、友達や家族にそういうのを提供するつもりだよ。今、ホスティングサーバーでいくつかの追加サービスを動かすために、/29から/28のサブネットに移行しようとしてる。いい感じのMailuの設定があって、Nextcloud(か他の代替)やxmppサービスを拡張したいと思ってるんだ。主に軽めのホストVMとDocker Composeの構成を使って、アップダウンやバックアップ、リストアをスムーズにしてる。今は複数のサーバーで動かしてないけど、もうちょっと一貫した設定ができるようにしたいな。TLS用にCaddyとTraefikを使ってて、アプリはサーバー上で/apps/appName/(data|docker-compose.yml)に配置してるから、メンテナンスもリモートSSHコマンドとrsyncで比較的簡単なんだ。全体を終わらせるのがちょっと怠けてるけどね。

Google(とFacebook?)がチャット機能にXMPPを使ってた頃をまだ覚えてるよ。どんなXMPPクライアントでもログインして、Googleのインフラを使ってる人とチャットできたんだ。いい時代だったな、今は老けた気がする。

そういえば、昔はPidginを使ってFacebookの人たちとチャットしてたな!あの頃が懐かしい。

そうそう、iChatで4つの異なるアカウントにログインしてたことがあったよ。その中の一つがAIMだった。

delta.chatをチェックしてみて!サーバーは自分で設定した伝統的なメールサーバーでも、彼らの最適化されたdovecotやSMTPリレーでもいいよ。クライアントはすごく良くて(リアクションもあるし!)、関連するアプリストアもかなりいい感じだよね。

実はこの前の週末に初めてDelta.chatをいじってみたんだ。ちょっと面白いね。もし新しいコミュニケーションが必要になったら、これを使うかもしれない。(今は特に必要ないけど)

自宅でXMPPのセットアップをやってるんだけど、Prosodyを選んでみた。Luaの柔軟性とクリーンな設定モデルが気に入ってるよ。興味がある人のために、全プロセスをドキュメントにまとめたよ(IRCブリッジとかも含めて!)ここで見られるよ。音声/ビデオ通話についても、STUN/TURNサーバーを使った方法を紹介してる。最近、みんながフェデレーションやモバイルクライアントをどう扱ってるのか気になるな。自分はConversations(F-Droid)とGajimを使ってる。

興味があるかもしれないリンク: https://xmpp.org/extensions/xep-0384.html