home FreeBSD Bike Misc Memorandum About

qmailのインストール

インストール

 私は例によってportsからインストールしましたが、一度は自分でコンパイルし、マニュアルに従ってインストールすることをおすすめします。構造が良く分かるからです。qmail群をつかさどる一連のユーザを登録することなどもありますので、qmailを理解する上でもはじめはportsを使わずにインストールをし、慣れてから必要があればportsなどを利用するのがいいでしょう。そしてそのやり方はINSTALLに書かれています。

# cd /usr/ports/mail/qmail
# make install

 これでコンパイル、インストールとqmailの実行に必要なユーザの作成をやってくれます。qmailのマニュアルによると(INSTALL.ids)、alias,qmaild,qmaill,qmailp,qmailq.qmailr.qmailsの7つのユーザと、qmail,nofilesの2つのグループが必要です。なお、FreeBSDのportsからインストールすると、nofilesというグループはqnofilesとして登録され、パッチでそれを使うようにされます。

 qmailのソフトウェア群は/var/qmail/以下にインストールされます。alias/以下にsendmailでいう/etc/aliasesのような設定を置き、control/以下にドメインの設定やどこからの転送を許可するかなどの設定ファイルを置きます。portsからmake installするとここもやってくれます。また、configure/内のconfigやconfig-fastを使って設定をしますが、自分のホスト名がdnsで引けないときちんと処理してくれないでしょう。configなどの中身はシェルスクリプトなので覗けば何をしているかは大体分かるでしょう。

 alias/内に最低限の設定を置きます。

# (cd ~alias; touch .qmail-postmaster .qmail-mailer-daemon .qmail-root)
# chmod 644 ~alias/.qmail*

 qmailはroot宛にメイルを転送しません。ここで設定したのはpostmaster、mailer-daemon、root宛のメイルをユーザaliasに転送することになります。私の場合は

# echo &bell > .qmail-root

などとして私のアカウントに転送させています。

 さて、qmailの特徴であるMaildirをユーザのホームディレクトリに作りましょう。ユーザ所有の700のMaildirディレクトリ中にこれまたユーザ所有の700であるnewとcurとtmpのディレクトリを作ればいいのですが、/bar/qmail/bin/にmaildirmakeというコマンドがあるので、これを利用します。これは実行したユーザ所有のMaildirを作成してしまうので、

# su hoge
$ maildirmake Maildir
$ exit

としてユーザhogeのホームディレクトリにMaildirを作成します。大量のユーザを抱えているときはシェルスクリプトを用意して作成するのがいいと思います。これからadduser等でユーザを加えるときは/usr/share/skel/無いに作っておけばユーザを登録するときに自動的にユーザのホームディレクトリに作成されるとおもいます(未確認)。

起動時に自動的に起動するようにしましょう。Maildirを使っているので/var/qmail/boot/maildirを/usr/local/etc/rc.d/qmail.shにコピーします。

 本当はsendmailがばりばり動いているホストだとqmailに入れ替えるときにキューをどうにかしなくちゃいけないなど悩むですが、私の場合はFreeBSDをインストールしてすぐにsendmailをとめているので移行について悩む必要は無いのです。sendmailからの移行についてもINSTALLファイルに記述されています。付属文書はよく読みましょうということですね。簡単な英語なので。また、ここでqmail-showctlを実行し、コントロールファイルの解釈がちゃんとできているか確認するとよいでしょう。

配送のテスト

/usr/local/etc/rc.d/qmail.sh start

としてqmailを実行します。FreeBSDならsyslog経由で/var/log/maillogにこんな感じでログが出ていると思います。

May 22 23:14:00 leon qmail: 1022076840.777069 status: local 0/10 remote 0/20

何らかの理由で起動できなかったときは"cannot start"が表示されると思います。psコマンドで実行されているか確かめて見ましょう。

qmails 831 1 736 c0c1ed00 0 IJ p0- 0:03.15 qmail-send
qmaill 834 831 736 c0c1ed00 0 IJ p0- 0:01.34 splogger qmail
root 835 831 736 c0c1ed00 0 IJ p0- 0:00.67 qmail-lspawn ./Maildir/
qmailr 836 831 736 c0c1ed00 0 IJ p0- 0:00.20 qmail-rspawn
qmailq 837 831 736 c0c1ed00 0 IJ p0- 0:00.21 qmail-clean

こんな感じでしょうか。ローカルへのメイルのテストをするには、

bell@mail> echo To: hogehoge| /var/qmail/bin/qmail-inject

などとして、maillogを見てみましょう。

May 22 23:34:45 leon qmail: 1022078085.918529 new msg 486654
May 22 23:34:45 leon qmail: 1022078085.920803 info msg 486654: bytes 204 from <bell@f-bell.net> qp 43987 uid 1000
May 22 23:34:45 leon qmail: 1022078085.924717 starting delivery 684: msg 486654 to local bell@f-bell.net
May 22 23:34:45 leon qmail: 1022078085.926897 status: local 1/10 remote 0/20
May 22 23:34:45 leon qmail: 1022078085.966230 delivery 684: success: did_0+0+1/
May 22 23:34:45 leon qmail: 1022078085.967798 status: local 0/10 remote 0/20
May 22 23:34:45 leon qmail: 1022078085.968189 end msg 486654

こんな感じで記録されていると思います。その他ローカルのエラーテスト、リモートへの送出テスト、ローカルpostmasterへのテスト、二重バウンスのテストなどを行います。TEST.deliverにやり方は書いてあると思います。

これでテストができました。なお、今の状態ではqmailはローカル→ローカル、ローカル→リモートでのメイル配送ができるようになっただけに過ぎません。port25をつかったMTAとなるように起動スクリプトを変えてやる必要があります。

SMTPとして設定する

 sendmailを利用している人は付属文書のSENDMAIL、REMOVE.sendmail、REMOVE.binmailを読んでおくとよいでしょう。sendmailを使っていなくても上記の付属文書を読んで/usr/sbin/sendmailや/usr/bin/mailの実行ビットを落としてリネームしたり、qmail付属のwrapperである/var/qmail/sendmailを適宜利用できるようにしておくとよいでしょう。CGIなどでsendmailを使っているときにはqmail付属のsendmailを置き換えるとよいと思います。

 さて、qmailをSMTPにしましょう。インターネットスーパーデーモン(inetd)から起動する方法と、djbのツール群のひとつであるtcpserverから起動する方法の二つがあります。ここではtcpserverを利用しましょう。また、qmailはcontrol/rcphostsに書いてあるホスト宛のメイルしか受け取りません(第三者不正中継の禁止)。LAN内のクライアントにだけこのsmtpサーバを利用して外部にメイルを送りたいこともあるでしょう。このときもtcpserverも利用します。

tcpserverのインストール

 例によってportsからのインストールです。tcpserverはucspi-tcpパッケージに入っています。

# cd /usr/ports/sysutils/ucspi-tcp/
# make install; make clean

 tcp-wrapperでいうhosts.allowにあたるものを作ります。たとえば、127.と192.168.0と192.168.1.のサブネットからの接続を許可したいならば、

127.:allow,RELAYCLIENT=""
192.168.1.:allow,RELAYCLIENT=""
192.168.0.:allow,RELAYCLIENT=""

 このように記述します。このあと、tcprulesを実行して、tcp.smtp.cdbを作成します。RELAYCLIENT変数があるとcontrol/rcphostsを無視してメイルを受け取るようになります。

# tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp

. 先ほどの起動スクリプト/usr/local/etc/rc.d/qmail.shに以下の設定を追加します(私のqmail.sh)。

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

 -u の引数にはqmaildのuidを、-gの引数にはnofiles(FreeBSDのportsからだとqnofiles)のgidを設定してください。これによって起動されたプロセスには、

qmaild 832 1 736 c0c1ed00 0 IJ p0- 0:00.51 /usr/local/bin/tcpserver -x /etc/tcp.smtp.cdb -v -u 82 -g 81 0 smtp /var/qmail/bin/qmail-smtpd
root 833 1 736 c0c1ed00 0 IJ p0- 0:00.58 /var/qmail/bin/splogger smtpd 3

 このようなプロセスが追加されています。これがSMTPとして動くMTAです。最後にTEST.receiveにあるようにテストをします。

 以上で終わりです。

説明

FreeBSD4.5-Release

私はMTAについてあまり知識はありません。sendmailもSendmailもまともにつかったことがないです。qmailについては多少経験があるので自分の構築するサーバのMTAはたいていqmailにしています。

qmailのよさはいろいろなところに紹介されていますが、シンプルな構造であることや、Maildir形式であること、実行ユーザが細かくなっている(qmaildなど)ことなどからセキュリティに配慮されています。ヴァージョンが1.03になってからかなり経つと思うのですが、いまだに脆弱な点は報告されていませんね。

2002/05/23

Creative Commons License
This work is licensed under a Creative Commons License.