メールサーバ qmail の設定

・ qmailについて

qmailは D.J.Bernstein氏による安全確実なメールサーバ(MTA)であり、 インストールや設定が簡潔であるため多くのサイトでqmailが使用されています。 実際のところ sendmail.cf の設定は非常に複雑で面倒であり、わずかな設定ミス が不正中継を許してしまいます。(単にTOMOsanに能力が無いだけかもしれませんが ^_^;;)
qmailの安全性については qmail日本語WWWページ に詳しく書かれています。


sendmailは すべてのメールを /var/mail/ディレクトリに、ユーザ名の 単一の ファイルとして配送します。しかしこの方式は ユーザ全員が同じディレクトリを 共有するという点と、複数のメールが単一のファイルに保存されるという点で 安全性に問題があります。qmailではこの方式を Mailbox形式と呼んでいます。 一方 qmailはこの他に、各ユーザー毎のディレクトリ内にメール配送用の ディレクトリ ~/Maildir/ を作成し、各メールはこれらのディレクトリ内に 一つずつ別ファイルとして保存されるように設定できます。 これを Maildir方式と呼んでいます。

ここでは qmailの特徴である ./Maildir/配送方式を前提とします。 準備すべきファイルは、関連するツールも含めて以下のとおり。

qmail-1.03.tar.gz
-> ftp://ftp.jp.qmail.org/qmail/qmail-1.03.tar.gz
qmail-date-localtime.patch
-> ftp://ftp.nlc.net.au/pub/unix/mail/qmail/qmail-date-localtime.patch
ucspi-tcp-0.88.tar.gz
-> http://cr.yp.to/software/ucspi-tcp-0.88.tar.gz
checkpassword-0.90.tar.gz
-> http://cr.yp.to/software/checkpassword-0.90.tar.gz

・ qmailのためのグループとユーザの設定

qmailでは なるべくroot実行権で動作させないために、2つのグループと7つの ユーザを使用します。これらを事前に作成しておきましょう。
グループ作成は 直接エディタで /etc/group ファイルを編集する方が 簡単です。ユーザの登録も vipw コマンドで直接編集する方が便利かも しれません。TOMOsanはこの方法を利用しています。

[/etc/group]
  ...
qmail:*:2100:
nofiles:*:2200:
  ...

[/etc/passwd --- vipwにて編集]
  ...
alias:*:2201:2200::0:0::/var/qmail/alias:/bin/sh
qmaild:*:2202:2200::0:0::/var/qmail:/sbin/nologin
qmaill:*:2203:2200::0:0::/var/qmail:/sbin/nologin
qmailp:*:2204:2200::0:0::/var/qmail:/sbin/nologin
qmailq:*:2101:2100::0:0::/var/qmail:/sbin/nologin
qmailr:*:2102:2100::0:0::/var/qmail:/sbin/nologin
qmails:*:2103:2100::0:0::/var/qmail:/sbin/nologin
  ...

・ インストール

メールサーバを構築する際は sendmail の場合もそうですが /var 以下の領域を大きめに確保しておきましょう。標準のパーティションサイズでは サーバとして運用するにはちょっと小さすぎるように思います。 出来れば1Gバイト程度、最低でも500MBくらいは確保しておく方が、後になって 泣かなくて済むかもしれません。

作業はroot で行いましょう。まず、インストールディレクトリの作成 からです。

su root
mkdir /var/qmail

それぞれのソースファイルは /usr/local/src に保存されているとします。 tar ball(圧縮されているソースファイル)を展開してコンパイルします。

cd /usr/local/src
tar zxvf qmail-1.03.tar.gz
cd qmail-1.03
make setup check

## qmailにJST表示のパッチを当てる場合は
tar zxvf qmail-1.03.tar.gz
cd qmail-1.03
patch -p1 < ../qmail-date-localtime.patch
make setup check

・ 初期設定

インストールまではほとんど問題なく終わると思いますが、その後いくつかの 設定を行わなければなりません。まず、インストールディレクトリで

./config-fast ns.xxxxxx.yyy.zzz (ホスト名)

としてください。qmailのデフォルトファイルが作成されます。 その他、postmaster、mailer-daemon、root 宛てのメールを処理するための エイリアスファイルを設定します。

cd /var/qmail/alias
touch .qmail-postmaster
touch .qmail-mailer-daemon
touch .qmail-root
chmod 644 .qmail*

ここでは touch コマンドで空のファイルを作成していますが、転送先が あらかじめ決まっている場合は、エディタで直接編集しても構いません。

[例).qmail-rootの内容]
&user
&tomosan@xxxxxx.yyy.zzz

初期設定のままでは、qmail は 自ホスト宛のメールしか処理を行わない設定に なっています。上記 ./config-fast で設定した場合、 user@ns.xxxxxx.yyy.zzz 宛のメールに関してのみ送受信を行います。
これを 自ドメイン宛のメールも処理するようにするためには、/var/qmail/conf ディレクトリ内のファイルを編集する必要があります。具体的には以下のファイル を編集します。

/var/qmail/conf/locals
/var/qmail/conf/rcpthosts

locals ... 外部 SMTPへの配送でなく、qmailが 自分で処理すべき ホスト・ドメイン名を記述します。初期設定では ns.xxxxxx.yyy.zzz のみが 記述されています。ドメイン名だけを指定した user@xxxxxx.yyy.zzz 形式の メールをローカル配送する場合には、ここにドメイン名を記述します。

rcpthosts ... 外部から転送されてきたときに、qmailが 受信する ホスト・ドメイン名を記述します。初期設定は同じく ns.xxxxxx.yyy.zzz です。 ドメイン宛のメールを受信するためには、ここにドメイン名を記述します。 この場合 DNSサーバの MXレコードで、配送先として指定する必要があります。

* ドメイン名でのメールの送受信をしたいときには、上記ファイルに ドメイン名を追加しなければならない、ということです。


次に、ブートスクリプトをコピーします。

cp /var/qmail/boot/home /var/qmail/rc

Maildir 形式の配送を行うために、/var/qmail/rc を変更します

qmail-start ./Maildir/ splogger qmail (./Mailbox → ./Maildir/)

qmailを実行します。ps コマンドで以下のとおりならOKです。

/var/qmail/rc &      (バックグランドタスクとして実行)
ps -ax               (動作を確認)
  PID  TT  STAT      TIME COMMAND
 ...
  261 con- I      0:02.60 qmail-send
  266 con- I      0:00.99 splogger qmail
  267 con- I      0:00.17 qmail-lspawn ./Maildir/
  268 con- I      0:00.06 qmail-rspawn
  269 con- I      0:00.28 qmail-clean

・ コマンドによるメール送信テスト

今までの設定が出来た時点で、インストールしたホストから直接コマンドによる メールの送信テストが行えます。ただし、同じホスト上のユーザに送る場合、 Maildir 形式で配送されますので、ユーザディレクトリに ./Maildir と、 .qmail ファイルを用意しておかなければなりません(後で詳述します)。

/var/qmail/bin/qmail-inject
to: testuser    (宛先を指定します。リモートでも構いません)
Hello           (本文を入力します)
[Ctrl]+[D]      (終了キーです)

うまく送信が出来ていれば、ユーザディレクトリ下の ./Maildir/new ディレクトリ にメールが配信されているはずです。リモートユーザの場合は、通常のメールソフト で確認してみてください。


・ qmail による配送の設定

qmailによるメール配送は、FreeBSD標準の inetd経由で行うことも可能ですが、 特別に理由がないかぎり、同作者による tcpserver 経由で行う方が qmail の特徴を十分に引き出せるため、tcpserver 経由とします。
クライアントからのメールの読み出しも、同じく tcpserver 経由で行います。 qmail用の qmail-popup は、パスワードチェック機構を持っていませんので、 同作者による checkpassword をインストールして使用します。

インストールは、いずれも展開したディレクトリで make setup check です。

cd /usr/local/src
tar zxvf ucspi-tcp-0.88.tar.gz
cd ucspi-tcp-0.88
make setup check
cd ..
tar zxvf checkpassword-0.90.tar.gz
cd checkpassword-0.90
make setup check

ここで、sendmailが動いていれば終了させます。

ps -ax | grep sendmail
  xxx  ??  Is     0:00.03 sendmail: accepting connections on port 25
kill xxx    (sendmail の pid)

自動起動しないように、/etc/rc.conf の設定を変更します。

sendmail_enable="NO"

sendmail の実行権を削除し、別の名前に変更します。
/usr/sbin/sendmail を利用するアプリケーションのために、qmailの sendmail wrapper を設定します。

chmod 0 /usr/sbin/sendmail
mv /usr/sbin/sendmail /usr/sbin/sendmail.org
ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail

* cronコマンドで実行されるroot宛てのセキュリティメールも sendmailの 機能を使用しています。


・ tcpserverの使用

接続するクライアントを指定するため tcpserver用のデータベースファイルを 作成します。ソースファイルは以下のとおりです。 決して余分な空白を含めないようにしましょう。 TOMOsanはこれで1週間くらい悩んでしまいました・・・

[/etc/tcp.smtp]    (for SMTP)
192.168.1.:allow,RELAYCLIENT=""
123.45.67.:allow,RELAYCLIENT=""
127.:allow,RELAYCLIENT=""
192.168.2.10:deny

[/etc/tcp.pop3]    (for POP3)
192.168.1.:allow
123.45.67.:allow
127.:allow
:deny

SMTP の場合 明示的に拒否する記述は特には必要ありません。配送されたメールの 受け取りを行う必要があるため、中継のチェックを行うクライアントの指定を 行います。一方、POP3の場合は指定したクライアント以外からの接続を拒否する 必要があるため、:denyの行が必要です。

実際のデータベースファイルに変更するためには tcprules コマンドを 使用します。

/usr/local/bin/tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
/usr/local/bin/tcprules /etc/tcp.pop3.cdb /etc/tcp.pop3.tmp < /etc/tcp.pop3

設定ファイルができたところで inetd から smtp、pop3サーバが起動しないように inetd.conf を確認しておきましょう。smtp、pop3がコメントアウトして あればOKです。

# example entry for the optional pop3 server
#pop3  stream  tcp  nowait  root    /usr/local/libexec/popper  popper
 ...
# example entry for the optional qmail MTA
#smtp  stream  tcp  nowait  qmaild  /var/qmail/bin/tcp-env  tcp-env 
  /var/qmail/bin/qmail-smtpd

qmailの起動と、smtp、pop3サーバの起動を /usr/local/etc/rc.d/qmail.sh と して起動スクリプトを作成します。長いですが smtp と pop3 の設定は 必ず一行で記述してください。
以下、スクリプトの内容です。

#!/bin/sh
/var/qmail/rc &

# -- smtp
/usr/local/bin/tcpserver -x /etc/tcp.smtp.cdb -v -u 2202 -g 2200 0 smtp /var/qmail/bin/qmail-smtpd 2>&1 | /var/qmail/bin/splogger smtpd 3 &

# -- pop3
/usr/local/bin/tcpserver -x /etc/tcp.pop3.cdb -v 0 pop3 /var/qmail/bin/qmail-popup mail.mydomain.org /bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir 2>&1 | /var/qmail/bin/splogger pop3d 3 &

・ ユーザディレクトリの設定

qmailを Maildir 方式に設定しましたので、各ユーザ毎にメール用のディレクトリ ~/Maildir/ と、設定用ファイル .qmail を作成します。 各ユーザディレクトリで、以下のコマンドを実行します。

/var/qmail/bin/maildirmake Maildir   (~/Maildir/ の作成)
echo './Maildir/' > .qmail           (.qmailファイルの作成)

これらの作業を作成したユーザ毎に行うのは非常に効率が悪いので、ユーザ登録 コマンド adduser コマンドを修正してしまいましょう。幸い adduser コマンドは perl によるスクリプトファイルですので、簡単に変更が出来ます。
ミスを防ぐために事前にコピーを作成しておきましょう。別名でコマンドを登録 してもかまいません。

cp /usr/sbin/adduser /usr/sbin/adduser.org

new_users() 関数内部で新規ユーザが登録されます。この中にユーザ用の ディレクトリとファイルを作成するスクリプトを追加します。
他にも上手い方法があるのかもしれませんが、system()関数で キーボードから 入力する内容をそのまま実行しています。

sub new_users {
## 修正前
  ...
    if (&new_users_ok) {
        ...
        &new_users_passwd_update;  print "Added user ``$name''\n";
        &new_users_sendmessage;
        &adduser_log("$name:*:$u_id:$g_id($group_login):$fullname");
        &home_create($userhome, $name, $group_login);
    } else {
## 修正後
 ...
    if (&new_users_ok) {
        ...
        &new_users_passwd_update;  print "Added user ``$name''\n";
        &adduser_log("$name:*:$u_id:$g_id($group_login):$fullname");
        &home_create($userhome, $name, $group_login);
    ## 以下4行を追加
        system("/var/qmail/bin/maildirmake $userhome/Maildir");
        system("chown -R $name $userhome/Maildir");
        system("echo './Maildir/' > $userhome/.qmail");
        system("chown $name $userhome/.qmail");

        &new_users_sendmessage;              ## 後ろに移動する
    } else {

・ alias ユーザの追加、個人メールの転送

qmail では 実際にはユーザとして存在していなくても、別名宛てのメールを 処理することが出来ます。sendmail での /etc/aliases ファイルへの記述に 相当するものですが、全てのエイリアスを一つの設定ファイルに記述するのでは なく、/var/qmail/alias ディレクトリに .qmail-xxxx 形式のファイルを作成します。

たとえば .qmail-postmaster は alias として作成されたファイルです。このファイルに 自分のメールアドレスを 記述しておけば、postmaster@mydomain.com 宛てのメールは自分に届くことに なります。また、.qmail-another-user というファイルを作成すれば、 another-user@mydomain.com 宛てのメールは、ファイルに記述されたアドレスに 配送されるようになります。 alias ファイル内には複数のメールアドレスを記述 することが可能ですので、担当グループ毎に alias ファイルを作成しておくと 便利です。


一方 qmail でのユーザレベルでのファイル転送は、sendmail が .forwardファイル を使用するのに対し、ユーザディレクトリの .qmail ファイルに転送先を記述して ゆきます。 ローカルにも配信し、さらに another@yourdomain.net に転送する のであれば、~/.qmail の内容は

./Maildir/
&another@youdomain.net

となります。



TOMOsan Top Page に戻る
パソコン・プログラミングに戻る


Copyright(c) 2001 Tomohiko Saito. All rights reserved.
last update :