2004/11/ 7

FreeBSDでqmail(Mail)

はじめに

必要に迫られて、MTAの一つであるqmailを学ぶことになりました。今のところ自宅サーバのMTAはPostfixで順調に動いているのですが今回qmailをセットアップしたのでその記録をエントリします。

セットアップの前提条件として

  • Virtual Domain(複数ドメイン)対応
  • POP Before SMTPを実装

を含んでいます。APOPには今回は対応しません。

必要なパッケージ

qmailを運用させるのに必要なパッケージは以下の通りです。

  • qmail
  • ucspi-tcp
  • checkpassword
  • daemontools
  • relay-ctrl

portsを最新にして、portinstall等からインストールして下さい。

※もし、qmailの付与するヘッダの日付がGMTじゃなく、localtime(JST)で表示させたい場合は先に以下の設定をしてパッチの準備をしておきます。

# cd /usr/ports/mail/qmail/files
# fetch http://mirror.averse.net/pub/FreeBSD/ports/local-distfiles/sada/qmail-date-localtime.patch.gz
# gzcat qmail-date-localtime.patch.gz > patch-date-localtime
# rm qmail-date-localtime.patch.gz

※一応標準設定で不正中継対策は大丈夫なように出来ていますが、「telnet relay-test.mail-abuse.org」 で全てのチェックをパスしたいときには先に以下の設定をしてパッチの準備をしておきます。

# cd /usr/ports/mail/qmail/files
# fetch http://www.qmail.org/qmail-smtpd-relay-reject
# mv qmail-smtpd-relay-reject patch-qmail-smtpd-relay-reject

簡単にそれぞれのパッケージの説明をします(間違っているかもしれません)。

qmail MTA本体
ucspi-tcp qmailをセキュアな状態で運用するためのwrapper
tcpserverというプログラムからqmailの各種プログラムを呼び出す
checkpassword popでメール受信する際に行うパスワードチェックプログラム
qmailのパッケージに入っているpop3デーモンが呼び出す
daemontools relay-ctrlの有効期限クリア処理をcronから呼び出すときに必要
relay-ctrl qmailでPOP Before SMTPを実現するためのwrapper

qmailの設定(標準編)

先ずは普通にメインとなるドメイン一本でメールの送受信が行えるように設定しましょう。

本エントリではメインとなるドメイン名は「hijiki.net」と記述しますので間違ってもそのまま自分の環境にコピペせずに自分の環境で利用するドメイン名を記述してください。

/var/qmail/controlの設定

qmailの各種初期設定情報は/var/qmail/controlディレクトリ配下に準備します。設定するマシンのIPアドレスがグローバルアドレスでネームサーバで逆引き設定がされている場合は以下のコマンドで自動で設定されます。

# /var/qmail/configure/config

私の環境では上記コマンドを実行するとプロバイダの名前が各種設定ファイルに登録されてしまうので、自分で/var/qmail/controlディレクトリ配下のファイルを編集する事になりました。以下に個々のファイルの設定内容を示します。

/var/qmail/control/defaultdomain
hijiki.net

↑これは@以下が省略されたメールを送信した際に自動的に付与するドメイン名です。

/var/qmail/control/locals
localhost
hijiki.net

↑受信するホスト名ドメイン名を記述します。これはqmail-sendというプロセスが参照します。

/var/qmail/control/rcpthosts
localhost
hijiki.net

↑受信するホスト名ドメイン名を記述します。これはqmail-smtpdというプロセスが参照します。後述するVirtual Domainを設定する時にもこのファイルをいじります。

/var/qmail/control/me
hijiki.net

↑自サーバのFQDNを指定します。

/var/qmail/control/plusdomain
net

↑ドメイン部が+で終わっている場合にその後ろに付与する文字列を指定します。何の為にあるのかよく分かりません。適当でいいと思います。

aliasの設定

qmailのaliasはファイル形式で1ファイル1アドレスとなっています。/var/qmail/aliasの下を見ると以下の三つのファイルがあると思います。

# cd /var/qmail/alias
# ls
.qmail-mailer-daemon .qmail-postmaster .qmail-root

それぞれの中を覗くと空っぽになっています。ファイル名は「.qmail-」以下の文字列がユーザを指しており、例えば.qmail-infoというファイルを作成すると、それはinfo@hijiki.netに対するalias定義という事になります。

とりあえず上記三つのファイルの中にmailer-daemon@hijiki.net(以下略)に来たメールをuser1に転送するように設定しましょう。この操作はpostmaster,rootについても同じ様に行って下さい。

/var/qmail/alias/.qmail-mailer-daemon
&user1

これでmaile-daemon@hijiki.netに来たメールはuser1@hijiki.netが受け取ることが出来ます。

ちょっと補足ですが、qmailはメールを受信した際に先ず/var/qmail/aliasを見て宛先を確認し、次にpasswd内のユーザ一覧を見ます。まあ、更にユーザ個別のalias設定とかも出来るのですが、それは置いておくと、どこにも配信先がない場合は送信元にエラーメールが返信されます。

しかし、/var/qmail/alias/.qmail-defaultファイルの中に&user1を記述しておくと、宛先不明のメール全てをuser1が受け取ることが出来ます。

tcpserverの設定

qmailのデーモンはtcpserverから起動されます。tcpserverはいわゆる接続制御を行ってくれます。

今回はsmtpに対するアクセスをローカルエリア内からのみアクセス可能な設定をします。自宅の環境はネットワークが192.168.0.0/24となっています。

場所はどこでもいいのですが、/etc配下にtcp.smtpという名前でファイルを作成します。中身は以下の様に設定します。

/etc/tcp.smtp
192.168.0.:allow,RELAYCLIENT=""
127.:allow,RELAYCLIENT=""

tcpserverはplain text状態のtcp.smtpファイルを認識する事が出来ないので、cdb形式のファイルに変換します。以下のコマンドで/etc/tcp.smtp.cdbが作成されます。

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

今回はsmtpに対する制限だけを説明します。pop3についても制限をかけることが出来ますが、今回は省略します。

relay-ctrlの設定

relay-ctrlはqmailのsmtpとpopを監視し、POP Before SMTPを実現するプログラムですが、POPへのアクセス後一定時間経ったらSMTPの許可リストをクリアするために、cronで1分周期でプログラムを実行させる必要があります。

普通にportinstallでrelay-ctrlを入れたのなら、後はcrontab -eでcrontabに以下の一行を追加します。

* * * * * /usr/local/bin/envdir /usr/local/etc/relay-ctrl /usr/local/bin/relay-ctrl-age

ここでenvdirを使用して/usr/local/etc/relay-ctrl配下の環境変数を設定する為、daemontoolsが必要だったのです。

デフォルトでPOPタイムアウト時間は900秒(15分)になっています。/usr/local/etc/relay-ctrl/RELAY_CTRL_EXPIRYの中身を変更すればタイムアウト時間の調整が行えます。

/var/qmail/rcの作成

portsからqmailをインストールすると、/usr/local/etc/rc.d/qmail.shの実体は/var/qmail/rcにシンボリックリンクされています。しかし実際にはそのファイルは存在しませんので、一から作る必要があります。

今回のqmailの設定は

  • tcpserverを使う
  • pop3はqmail添付のものを使う
  • relay-ctrlを使ってPOP Before SMTPを実現する

となりますので、rcファイルの中身は以下のように設定します。

/var/qmail/rc (/usr/local/etc/rc.d/qmail.sh)
#!/bin/sh
case $1 in
start)
        echo "Start qmail ..."
        exec env - PATH="/var/qmail/bin:$PATH" \
        qmail-start ./Maildir/ splogger qmail &

        /usr/local/bin/envdir /usr/local/etc/relay-ctrl \
        /usr/local/bin/relay-ctrl-chdir \
        /usr/local/bin/tcpserver -v -u 82 -g 81 -x /etc/tcp.smtp.cdb 0 smtp \
        /usr/local/bin/relay-ctrl-check \
        /usr/local/bin/fixcrio \
        /var/qmail/bin/qmail-smtpd 2>&1 | /var/qmail/bin/splogger smtpd 3 &

        /usr/local/bin/envdir /usr/local/etc/relay-ctrl \
        /usr/local/bin/relay-ctrl-chdir \
        /usr/local/bin/tcpserver 0 pop3 /var/qmail/bin/qmail-popup hijiki.net \
        /usr/local/bin/checkpassword \
        /usr/local/bin/relay-ctrl-allow \
        /var/qmail/bin/qmail-pop3d Maildir &
        ;;
stop)
        echo "Stop qmail ..."
        PID=`/bin/ps -afwww | grep qmail | awk '{print $1}'`
        if [ ! -z "$PID" ] ; then
                /bin/kill ${PID} 1> /dev/null 2>&1
        fi
        ;;
status)
        /bin/ps -afw | grep qmail
        ;;

*)
        echo "usage: `basename $0` {start|stop|status}" >&2
        exit 64
        ;;
esac

非常に難解ですが、これもqmailの特徴でqmail単体では非常にシンプルなメール配送しか行わず、他のアドインソフト(tcpserver,relay-ctrl等)を色々組み合わせて順番に指定して複雑な機能を実現する形を取っています。

メールスプールディレクトリの準備

qmailは他のMTA(sendmailやPostfix)と違って、受信したメールは各人のホームディレクトリにスプールされます。

そのために事前にスプール用ディレクトリである~/Maildirを作成します。~/Maildirの下には更に三つのディレクトリがありますので、以下のコマンドを使用して自動で作成しましょう。

# su - user1
> /var/qmail/bin/maildirmake ~/Maildir
> exit
#

この操作はメールを受信する全てのユーザで行って下さい。rootの権限のまま各人のホームディレクトリに作成した場合はchownでそれぞれのユーザの権限に変更を忘れないようにしてください。

qmailの設定(起動編)

既に他のMTAが動いている場合は止めて下さい。またPOPサーバも停止します。ここからしばらくはメールの送受信が行えなくなりますので手際よく作業を行って下さい。

sendmailの停止(必要に応じて作業)

以下のコマンドで停止します。

# sh /etc/rc.d/sendmail stop

後は再起動時に自動でsendmailが立ち上がらないように/etc/rc.confを修正します

/etc/rc.conf
sendmail_enable="NONE"

Postfixの停止(必要に応じて作業)

以下のコマンドで停止します。

# postfix stop

後は再起動時に自動でPostfixが立ち上がらないように/usr/local/etc/rc.d/postfix.shをpostfix.sh.norun等にリネームします。

popの停止(必要に応じて作業)

popデーモンをinetd経由で起動していると仮定します。

/etc/inetd.confのpop3の行をコメントアウトします。

/etc/inetd.conf
#pop3 stream tcp nowait root /usr/local/libexec/qpopper qpopper

最後にinetデーモンにHUPシグナルを送ればpopサーバは停止します。

# killall -1 inetd

mailer.confの編集

FreeBSDは/usr/sbin/sendmail等は全てmailwrapperというプログラムにシンボリックリンクが張られていて、/etc/mail/mailer.confで定義することにより自由に各種コマンドを別のMTAのものに入れ替えることが出来ます。

まあ、既にPostfix等別のMTAを使ったことのある人には説明は不用ですが、今回はqmailを使うのでmailer.confを以下のように設定します。前のファイルをバックアップするかどうかはお任せします。

/etc/mail/mailer.conf
sendmail        /var/qmail/bin/sendmail
send-mail       /var/qmail/bin/sendmail
mailq           /var/qmail/bin/qmail-qread
newaliases      /var/qmail/bin/newaliases
hoststat        /var/qmail/bin/qmail-tcpto
purgestat       /var/qmail/bin/qmail-tcpok

qmailの起動

さて、いよいよqmailを起動します。別にOSをrebootしてもいいのですが、以下のコマンドで起動て、その直後にステータス確認を行いましょう。

# /usr/local/etc/rc.d/qmail.sh start
Start qmail ...
# /usr/local/etc/rc.d/qmail.sh status
62183 p0 I 0:00.03 qmail-send
62186 p0 I 0:00.04 /usr/local/bin/tcpserver 0 pop3 /var/qmail/bin/qmail-popup hijiki.net /usr/local/bin/checkpassword /usr/l
62187 p0 I 0:00.01 splogger qmail
62188 p0 I 0:00.01 qmail-lspawn ./Maildir/
62189 p0 I 0:00.00 qmail-rspawn
62190 p0 I 0:00.00 qmail-clean
63440 p0 S+ 0:00.01 /bin/sh /usr/local/etc/rc.d/qmail.sh status
63442 p0 S+ 0:00.00 grep qmail

上記のようにqmail-*が沢山起動していればとりあえずOKだと思います。

動作確認

あとはローカル配送、外へ向かっての配送、外からの受信を適当なメーラーを使って確認します。

Virtual Domain対応

qmailのVirtual Domain対応はSendmailやPostfixと違って、メインで受けるドメイン(今回はhijiki.net)とその他に受け取る追加ドメインとで扱い方が大きく変わります。

具体的にはVirtual Domain対応の専用ユーザを作成し、そのユーザに配信されてくるVirtual Domainの全てのメールを、その専用ユーザ配下のalias設定ファイルで目的のユーザに配信する形式を取ります。

rcpthostsにドメイン追加

今回はVirtual Domainを二つ用意すると仮定して説明します。ドメイン名はexample.comとexample.netの二つにしましょう。

先ずは前の章で説明したrcpthostsにこの二つのドメインを追加します。

/var/qmail/control/rcpthosts
localhost
hijiki.net
example.com
example.net

転送設定と専用ユーザの作成

Virtual Domain宛に来たメールを一手に受けるユーザとして適当な名前の一般ユーザを作成してください。adduserの使い方は知っていますよね?

今回はvirtualというユーザを作成します。このユーザはこの後の設定で転送されてきたメールを更に個々のユーザに配信するだけの役目なので、~/Maildirディレクトリの作成は不要です。

転送設定ですが、/var/qmail/control/virtualdomainsというファイルを新規に作成して、以下の例の様に設定します。

/var/qmail/control/virtualdomains
example.com:virtual-com
example.net:virtual-net

設定ファイルを見ると、コロンの左がVirtual Domain名で右が転送するユーザ名っぽいですが、ユーザ名virtualの後に「-com」「-net」と付いています。

これでもちゃんとvirtualユーザに転送されますので、間違ってvirtual-comユーザとか作らないようにしてください。

このハイフン以下の名前は後でも説明しますがそれぞれのドメイン名を識別する為の名前です。example.comとexample.netの両方のドメインのメールをただ一人のvirtualユーザが受け取って、仮にyotan@example.comはfooに、yotan@example.netはbarに転送したい時に区別させるためにこの様に識別名を付与します。

もちろん、Virtual Domain名毎に転送用アカウントを作っても構いません。

転送設定

それでは前章に引き続きexample.comとexample.netに来たメールを個々のユーザに振り分ける設定をしましょう。

ここから先の説明は全てvirtualユーザでの作業となります。~virtualは/home/virtualという前提で説明します。

  • yotan@example.comのメールはfooユーザが受ける
  • yotan@example.netのメールはbarユーザが受ける

上記設定の場合、qmailのaliasを以下のように設定します。

/home/virtual/.qmail-com-yotan
&foo
/home/virtual/.qmail-net-yotan
&bar

※当たり前ですが、foo,barユーザは実在して~/Maildirを作成しておいてくださいね。

冒頭で説明した通り、qmailのaliasは.qmail-defaultで知らない宛先のメールを転送できますが、今回の場合も応用で、/home/virtual/.qmail-com-defaultといった具合にファイルを作って転送させる事もできます。

設定の有効化

rcpthostsを変更したら、qmail-sendプロセスを再起動するかHUPシグナルを送ります。簡単なのは以下の操作ですね。

# killall -HUP qmail-send

もちろん/usr/local/etc/rc.d/qmail.shをstop/startしてもいいです。

おわりに

「qmailはシンプルで設定が簡単だ」とどこかのサイトに書いてありましたが、実際Virtual Domainも含めて一つ一つ実験しながら設定すると、ずいぶんと時間が掛かってしまいました。

設定の簡単さ(情報の多さ、分かりやすさ)から見ると、Postfix > Sendmail > qmailといった感じです。

しかし、qmailは軽いのと、幾つものプログラムを組み合わせて自由にカスタマイズが可能という点は優れていると思います。今回はapopについて記述しませんでしたが、色々なサイトを見ていると多種のapop対応プログラムが提供されているみたいで、どれを適用したらいいのか分からず、今回は見送りました。

他にもメールキューの管理を簡単にするqmHandleとかも試しました。色々とまだまだ便利なツールがありそうですので、また別の機会にエントリしたいと思います。

#今回は設定もそうだけど、このエントリを書くのも疲れました(^◇^;)

投稿者 yotan : 2004年11月 7日 23:41| トラックバック(0)
アンケート
このエントリは・・・
とても役に立った
役に立った
どちらとも言えない
あまり役に立たなかった
全く役に立たなかった
コメント
コメントする

※コメント内にURLを書くとSPAM扱いとなります。2ch風に表記はOKです










名前、アドレスを登録しますか?