qmail でメールサーバー設定

sendmail は、設定ファイルである sendmail.cf を記述するのが難しい!というので MTA としては最近人気の qmail 。セキュリティー対策やパフォーマンスも sendmail より優れているみたい(ソースはそれほどきれいじゃないけど)。


* qmail の入手

qmail のソースと、あると便利なモジュールをいくつかあげておきます。モジュールの入手はオリジナルなるサイトからたどって下さい。以下にあげたモジュールは数ある中の一部です。

qmail オフィシャルページ  オリジナルサイト 日本語サイト
qmail モジュール      ftp://koobera.math.uic.edu/www/software/qmail-1.03.tar.gz
localtime表示にするパッチ patch
不正な中継をさせないパッチ patch

ezmlm 簡単で使いやすいメーリングリストマネージャー
dot-forward .forward を実現するためのプログラム
fastforward /etc/aliases を実現するためのプログラム
checkpassword pop3d を利用するためのプログラム
rblsmtpd スパムメール対策に便利なプログラム

 

* インストールと設定、テスト

qmail モジュールをダウンロードして展開します。一般的なプログラムをインストールするのとは少し異なり、まず qmail で必要となるユーザーやグループを新規に登録します。作業はスーパーユーザーで行います。

Solaris, Linux の場合:
# mkdir /var/qmail
# 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
FreeBSD の場合:
# mkdir /var/qmail
# 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

その他の OS は、INSTALL.ids を参考にユーザーとグループを登録して下さい。
続いてコンパイルを行います。以下に記述してあるアーカイブの展開をしておかないと INSTALL.ids は見れません。コンパイル(make の実行)する前の注意として、cc コマンドではないコンパイラを使用する場合、conf-cc, conf-ld の1行目を編集して下さい(特に gcc を利用する場合、 cc を gcc に書き換える)。

# gzip -dc qmail-1.03.tar.gz | tar xvf -
# cd qmail-1.03
# patch < ../qmail-date-localtime.patch
# patch < ../qmail-smtpd-relay-reject
# make setup check
# ./config
 (DNS に登録されていないマシンやホスト名を検索させずに明示的に実行したい場合: 
   ./config-fast hostname.your.domain
  と実行する。)

制御ファイル

/var/qmail/control/me qmail システムが稼動するホストのホスト名とドメイン名を指定します。(config スクリプトによって作成されます)
/var/qmail/control/locals qmail システムが稼動するホストが受け取るメールのドメイン名を指定します。
/var/qmail/control/defaultdomain デフォルトのドメイン名を指定します。指定が無い場合、meファイルの内容が参照されます。
/var/qmail/control/defaulthost デフォルトのホスト名を指定します。指定が無い場合、meファイルの内容が参照されます。メールの発信でドメイン名だけを見せたい場合などは、このファイルでコントロールします。
/var/qmail/control/idhost Message-ID に使用するホスト名を指定します。指定が無い場合、meファイルの内容が参照されます。
/var/qmail/control/plusdomain 追加のドメイン名を指定します。
/var/qmail/control/smtproutes SMTP 経路を指定します。
/var/qmail/control/rcpthosts SMTP の RCPT を許可するドメイン名を指定します。 SPAM対策用に中継に関する設定をします。

続いてエイリアスの作成を行います。sendmail などで利用していた、というかエラーメールを処理するユーザーである postmaster, mailer-daemon といったアカウントを利用できるように設定します。また、qmailでは root(スーパーユーザー)がメールを受けるようになっていないので、必要ならエイリアスを設定しておく必要があります。さらに、defaultを設定しておくことで宛先不明のメールについて一括処理することができます。

# cd ~alias
# touch .qmail-postmaster .qmail-mailer-daemon .qmail-root .qmail-default
# chmod 644 .qmail*

ここで作成したファイルに、実際にメールを受け取るメールアドレス(ユーザーアカウント)を登録することで、それぞれのアドレスに届いたメールを転送します。

sendmail では /var/spool/mail/mylogin (/usr/spool/mail/mylogin) にメールをスプール(mbox形式)していました。しかし、qmail では、各個人のホームディレクトリーの Mailbox (~mylogin/Mailbox)にスプールします。このことで、従来 sendmail を利用することを前提としていたメールクライアント(MUA) や pop, imapサーバーは注意が必要です。(/bin/mail コマンドなどは MAIL シェル変数を設定しなおすことで対応可能。"MAIL=$HOME/Mailbox; export MAIL" ) mylogin は実在するユーザーだよ。

qmailは、maildir 形式(MH like)のメールスプール方式も利用できます。この形式は、メールボックスとなるディレクトリーの下にメール毎にファイルが作成されます。この形式の利点は、なんらかの不具合で書き込み不良が生じても他のメールには影響がないことです。(mbox形式では、一つのファイルに新しいメールが追記されていく。)ただし、多くのメールクライアントは mbox形式なのでそのままでは利用できなくなってしまいます。 もし、利用したいなら、ユーザー毎に下記のコマンドを実行します。INSTALL.maildir は必ず読んで下さい。

    % maildirmake $HOME/Maildir
    % echo ./Maildir/ > ~/.qmail

qmail を起動する起動スクリプトのコピー

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

   ※ procmail を利用する場合、/var/qmail/boot/proc をコピーする。

簡易テストは、qmail のデーモンを起動しメールが受信できるかチェック(ホームディレクトリーに Mailboxが作られメールが格納されていることを確認)します。場合によっては syslog を確認してみて下さい。

# csh -cf '/var/qmail/rc&'
# echo to: mylogin | /var/qmail/bin/qmail-inject

テストが終わったら、今まで利用していた sendmailを終了させ、起動されないような手続きを行います。sendmail の終了は kill コマンドを使用して sendmailプロセスを殺します。その後、sendmail が起動されないようにします。また、スプールにたまっているメールを全て処理させます。

# kill -TERM 'process number of sendmail'
# mv /usr/sbin/sendmail /usr/sbin/sendmail.org (mv /usr/lib/sendmail /usr/lib/sendmail.org)
# /usr/sbin/sendmail.org -q30m
# ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail

※ FreeBSD を利用している場合、/etc/defaults/rc.conf (/etc/rc.conf) に記述されてある sendmail_enable の値を "NO" に変更します。

メール送信用の qmail-smtp を inetd により起動させるため、/etc/inetd.conf に以下の行を登録します。その後、すぐに inetd に下記の内容を繁栄させるために inetd に HUP シグナルを送ります。

smtp  stream  tcp  nowait  qmaild   /var/qmail/bin/tcp-env   tcp-env /var/qmail/bin/qmail-smtpd

最後に、OS を起動時に必要な qmail デーモンがスタートするように起動スクリプトを登録します。System V 系の UNIXや Linux は /etc/init.d (/etc/rc.d/init.d) に、FreeBSD は /usr/local/etc/rc.d に以下のようなシェルスクリプトを配置します。

#!/bin/sh

test -x /var/qmail/rc || exit 0

case "$1" in
  start)
     echo -n "Starting qmail: "
     sh -cf '/var/qmail/rc &'
     echo "qmail."
     ;;
  stop)
     echo -n "Stopping qmail: "
     pid=`/usr/bin/ps -e | /usr/bin/grep qmail | /usr/bin/sed -e 's/^  *//' -e 's/ .*//'`
     if test "$pid"
     then
         kill $pid
     fi
     echo "qmail."
     ;;
  restart)
     echo -n "Restarting qmail: "
     $0 stop
     $0 start
     echo "qmail."
     ;;
  *)
     echo "Usage: /etc/init.d/qmail {start|stop|restart}"
     exit 1
esac

exit 0

このスクリプトでは、stop がうまく動作しないかも.......
BSD系の UNIX の場合、/etc/rc.local に '/var/qmail/rc &' を追加します。

* sendmail で利用していた /etc/aliases や .forward に変わるもの

sendmail を利用していた時に /etc/aliases に記述していたメールの転送については /var/qmail/alias に .qmail- の後にアカウントを追加したファイルを置くことで実現できます。例えば、root宛のメイル転送は

    /var/qmail/alias/.qmail-root

というファイルを作り、ファイルの内容は転送したいアドレスを記述します。

    &mylogin@foo.co.jp

アドレスが英数字で始まる場合 &を省略できます。# で始まる行はコメントになります。アドレスは完全修飾ドメイン名でなければなりません。 また、以下のように三角括弧や空白、コメントを含めることはできません。

    # the following examples are ALL WRONG
    &mylogin@host
    &<mylogin@host.foo.co.jp>
    & mylogin@host.foo.co.jp
    &mylogin@host.foo.co.jp (New Address)

「プログラム」行は'|'(バーチカルバー)で始めます。 qmail-localは、'|' 以降の部分をシェルに渡します。

	| preline /usr/ucb/vacation mylogin

自分自信にもメールを残すために \mylogin のようにバックスラッシュを利用してアカウント名を指定していましたが qmail では直接 mbox形式のファイルを記述します。そのときに、指定するファイルは必ず、 '/' または '.' で始め、 '/' で終わらないようにしなければなりません。maildir形式の場合は、'/' または '.' で始め、 '/' で終わらなければなりません。

	/home/mylogin/Mailbox

    /home/mylogin/Maildir/

.forward に変わるものは .qmail になります。この .qmail をユーザのホームディレクトリーに置きます。

しかし、/etc/aliases の :include: に相当するものはありません。そこで、fastforward プログラムが用意されています。

* inetd の負荷を軽減するには

inetd を利用するメール送信では、メーリングリストを処理するような場合、負荷が掛かりすぎてしまいダウンしてしまうことがある。そんな場合に対処するために tcpserver というプログラムが用意されている。

tcpserverは、 ucspi-tcpパッケージ(ucspi-tcp-0.84.tar.gz)に含まれるのでダウンロードしインストールする。

# gzip -dc ucspi-tcp-0.84.tar.gz | tar xvf -
# cd ucspi-tcp-0.84
# make
# make man
# make setup

tcpserver を利用するように /var/qmail/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 ./Mailbox splogger qmail &

/usr/local/bin/tcpserver -c 500 -u 95 -g 40 0 \
smtp /var/qmail/bin/qmail-smtpd 2>&1 | /var/qmail/bin/splogger smtpd 3 &

※)-u は qmaild の UID、-g は nofiles の GID を指定する。 -c 500 は同時接続数(標準は40)。
  最後の sploggerはログをとる

tcpserver を利用する場合、/etc/inetd.conf の smtp (qmail-smtpd) の記述は不要なので削除する。

* メールの中継制限

メールの中継や SMTPサーバーとして利用できるホストを制限するには、/var/qmail/control/rcpthosts に許可するドメイン名を記述ことで実現できます。

    localhost
    .foo.co.jp

tcpserver を利用している場合、/etc/tcp.smtp に登録しデーターベースを構築する。

    127.0.0.1:allow,RELAYCLIENT=""
    fellow@192.168.0.1-16:allow,RELAYCLIENT=""
    192.168.1.:allow,RELAYCLIENT=""

ローカルホストの他に 192.168.0.1 - 192.168.2.16 上の fellow というユーザー (ただし IDENT/TAP によって
リモートホストから環境変数 TCPREMOTEINFO を取得できた場合のみ有効) と 192.168.1.* からのメイルを
control/rcpthosts での設定に関係なくどこへでもリレーしてあげるようになります。

# tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp
tcpserver が、データーベースを解釈するように /var/qmail/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 ./Mailbox splogger qmail &

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

再起動後に有効になる。

* 受信メールの拒否

qmailは、スパムメールや二度と受け取りたくないメールなどを受信拒否することができる。それには、/var/qmail/control/badmailfrom にメールアドレスを列挙しておくことで可能です。また、@foo.co.jp と指定することで、そのドメインからのメールを全て拒否することができます。

badmailfrom は、単純なメール拒否には問題ないが、大掛かりなスパムメール対策には rblsmtpd プログラムを利用すると良い。