qmail

Sendmail に代わるべき次世代のメールサーバーと言われているqmailをインストールしましょう。既にsendmailがインストールされているものとして話を進めます。さらに、日本製メーリングリストサーバーである、fmlをqmail上に導入する際の注意点を挙げておきます。

1.qmailのインストール
まず、ソースをダウンロードして、適当なディレクトリ(例:/usr/local/src)に置きます。また、localtime用のpatchもここから取ってきます。同時にtcp_wrappersと.frowardをそのまま使うためのdot-forwardもダウンロードしてしておきましょう。あるいは、tcp_wrappersの代わりにtcperver(後述)を利用するのもいいでしょう。まず、qmailインストールのための準備としてgroupとuserを作成します。

# pw groupadd nofiles
# pw useradd alias -g nofiles -d /var/qmail/alias -s /nonexistent
# pw useradd qmaild -g nofiles -d /var/qmail -s /nonexistent
# pw useradd qmaill -g nofiles -d /var/qmail -s /nonexistent
# pw useradd qmailp -g nofiles -d /var/qmail -s /nonexistent
# pw groupadd qmail
# pw useradd qmailq -g qmail -d /var/qmail -s /nonexistent
# pw useradd qmailr -g qmail -d /var/qmail -s /nonexistent
# pw useradd qmails -g qmail -d /var/qmail -s /nonexistent

次に展開してpatchを当てます。

# cd /usr/local/src
# tar zxvf qmail-1.03.tar.gz
# cp qmail-date-localtime.patch ./qmail-1.03
# cd qmail-1.03
# patch -s -p1 < qmail-date-localtime.patch

そしてmake

# make setup check
# ./config

そして~alias以下に3つのファイルを作ります。

# cd ~alias
# touch .qmail-postmaster .qmail-mailer-daemon .qmail-root

次に、自動起動用のファイルをコピーして起動script(例:/etc/rc)に書き加えます。同時に sendmailの起動部分をコメントアウトします。ここでは基本のhomeを使いますが、procmailやdot forwardを使う場合はprocやproc+dfなどををコピーします。

# cp /var/qmail/boot/home /var/qmail/rc
# ee /etc/rc
-----
.
.
#case ${sendmail_enable} in
#[Yy][Ee][Ss])
#       if [ -r /etc/mail/sendmail.cf ]; then
#               echo -n ' sendmail';    /usr/sbin/sendmail ${sendmail_flags}
#       fi
#       ;;
#esac.

# qmail
csh -cf '/var/qmail/rc &'
-----

ホスト名を省略した、ユーザー名@ドメイン名で受信できるように、localsとrcpthostsファイルにドメイン名を書き加えます。

# vi /var/qmail/control/locals
-----
.
.
.
fujie.org
-----
# cp /var/qmail/control/locals /var/qmail/control/rcpthosts

rc.confファイルのsmtpの部分をコメントアウトします。

# ee /etc/rc.conf
-----
# sendmail_flags="-bd -q30m"  ==> 行頭に#を付けてコメントアウト
-----

sendmailをkillしてリンクします。

# ps -ax
# kill 189(例)
# chmod 0 /usr/sbin/sendmail
# mv /usr/sbin/sendmail /usr/sbin/sendmail.bak
# ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail

2.Mail directory
qmail はデフォルトでは、メール形式は従来のMailbox形式で配送されます。しかし、作者も書いているようにセキュリティの面からもMaildir形式が推奨されています。これだとメールが一通毎のファイルになりより安全です。Maildir形式に変えるには2つの方法があります。まず、起動ファイルを変更する方法で例えば、

# ee /var/qmail/boot/home として
-----
qmail-start ./Mailbox splogger qmail を
qmail-start ./Maildir/ splogger qmail に変更する。
これを、前記のように、/var/qmail/rc にコピーする。
-----
# cp /var/qmail/boot/home /var/qmail/rc

もうひとつの方法としては、ホームディレクトリに次のような配送ファイルを置きます。

$ cd ~
$ ee .qmail
-----
./Maildir/

いずれにせよ、ホームディレクトリにMaildir(他の名前でも構いません)を置かなくてはなりません。maildirmakeコマンドを利用します。

$ cd ~
$ /var/qmail/bin/maildirmake Maildir

これで、~/Maildir/new にメールが貯まります。

3.TCP-wrapper
次にtcp_wappersをインストールします。これは不正な中継を拒否するために必須です。次に述べる tcpserver でも構いません。FreeBSDに元からインストールされている、あるいはportsでインストールしたtcp_wrappersでは、hosts.allowが効かないので、ソースからインストールしました。

# cd /usr/local/src
# tar zxvf tcp_wrappers_7.6.tar.gz
# cd tcp_wrappers_7.6
# make
# make REAL_DAEMON_DIR=/usr/libexec STYLE=-DPROCESS_OPTIONS freebsd
# cp tcpd /usr/sbin/

inetd.confを以下のように書き換えます。

# ee /etc/inetd.conf
-----
smtp    stream  tcp     nowait  qmaild  /usr/sbin/tcpd  /var/qmail/bin/tcp-env  tcp-env /var/qmail/bin/qmail-smtpd (1行で)
-----

次に、hosts.allowを以下のように書き換えます。今まで書いてあるものは消します。

# ee /etc/hosts.allow
----- tcp-env: 127.0.0. : setenv = RELAYCLIENT tcp-env: 203.183.84. : setenv = RELAYCLIENT tcp-env: 192.168.1. : setenv = RELAYCLIENT tcp-env: .wind.ne.jp : setenv = RELAYCLIENT tcp-env: .uncle.or.jp : setenv = RELAYCLIENT tcp-env: .fujie.org : setenv = RELAYCLIENT tcp-env: ALL ALL : 127.0.0. : allow -----

これは、中継を許可するサイトで、203.183.84.*** や ***.wind.ne.jp などからの中継を許可します。 最後のALLは中継はしないが受信はすべてするという意味です。

4.tcpserver
tcpserverはqmailの作者と同じ人が作ったソフトで、inetdに代わるべきものと言われています。確かにinetdより速く安全のようです。詳しくは http://cr.yp.to/ucspi-tcp.html を参照してください。まずucspi-tcpをダウンロードして、/usr/local/src/に起きます。そしてmakeします。

# cd /usr/local/src
# tar zxvf ucspi-tcp-0.88.tar.gz
# cd ucspi-tcp-0.88
# make
# make setup check

これで、/usr/local/binにtcp*がインストールされます。次に、smtpのアクセスをコントロールする /etc/tcp.smtp.cdb を作成します。最初にルールを/etc/tcp.smtpに記述します。

# cd /etc
# ee tcp.smtp
-----
192.168.:allow,RELAYCLIENT=""
203.183.:allow,RELAYCLIENT=""
127.0.0.:allow,RELAYCLIENT=""
=.wind.ne.jp:allow,RELAYCLIENT=""
=.uncle.or.jp:allow,RELAYCLIENT=""
=.fujie.org:allow,RELAYCLIENT=""
:allow

これは先に書いたhosts.allowと同じ意味になります。さらに、

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

として /etc/tcp.smtp.cdb を作成します。/etc/tcp.smtpを変更したときは、必ずこのコマンドを実行して、/etc/tcp.smtp.cdbを作り直す必要があります。次に、inetd.conf のsmtpに関する行をコメントアウトします(行頭に#を付けて無効にする)。最後にtcserverでqmail-smtpを起動できるように、次のような起動スクリプトをrc.localなどに記載します。

# ee /etc/rc.local
-----
# tcpserver smtp
/usr/local/bin/tcpserver -hp -u 1005 -g 1004 -x /etc/tcp.smtp.cdb 0 smtp /var/qmail/bin/qmail-smtpd &
-----

この場合、1005と1004はqmaildのUIDとGIDです。これで次回起動時から有効になります。

5.qmail-pop3d
sendmail + qpopper で動かしていた pop3d も qmail-pop3d に変更し、Maildir に対応させます。まず、checkpassword をインストールします。ここからソースをダウンロードして展開して make します。

# cd /usr/local/src
# tar zxvf checkpassword-0.90.tar.gz
# cd checkpassword-0.90
# make
# make setup check

tcp_wrappers を使用する場合、inetd.conf のqpopperの部分はコメントアウトし、次のような行を1行で追加します。

# ee /etc/inetd.conf
pop3 stream tcp nowait root /var/qmail/bin/qmail-popup qmail-popup ns.fujie.org /bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir

tcpserver で qmail-pop3d を起動したいばあいは、inetd.conf の pop3dの部分をコメントアウトして、次のようなスクリプトを起動ファイル( /etc/rc.local など)に追加します。

# tcpserver qmail-pop3d
/usr/local/bin/tcpserver 0 110 /var/qmail/bin/qmail-popup ns.fujie.org /bin/checkpassword /var/qmail/bin/qmail-pop3d Maildir &

6.procmail
sendmailの時に使っていたprocmailをqmailでも使ってみましょう。ホームディレクトリの .qmail に記載する方法と、いままで使っていた .forward を利用する方法がありますが、どうも、.qmail の方法だと、受信時刻がGMTになってしまうので、.forwardを再利用する方法でゆきます。まず、.forwardを利用できるようにする、dot-forwardをインストールします。

# cd /usr/local/src/
# tar zxvf dot-forward-0.71.tar.gz
# cd dot-forward-0.71
# make setup check

.forwardファイルは、ホームディレクトリに置きます。内容は、参考までに僕のを載せておきます。

"|IFS=' ' && p=/usr/local/bin/procmail && test -f $p && exec $p -Yf- || exit 75 #masao"

さらに起動ファイルをhomeからproc+dfに変更します。

# cp /var/qmail/boot/proc+df /var/qmail/rc

これで今までどおりのディレクトリに受信メールを振り分けられるはずです。

7.fml
深町さん作成のメーリングリストサーバーです。インストール方法は深町さんのページが詳しいのでそちらを参照してください。qmailとの組み合わせで補足事項を中心に書きます。まず、念のためmlディレクトリの所有者をfmlにします(僕はfmlというユーザーでfmlをインストールしました)。

# cd /var/spool
# chown -R fml ml
# chgrp -R fml ml

alias ディレクトリに見本ができていると思いますので、それを確認します。

# cd /var/spool/ml/etc/qmail/alias
# ls
.qmail-test-ml
.qmail-test-ml-admin
.qmail-test-ml-ctl
.qmail-test-ml-default
.qmail-test-ml-request

次に、パスワードファイルからassignファイルを作り出すコマンドを使います。

# /var/qmail/bin/qmail-pw2u < /etc/passwd > /var/qmail/users/assign

そして、assignファイルの最後に次の行を追加します。最後のドットを忘れずに。メーリングリスト名は test-ml としています。

# ee /var/qmail/users/assign
-----
.
.
+test-ml:fml:1003:1003:/var/spool/ml/etc/qmail/alias:-:test-ml:
.
-----

1003はfmlのUIDとGIDです。そしてこのassignを有効にします。

# /var/qmail/bin/qmail-newu

これで動くはずです。

投稿メールをhtml化する際に、SHIFT-JISとして保存するために(デフォルトはJISです)、次のような行をconfig.phに追加しています。

-----
$HTML_OUTPUT_FILTER = "/usr/local/bin/nkf -s";
-----

-sを-eに変更するとEUCに変換されます。

さらにhtmlファイルのヘッダ部分を代えるために、次のような部分を、config.phやsite_forces.phなどに追加します。なお、これはfml-helpメーリングリストの村下さんのお返事を参考にしました(ほとんどそのままです)。深謝。

-----
#HTML化するときのMETAタグの変更

$mypreamble =
q#<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Shift_JIS">
#;

$HTML_FORMAT_PREAMBLE = $mypreamble;
$INDEX_HTML_FORMAT_PREAMBLE = $mypreamble;
-----

メーリングリストなのに、reply-to を自分のアドレスに変える輩が絶えないので、また、メンバーリストが盗まれないように、スパムの排除のため、またhtmlメールを排除するため、次のようにcfに付け足しています。

-----
# YOU CAN EDIT MANUALLY AFTER HERE.


# FOR SECURITY, Disable user to retrieve member list
# fml 3.0 style
# @DenyProcedure = ('member','active','members','actives','status','stat');
#
# fml 4.0 style
&DENY_PROCEDURE('member');  # _this_line_is_added_by_makefml_
&DENY_PROCEDURE('active');  # _this_line_is_added_by_makefml_
&DENY_PROCEDURE('members'); # _this_line_is_added_by_makefml_
&DENY_PROCEDURE('actives'); # _this_line_is_added_by_makefml_
&DENY_PROCEDURE('status');  # _this_line_is_added_by_makefml_
&DENY_PROCEDURE('stat');    # _this_line_is_added_by_makefml_

##########
$DISTRIBUTE_FILTER_HOOK = q#
    if ($e{'Body'} =~ /Content-Disposition:\s*attachment/i) {
        return 'THIS ML NOT PERMIT ATTACHMENT';
    }
#;

$DISTRIBUTE_FILTER_HOOK = q#
    if ($e{'h:received:'} =~ /from spam.co.jp/) {
        return 'from a host in spam blacklist';
    }

    if ($e{'Body'} =~ /http-equiv=3DContent-Type/) {
        return 'mail with appended HTML documents';
    }

#;

&DEFINE_FIELD_FORCED('reply-to', $MAIL_LIST);

$FILTER_NOTIFY_REJECTION     = "1";
-----

最後にウィルス対策として、http://www.fml.org/software/fml/Japanese/examples/virus_check.phを参考にsite_force.ph を置いています。

TOP PAGE