ejabberd

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の組み込みデータベースを使ったユーザの管理の場合、

といった方法があります。

ほかには、LDAPとの連携、データベースサーバとの連携も可能です。

大量のユーザを管理するのであれば、LDAPなどを使うほうが良いでしょう。

コマンドラインからのユーザ追加

user@example.jp というユーザを PasSwOrd というパスワードで追加するには

# ejabberdctl register user example.jp PasSwOrd

とすればOKです。

jabber (XMPP) クライアントによる「登録」処理

たとえば、Pdiginの場合、

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