Kozupon.com    
 
 強力なMTA、qmailを使おう!(改訂版)


qmailのインストールを説明してるサイトは数多くあるので、重複する部分はあるが、俺はMTAのなかではqmailの大のファンなのであえて俺自身のインストール方法を説明する。
ここに記載するのは自分でインストール方法をわすれるのを回避 する目的でもある(笑)!

インストール先のディストリビュションOSはLaser5Linux6.5サーバエディションである。
メールサーバのホスト名は、仮に hoge.hogehoge.com として説明する。

■ ここでのMTA構築ポリシー(設定を以下前提で行う)
1) メールリレー禁止
2) あらかじめ決められたIPアドレス以外のメールクライアントからのメール送信禁止
3) 明示したドメインを FROM :に持たないメール送信禁止
4) EXPN/VRFYコマンドの使用禁止
5) メール配送形式はMaildirを使う

qmailは少々前準備とインストールが厄介である。


1.前準備

(1) Sendmailの削除

俺の場合、Sendmailが動いていたので完全に削除した。
Sendmailモジュールの確認。

# rpm -qa | grep sendmail

sendmail削除。

# rpm -e sendmail<バージョン>

Sendmailのmbox形式もqmailで扱うことは出来るが、俺の場合はSendmailは一切使うのを止めたかったので一切のモジュールを消去した。

(2) qmailのソースをゲット

ここ で入手できる。
俺のインストールソースは、qmail-1.03.tar.gzであった。

(3) qmailのパッチファイルのゲット

基本的には、パッチは必要ないが、qmailの生成するヘッダー内の日付をローカルタイムに修正するパッチをあてたので、これもダウンロードする。
qmail-date-localtime.patch
ここ でゲットできる。

さらに、qmailにはDNS関連でバグが存在する。DNSに関するUDPパケットが512バイトを超えると処理できなくなる。この問題を解決するパッチを ここ でゲットする。

また、不正中継防御が完壁ではないため、パッチが提供されているそのパッチqmail-smtpd-relay-rejectを ここ でゲットする。

(4) checkpassword

checkpasswordは、パスワードチェックプログラムでpop認証で使用する。
checkpassword-0.90.tar.gz
ここ でゲットできる。

(5) tcpserver

tcpserverは、inetdと同じくIPの接続要求を受け付け、指定されたプログラムを起動する。
ucspi-tcp-0.88.tar.gz
ここ でゲットできる。


2.インストール

ソースディレクトリは、/usr/local/srcで行うことを前提とする。

(1) qmailの解凍とパッチの適用

ルート権限で実行する。このときにパッチqmail-date-localtime.patchとqmail-103.patchは解凍した/usr/local/src/qmail-1.03のディレクトリに解凍後、cpまたはmvする。

# tar zxvf qmail-1.03.tar.gz
# cd qmail-1.03

# patch < qmail-date-localtime.patch

次に、DNSに関連したバグ修正パッチの適用。

# patch < qmail-103.patch

次に、不正中継防御用パッチの適用。

# patch < qmail-smtpd-relay-reject

(2) qmailディレクトリの作成

ソースをコンパイルしても、qmailは自分のディレクトリを作らない。
したがって、あらかじめディレクトリを作っておく必要がある。

# mkdir /var/qmail

(3) ユーザとグループの登録

qmailで使用するユーザとグループを作成する。必要なユーザとグループを以下に示す。

● ユーザ

alias
qmaild
qmaill
qmailp
qmailq
qmailr
qmails

● グループ

qmail
nofiles

1)Linuxのばやい

# groupadd nofiles
# adduser -g nofiles -s /bin/true -d /var/qmail/alias alias
# adduser -g nofiles -s /bin/true -d /var/qmail qmaild
# adduser -g nofiles -s /bin/true -d /var/qmail qmaill
# adduser -g nofiles -s /bin/true -d /var/qmail qmailp

# groupadd qmail
# adduser -g qmail -s /bin/true -d /var/qmail qmailq
# adduser -g qmail -s /bin/true -d /var/qmail qmailr
# adduser -g qmail -s /bin/true -d /var/qmail qmails

2)FreeBSDのばやい(pwコマンドを使おう!)

# pw groupadd nofiles
# pw useradd alias -g nofiles -d /var/qmail/alias -s /noexistent
# pw useradd qmaild -g nofiles -d /var/qmail -s /noexistent
# pw useradd qmaill -g nofiles -d /var/qmail -s /noexistent
# pw useradd qmailp -g nofiles -d /var/qmail -s /noexistent

# pw groupadd qmail
# pw useradd qmailq -g qmail -d /var/qmail -s /noexistent
# pw useradd qmailr -g qmail -d /var/qmail -s /noexistent
# pw useradd qmails -g qmail -d /var/qmail -s /noexistent

(4) qmailのコンパイル

qmailを展開したディレクトリで、

# make setup check

これでコンパイルされ、/var/qmailに必要なファイルがインストールされる。

(5) qmailのイニシャライズ

次に、qmailのイニシャライズを行うコマンドラインから、

# ./config-fast hoge.hogehoge.com            ← 自ホストFQDN

これを行うことにより、/var/qmail/controlディレクトリに以下のファイルが出来ていることを確認する。

defaultdomain
defaulthost
locals
me
plusdomain
rcpthosts

これらのファイルが有れば良い。

(6) エイリアスの登録

qmailが使用する最低限のエイリアスを登録する。登録は以下のようにする(rootへ転送する場合の例)。

# cd /var/qmail/alias
# echo "&root" > .qmail-postmaster
# echo "&root" > .qmail-mailer-daemon
# echo "&ユーザ名@hogehoge.com" > .qmail-root

以上、全てのファイルにパーミッションを与える。

# chmod 644 .qmail*

メールを破棄したい場合は、

# echo "#" > .qmail-postmaster

(7) qmailの起動ファイルのコピー

qmailのブートファイルをrcファイルとしてコピーする。/var/qmail/aliasがカレントディレクトリである場合、

# cd ../boot
# cp home ../rc

(8) rcファイルの編集

rcファイルを以下のように訂正する。

# cd ../
# vi rc

#!/bin/sh
# Using splogger to send the log through syslog.
# Using qmail-local to deliver messages to ~/Mailbox by default.

exec env - PATH="/var/qmail/bin:$PATH" \
qmail-start ./Maildir/ splogger qmail

(9) /var/qmail/controlディレクトリへファイルの追加及び編集

/var/qmail/controlディレクトリのファイルを追加修正する。
現在のファイルは、以下である。

# ls -al
defaultdomain
defaulthost
locals
me
plusdomain
rcpthosts

こいつらの意味 −>

defaultdomain            ← ドメイン名が省略された時付加される名前を設定する
defaulthost             
← ホスト名省略時に付加される名前を設定する
locals                 
← ローカル処理する場合のドメイン名を設定する
me                                                        
← 自ホストFQDNを設定する
plusdomain             
← アドレス部の末尾が「+」の時に補完するドメイン名を設定する
rcpthosts              
← メールを受信すべきドメインを設定する(MAX 50件)。50件以上になった場合は、morercpthostsファイルを作り、ドメインを追加する

次に、taro@hogehoge.comのようにメール配送が出来るように以下のファイルを追加する。

# vi envnoathost
hogehoge.com

# vi plusdomain
hogehoge.com

さらに、以下のファイルを確認して以下のようになっていなければ編集すること。

# cat defaultdomain
hogehoge.com

# cat defaulthost
hoge.hogehoge.com

# cat locals
localhost
hoge.hogehoge.com
hogehoge.com

# cat me
hoge.hogehoge.com

# cat rcpthosts
localhost
hoge.hogehoge.com
hogehoge.com

(10) maildir形式の設定

qmailは配送形式が標準でmaildir形式を採用しているため、登録ユーザのHOMEディレクトリにMaildirディレクトリを
設置し、メールの配送先にする。

1)Linuxのばやい

# /var/qmail/bin/maildirmake /home/<ユーザ名>/Maildir
# chown -R <ユーザ名>.<グループ名> /home/<ユーザ名>/Maildir
# echo "./Maildir/" > /home/<ユーザ名>/.qmail
# chown -R <ユーザ名>.<グループ名> /home/<ユーザ名>/.qmail

2)FreeBSDのばやい(コロンだけの違い)

# /var/qmail/bin/maildirmake /home/<ユーザ名>/Maildir
# chown -R <ユーザ名>:<グループ名> /home/<ユーザ名>/Maildir
# echo "./Maildir/" > /home/<ユーザ名>/.qmail
# chown -R <ユーザ名>:<グループ名> /home/<ユーザ名>/.qmail


3.プロセスと動作確認

(1) qmailを動かしてみる

qmailのデーモンは、/var/qmail/rcを実行することにより動作する。したがって、以下のように実行する。

# csh -cf /var/qmail/rc &

(2) プロセスの確認

プロセスが起動しているか、psコマンドで確認する。

# ps axw | more

省略

-sh -cf /var/qmail/rc
qmail-send
splogger qmail
qmail-lspawn ./Maildir/
qmail-rspawn
qmail-clean

省略

以上が立ち上がっていれば良い。

(3) 動作確認

動作確認には、qmail-injectを使用する。

# /var/qmail/bin/qmail-inject
to: taro
TEST
ctrl+D

送信しているか確認。

# cat /var/log/maillog

省略

内容から判断して、メールを配送した形跡が有れば成功!


4.自動起動の設定

(1) Linuxで/etc/rc.d/rc.localにスクリプトを書く場合

qmailを再起動したときに自動的に起動させるため、/etc/rc.d/rc.localファイルに以下の記述を追加する。

# vi /etc/rc.d/rc.local

# qmail boot-up

if [ -f /var/qmail/rc ] then
     /bin/csh -cf /var/qmail/rc &
fi

(2) FreeBSDでのブートアップスクリプト起動の場合

# vi qmail.sh

#!/bin/sh

#qmail boot-up
if [ -f /var/qmail/rc ] ; then
     /bin/csh -cf /var/qmail/rc &
fi


5.tcpserverのインストール

(1) tcpserverをインストール

smtpサーバの起動設定を行う前に、tcpserverをインストールする。

# tar zxvf ucspi-tcp-0.88.tar.gz
# cd ucspi-tcp-0.88
# make setup check


6.smtpサーバの起動設定

(1) inetd.confの編集

smtpモジュールは、qmail-smtpを使用する。したがって、inetd.confに以下の記述を追加する。

# vi /etc/inetd.conf
 
省略
 
smtp stream tcp nowait qmaild /usr/sbin/tcpd /var/qmail/bin/tcp-env /var/qmail/bin/qmail-smtpd

省略

 
(2) TCP Wrapperによるセキュリティ(不正中継防止)

inetd.confにsmtpセクションを追加したので、当然Wrapperでセキュリティ設定をしよう!
以下のように、hosts.allowに追加する。

# vi /etc/hosts.allow

#qmail RELAY
tcp-env: 192.168.255.6, 127.0.0.1 : setenv = RELAYCLIENT             ← 自ホストのIPとローカルホスト
tcp-env: 192.168.255. : setenv = RELAYCLIENT                    ← 中継を許可するクライアント
tcp-env: ALL                                          ← 外部からメールを受信する設定(リレーはしない)

(3) inetdデーモンの再起動

# killall -HUP inetd

もしくは、

# /etc/rc.d/init.d/inet restart


7.popサーバの起動設定

(1) checkpasswordのインストール

popサーバは、qmail-pop3dを使用するが、その前にパスワードチェックプログラムをインストールする。

# tar zxvf checkpassword-0.90.tar.gz
# cd checkpassword-0.90
# make setup check

(2) inetd.confの編集

# vi /etc/inetd.conf

pop-3  stream  tcp  nowait  root  /var/qmail/bin/qmail-popup qmail-popup hoge.hogehoge.com /bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir  ← 一行に書く

(3) TCP Wrapperに外部からの受信を許可する設定を追加する。

# vi /etc/hosts.allow

qmail-pop3d : ALL : allow

(4) inetdデーモンの再起動

# killall -HUP inetd

もしくは、

# /etc/rc.d/init.d/inet restart


8.テスト

以上でqmailのセットアップは全て完了。実際に送受信テストを行ってください。うまく行くはずです。
その他、詳細情報は qmail公式サイト を参照してください。


9.qmailの管理

(1) 停滞キューの確認

# /var/qmail/bin/qmail-stat

(2) 停滞キュー詳細内容確認

# /var/qmail/bin/qmail-qread

(3) 停滞キューの強制排出

# kill -14 <qmail-sendのプロセスID>

(4) 停滞queueによる糞詰まり

これは、私が特に不便に思っていたことを解決したので掲載する。
(3)の停滞キューの強制排出で強制排出をおこなってもqueueにどうしても貯まっている未送信メールを削除したい場合がある。特に、qmailの設定を間違えていてテスト時、多量に送信queueが貯まってしまった場合などである。

★ Postfixでは、postsuperというコマンドがあり、-dオプションにMessageIdを付けて実行すれば停滞queueが削除できる。これには、結構お世話になっています。

しかし、qmailでは便秘(停滞キュー)をした場合、/var/qmail/queueの中身で削除できるが、強制削除コマンドがない。
やはり、コマンド一発で削除できた方が便利でしょ(そう思わないっすか?)。
この停滞queueをコマンドで強制削除出来ないかと考えていたところ、qmailの停滞queueを消すperlスクリプトで書かれた実行ファイルを見つけたので紹介する。てか、このスクリプトも結局は/var/qmail/queueディレクトリの中身のメッセージファイルをgrepしてunlinkしてますからメッセージファイルを消去してますが・・・・。それにしても、スクリプトで一発の方が便利ですよね。
これは、qmHandleと言ってqmail-qstat、qmail-qreadの機能を兼ね備え、さらにキューの削除も行える優れものだ。
まず、 ここ  からqmHandle-0.5.1.tar.gzをダウンロードする。私は、/var/qmail/binにダウンロードして解凍した。

# cd /var/qmail/bin

# tar -zxvf qmHandle-0.5.1.tar.gz

当たり前のことだが、qmHandleはPerlスクリプトなので、Perlが/usr/bin/以外にインストールされている場合は実行ファイルであるqmHandleスクリプトの1行目のPerlのパスを編集する。

qmHandleのオプションを下記に示す。

-l    ローカル/リモートすべてのキューを表示
-L    ローカルキューを表示
-R    リモートキューを表示
-s    統計情報の表示
-vN    Message-Id Nのメッセージを表示
-dN    Message-Id Nのキューを削除
-D    ローカル/リモートすべてのキューを削除
-c    出力結果をカラー表示
-N    Message-Idを表示。ただし、-l、-L、-Rオプションと一緒に指定する必要がある

例えば、ローカルとリモートすべてのキューのMessage-Idを調べるには以下のようにする。

# ./qmHandle -l -N
11224 (0, R)
11226 (2, R)
11229 (5, R)
11230 (6, R)
11220 (19, R)
11223 (22, R)
Messages in local queue: 0
Messages in remote queue: 6

出力されたメッセージを削除するには、-dオプションにMessage-Idを入力して複数の削除の場合はスペースで羅列する。

# ./qmHandle -d*** -d*** -d***

全て停滞queueを消したい場合は、

# ./qmHandle -D

削除できたかどうか?確認する。

# ./qmHandle -L -R


10.メールリレーの設定

qmailの便利な機能でメールリレーの設定がある。例えば、hogehoge.com(192.168.0.0のネットワーク)ドメインに、既にメールサーバが存在してそこを中継してメール送信したい場合である。すでに、mail.hogehoge.com(192.168.0.10)と言うメールサーバが有るとしよう。その場合、www.hogehoge.comのWebサーバからメールサーバを介してメールする設定を説明する。www.hogehoge.comには、説明してきた通りqmailをインストールする。そして、以下のファイルを追加する。

# cd /var/qmail/control
# vi smtproutes

:[192.168.0.10]        ← メールサーバのアドレスを記述

これで、リレー設定は終わりである。
一応、qmail-injectコマンドでメールサーバのユーザにrootからメールを投げて受け取れれば成功!


11./var/qmail/controlで制御できること

(1) 受信拒否を設定する

badmailfrom

1行に1アドレスを明記する。

(2) 配送不能メールの届け先アドレス

bouncefrom

(3) 受信データ量を制限する

databyte

デフォルトでは、無制限。


12.qmailのforward設定

qmailのforward設定は、sendmailと似てるがユーザのhomeディレクトリに、 .qmail と言うファイルを作る。

(1) hoge@hogehoge.com宛に転送する場合

$ vi .qmail
&hoge@hogehoge.com

(2) 自分にも残してhoge@hogehoge.comへ転送する場合

$vi .qmail
./Maildir/
&hoge@hogehoge.com


13.その他、注意点

qmailに関して、ここでの説明はinetdデーモンでのqmailの起動方法を説明した。しかし、tcpserverによる起動方法も有るのでそちらの方も試されると良いだろう。元々、qmailの作者は、セキュリティにも有効であるため、tcpserverによる起動方法を推奨している。
さらに、tcpserverでの起動方法を行うに当たっての注意点として、AMMさんの 報告 を参考にしてほしい。これは、ご自身が経験したことが書かれている。

以上


 
 
 



Copyright 2005 Kozupon.com.