Erlangで書かれた Jabber (XMPP) サーバのejabberdについて。
Debian GNU/Linux (etch) での利用を前提とします。
user@example.jp という XMPP のユーザが利用できる jabber サーバをserver.example.jp というマシンで運用するものとします。このサーバの管理者は「admin@example.jp」であるとします。
インストール
aptitude を使って ejabberd をインストールします。私は etch にて、backports.orgにある新しいバージョンを使っています。
# aptitude install ejabberd
すると、debconf によって、サーバ名、管理者のアカウント名とパスワードを尋ねられます。尋ねてこない場合は、
# dpkg-reconfigure --force ejabberd
を実行します。
The name of the host ejabberd will serve には「example.jp」を、The name of an admin account for ejabberd には「admin」を、The password for the admin account には admin@example.jp 用のパスワードを入力します。パスワードは確認のため、もう一度尋ねられます。
これでサーバの設定と、管理者のアカウントの作成が完了します。
Webによる管理画面
http://server.example.jp:5280/admin/
にブラウザでアクセスし、ユーザ名に、「admin@example.jp」を入れ、パスワードとして、debconf の際に入力したパスワードを入れると、管理画面にアクセスできます。
管理画面はejabberd Admin Interfaceにあるようなものが表示されます。
DNSの設定
XMPPには、サーバ間で通信する機能があります。これを使えば、同じ XMPP を使ってるGoogleトーク やwassr、はてなメッセージ との間で相互にメッセージをやりとりすることもできます。
user@example.jp というアカウントを動かしているサーバに外部からコンタクトさせるには、メールでいうところの MX のようなレコードを追加する必要があります。
_jabber._tcp.example.jp. IN SRV 5 0 5269 server.example.jp. _xmpp-server._tcp.example.jp. IN SRV 5 0 5269 server.example.jp. _xmpp-client._tcp.example.jp. IN SRV 5 0 5222 server.example.jp.
SRVレコードは、いろんなプロトコルで利用できる MX のようなので、簡単な説明としてSRVリソースレコードって何ですか?を参照。
上記の記述は、jabber/TCPやxmpp-server/TCPプロトコルは server.example.jp.のポート5269で、xmpp-clientプロトコルは server.example.jpのポート5222で稼働している、という意味になります。特に複数のサーバで負荷分散させてるわけではないので、Priorityは5、Weightは0に固定してあります。
ユーザ管理
ユーザの作成はejabberdの組み込みデータベースを使ったユーザの管理の場合、
- ejabberdctl コマンドによる、コマンドラインからの追加
- jabber (XMPP) クライアントによる「登録」処理
- ejabberdのWeb 管理画面からの追加
といった方法があります。
ほかには、LDAPとの連携、データベースサーバとの連携も可能です。
大量のユーザを管理するのであれば、LDAPなどを使うほうが良いでしょう。
コマンドラインからのユーザ追加
user@example.jp というユーザを PasSwOrd というパスワードで追加するには
# ejabberdctl register user example.jp PasSwOrd
とすればOKです。
jabber (XMPP) クライアントによる「登録」処理
たとえば、Pdiginの場合、
- 「アカウント(A)」→「追加/編集」で「アカウント」のダイアログを表示
- 下にある「追加(A)」ボタンを押して「アカウントの追加」のダイアログを表示
- 基本(B)タブで以下の情報を入力し「登録」を押すと、アカウントが登録されます。「登録」ではなく、「保存」ならば、既に登録したアカウントが使えるようになります。
- 「プロトコル」は「XMPP」
- 「スクリーン名」は「user」
- 「Domain」は「example.jp」
- 「リソース」は適当な文字列
- 「パスワード」は設定したいパスワードの文字列
Web管理画面からの追加
http://server.example.jp:5280/admin/ にアクセスし、あらかじめ作成しておいた管理者用のアカウント admin@example.jp と、そのパスワードを入力します。
次に「Virtual Hosts」を選択します。すると、Hostが列挙されていますので、そこから「example.jp」を選択します。
そうすると、選択肢の中に「Users」が出現します。これをクリックすると
User:[ ]@example.jp Password:[ ] [Add User]
のフォームが出てくるので、ユーザ名とパスワードを入れ、「Add User」をクリックするとユーザが登録されます。
IPv6対応
Debian (etch) の ejabberd では、デフォルトでは IPv4 のアドレスでしかlisten しません。
# netstat -nlp | grep beam
で見てみると、
tcp 0 0 0.0.0.0:5222 0.0.0.0:* LISTEN 1234/beam tcp 0 0 0.0.0.0:5223 0.0.0.0:* LISTEN 1234/beam tcp 0 0 0.0.0.0:5269 0.0.0.0:* LISTEN 1234/beam
となり、IPv4 でのみ LISTEN していることがわかります
そこで、/etc/ejabberd/ejabberd.cfg の listen 設定内の各項目にinet6 というオプションを付けます。
{listen, % Ordinary client-2-server service [{5222, ejabberd_c2s, [{access, c2s}, {max_stanza_size, 65536}, inet6, starttls, {certfile, "/etc/ejabberd/ejabberd.pem"}, {shaper, c2s_shaper}]}, % SSL-enabled client-2-server service {5223, ejabberd_c2s, [{access, c2s}, {max_stanza_size, 65536}, inet6, tls, {certfile, "/etc/ejabberd/ejabberd.pem"}, {shaper, c2s_shaper}]}, % Server-2-server service {5269, ejabberd_s2s_in, [{shaper, s2s_shaper}, inet6, {max_stanza_size, 131072}]}, (以下略)
このように書きかえ、ejabberd を再起動すると
tcp6 0 0 :::5222 :::* LISTEN 2345/beam tcp6 0 0 :::5223 :::* LISTEN 2345/beam tcp6 0 0 :::5269 :::* LISTEN 2345/beam
となり、[::]:5222 等の IPv6 のアドレスで listen するようになりました。
DNSのエントリも修正し、SRV で指定した A なホストに AAAA も付加しておきましょう。
% dig _xmpp-client._tcp.example.jp. SRV (略) ;; ANSWER SECTION: _xmpp-client._tcp.example.jp. 86400 IN SRV 5 0 5222 server.example.jp. ;; AUTHORITY SECTION: example.jp. 86400 IN NS ns0.example.jp. example.jp. 86400 IN NS ns1.example.jp. ;; ADDITIONAL SECTION: server.example.jp. 86400 IN A 192.168.0.1 server.example.jp. 86400 IN AAAA 2001:xxx::xxx