メールサーバーといえば sendmail。それくらい MTAとして有名。
しかし、その設定の複雑さやセキュリティ面での不安など抱えている課題は多い。
そこで qmailの登場となる。
小さな複数のプログラムが集まって構成されているため個々にバグが発生する確率は小さく、セキュリティホールもできにくい。
おまけに、高速且つメンテナンス性もsendmailより良い。
sendmailの管理には高いスキルを要求されるため、設定間違えも起こりやすくSPAMメール対策も面倒なことから、
この際qmailに乗り換えてしまおう。
まずは、qmail のためのディレクトリを作成。特に問題がなければ、デフォルトの
/var/qmail を作る。
次に qmail が使用するユーザーとグループの登録を行う。
続いてコンパイルし、alias の設定ファイルを作成
# groupadd nofiles
# useradd -g nofiles -d /var/qmail/alias alias
# useradd -g nofiles -d /var/qmail qmaild
# useradd -g nofiles -d /var/qmail qmaill
# useradd -g nofiles -d /var/qmail qmailp
# groupadd qmail
# useradd -g qmail -d /var/qmail qmailq
# useradd -g qmail -d /var/qmail qmailr
# useradd -g qmail -d /var/qmail qmails
# make setup check
# ./config
# cd ~alias; touch .qmail-postmaster .qmail-mailer-daemon .qmail-root
# chmod 644 ~alias/.qmail*これで、インストールは完了。続いて、細かい設定を行う。
me
まずは /var/qmai/control 配下の me、locals、rcpthosts 等の内容に間違えがないか、
また、必要であれば追加を行う。一例を以下に。
db.bush.ne.jp これは qmail を走らせるPCのFQDNが記述してあればOK
locals
localhost
bush.ne.jpqmail はこのファイルを参照してローカルユーザ宛とリモートユーザー宛のメール振り分けを行う.。
rcpthosts
この例でいえば、taka@tokyo.bush.ne.jp はローカル宛と見なされ、それ以外はリモート宛であると判断される。
.volcano.co.jp .bush.ne.jp このファイルでは、MUAやSMTPに接続してのメール配信の際、RCPT TO:コマンドで受け入れるアドレスを指定する。
先頭が「.」で始まっているものは、任意のサブドメインを表し、
taka@tokyo.bush.ne.jpやlambs@sleep.volcano.co.jpといったアドレスを受け入れるように指定している。
逆に、ここに記述していないアドレスからの中継要求(配送要求?)は拒否されるようになる。
クライアントマシンから MUAでti2nd@tkd.att.ne.jp宛にメールを出すとき、
qmailをSMTPサーバーとして使おうとすると、上記の設定では通らない。
あらたにtkd.att.ne.jp(或いは .att.ne.jp)を追加記述する必要がある。
いわゆる迷惑メールの意図しない中継をシャットアウトできるわけだ。また、/var/qmail/alias/配下には主に root 宛のメールを転送する設定ファイルを記述しておく。
.qmai-root
.qmail-mailer-daemon
.qmail-postmaster
.qmail-default
といったファイルをとりあえず作製しているが、中身はどれも「&taka」として、
「root」宛のメールは全て「taka」に転送するようにしている。
この場合は「管理者=taka」なため一つだけしか転送先を指定していないが、複数人の場合は
&taka
&admin1
&admin2と書き並べておけばよい。
とりあえず、インターネットには繋げずに、ローカルユーザー宛にメールの配送がきちんとできるかを確認する。
これを怠ると、ネットワーク全体に迷惑を掛けることになりかねないので、本番前の事前確認だけは慎重すぎるほどでよい。# /var/qmail/boot/home &
としてqmailを起動。
このとき、以下のように5つのqmailプロセスが動作していることを確認しよう。
# ps aux | grep qmail
qmails 328
0.0 0.1 796 348 p0 S 18:43 0:00 qmail-send
qmaill 347 0.0 0.1 764 356 p0 S 18:43 0:00 splogger qmail
root 348 0.0 0.1 752 288 p0 S 18:43 0:00 qmail-lspawn ./Mailbox
qmailr 349 0.0 0.1 752 288 p0 S 18:43 0:00 qmail-rspawn
qmailq 350 0.0 0.1 752 300 p0 S 18:43 0:00 qmail-clean
root 1441 0.0 0.1 856 360 p1 S 22:22 0:00 grep qmail
次にqmail-injectを使った配送テスト。
# echo to:taka | /var/qmail/bin/qmail-inject
とすると、ローカルユーザー(この場合は taka)宛にメールを送れる。
そして、確実に配送されているかどうかを確認する。ところが、ここで問題発生。
私の環境に限るのかもしれないが、ローカルへのメールが届かない。
qmailの設定をどれだけ見直しても、DNSかと思い(ってそれはqmailの性質上ないんだけど)チェックしてみたり、
MUAの設定もあれやこれやと変更してみるが、全くローカル配信がうまくいかない。
qmailではなく、sendmailを使えば問題ないことからqmailの設定に原因があるのだろうとは思っていた。結局、/var/qmail/doc/INSTALL.mboxを読むことで、解決の糸口をみつけた。
どうやら、qmailはそれまで私が使用していたメールボックスとは別のものを使っているようだった。
起動時の引数で、./Mailboxとあるのがそれで、
意味は「ユーザーホームディレクトリにあるMailbox を使用する」という感じになる。
今までの私は、/var/spool/mail/userをメールボックスとして使用していたので、
当然qmailに変更すればメールが届かなくなるわけだ。
正確には、qmailは.~user/Mailboxにメールを配信しているのに、
/var/spool/mail/userを必死になって読み込んでいたのだから、qmailで送られたメールは読めるわけもない。
では、どうやってこの問題を解決するか。
~user/Mailboxへのシンボリックリンクを/var/spool/mail/userとして作ってしうのが一番簡単な方法だろう。
(ただし、速度的には遅くなるらしい)
この時、/var/spool/mail/userにデータが残っている場合は、一度シングルモードでLinuxを立ち上げなおし、
~user/Mailboxに移動してから、シンボリックリンクを張る。
(~user/Mailbox に既にデータがあった場合はどうするんだろう・・・?)
また、多くのMUAが環境変数の”MAIL=”を参照することから、~user/.bashrcなどに適切な設定を記述する。
(例:export MAIL=$HOME/Mailbox)さらに、INSTALL.mbox を読んでみると、qpopperなどのMUAが直接~/Mailboxを読みに行くようにする方法が書かれていた。
具体的には(私がqpopperを使っているのでその部分についてふれる)
「pop_dropcopy.c の中の /.mail を /Mailboxに変更して、コンパイルの際に、CFLAGSに-DHOMEDIRMAILを付ける」
らしのだが、pop_dropcopy.c の中にそのような箇所がないのだが・・・?
バージョンによって違うのだろうか?
ということで、直接読みに行くようにはできなかったが、とりあえずの回避方法が見つかったのでよしとしよう。さて、ローカル配信がうまくいき、qmailの機能がうまく動作していることが確認できたら、
ローカル、リモート、どちらのユーザに対してもうまくメールが送れるようなら、
今度はリモートユーザーへのメール配信の確認だ。
インターネットへ繋げて、
# echo to:taka@dokkano.server.ne.jp | /var/qmail/bin/qmail-inject
としてみる。
実際に送信され、リモートユーザーまで届いたかどうかを確認する。
いよいよsendmailをqmailに置き換える。
とはいっても、それほど対した作業ではない。まずは、sendmailが動いていれば停止させ、Linuxの起動と同時にsendmailが立ち上がるような設定
(おそらくはスクリプトでかかれているはず)になっていれば、それも変更して起動させない。
次に、
# mv /usr/lib/sendmail /usr/lib/sendmail.bak
# ln -s /var/qmail/bin/sendmail /usr/lib/sendmail
として、既存のsendmailのバックアップを取り、新たにqmailのsendmailラッパーにシンボリックリンクを張る。
そして、/etc/inetd.conf に以下の一行を追加。
smtp stream tcp nowait qmaild /var/qmail/bin/tcp-env tcp-env
/var/qmail/bin/qmail-smtpd
*注)2行に分かれてしまったが、実際には1行で書くこともちろん、/etc/inetd.confに変更が加わったのだから、
PCを再起動させるなり、inetd をkill-HUPするなりでinetd を再起動させる。これで、置き換えは完了なので、後は思う存分メール配送テスト(?)を行うだけ