google 等の検索エンジンからこのページへ来た方へ
お手数ですがトップページの 注意書きをお読み下さい。
IP アドレス、ドメイン名等は全て仮のものです。

はじめに

インターネットへの常時接続が一般的になり、 個人でドメインを取得することも珍しくなくなりました。
そうすると、メールサーバも自前で立ててみたくなります。
メールサーバ (MTA, Mail Transfer Agent) といえば FreeBSD に最初から附属する sendmail がまず思いつきます。
しかし sendmail は非常に細かな設定ができる反面、 設定ファイルの書式が複雑、 効率があまり良くない、 セキュリティの問題が多いなどの問題があります。
こうした問題に対して、 qmailPostfix などの新しいメールサーバが開発されています。
ここでは、qmail についてインストールと設定を行ないます。

インストールの前準備

Windows などのクライアントがメールサーバ上のメールを取得する際は、 POP を使うことにします。
ところで qmail 附属の POP サーバ qmail-pop3d にはPOP 接続時のユーザ・パスワードの認証機能がありません。
ユーザ・パスワードの認証は別のプログラムが行ないます。
認証用ソフトウェアにはいろいろありますが、 ここでは checkpw をインストールします。
checkpw は APOP にも対応しています。
checkpw は ports に含まれていないようなので、 自力でインストールします。
自力と言っても簡単で、 http://checkpw.sourceforge.net/checkpw/ から checkpw-1.01.tar.gz を取ってきて適当なディレクトリで展開します。
それから checkpw-1.01 ディレクトリに移動して make setup check を実行すればインストールされます。
(checkpw-1.01.tar.gz が /SOMEWHERE にあって、 展開するディレクトリが /WORK とします)

# cd /WORK
# tar zxvf /SOMEWHERE/checkpw-1.01.tar.gz
# cd checkpw-1.01
# make setup check

次にサーバ制御ツールの tcpserver をインストールします。
実は前述の qmail-pop3d や SMTP サーバの qmail-smtpd は、 外部からの接続を直接受け付けることができません。
したがって tcpserver や inetd などのスーパーサーバを経由して、 外部からの接続を受け付けます。
tcpserver は ucspi-tcp というパッケージに含まれています。
ucspi-tcp は ports にあるのでインストールは簡単です。

# cd /usr/ports/sysutils/ucspi-tcp
# make ; make install
qmail のインストール

ここから qmail のインストールに入ります。
qmail も ports に含まれますが、 パッチをいくつか当てるので make ; make install 一発とはいきません。
まずは /usr/ports/mail/qmail で make patch を実行します。

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

次に日付を地方標準時にするパッチ qmail-date-localtime.patch を当てます。
qmail が生成する日付はグリニッジ標準時 (GMT) ですが、 このパッチでシステムの地域設定に従った、地域標準時の時間を生成します。

# cd work/qmail-1.03/
# patch -p1 < /SOMEWHERE/qmail-date-localtime.patch

次に POP と APOP を共存させるさせるために、 checkpw 附属の qmail-popup-auth.patch を当てます。

# patch -p1 < /WORK/ckeckpw-1.00/qmail-popup-auth.patch

qmail を make して、インストールします。

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

続いて設定に入ります。

qmail の設定

念のため sendmail を止めます。

# killall sendmail

/etc/rc.conf を書き換えて、 次回のブート時からは sendmail が動かないようにします。
/etc/rc.conf の sendmail_enable="YES" となっているところを、 sendmail_enable="NONE" にします。

次に /etc/mail/mailer.conf を書き換えます。
mailer.conf は mailwrapper というソフトの設定ファイルです。
mailwrapper は /usr/sbin/sendmail の代わりに、 適切な MTA を起動します (FreeBSD では、/usr/sbin/sendmail は /usr/sbin/mailwrapper へのシンボリックリンクになっています)。
/etc/mail/mailer.conf を次のようにします。

書き換え前
sendmail	/usr/libexec/sendmail/sendmail
send-mail	/usr/libexec/sendmail/sendmail
mailq		/usr/libexec/sendmail/sendmail
newaliases	/usr/libexec/sendmail/sendmail
hoststat	/usr/libexec/sendmail/sendmail
purgestat	/usr/libexec/sendmail/sendmail
書き換え後
sendmail        /var/qmail/bin/sendmail
send-mail       /var/qmail/bin/sendmail
mailq           /var/qmail/bin/qmail-qread
newaliases      /var/qmail/bin/newaliases

hoststat と purgestat の記述が無くなっていますが、 qmail には該当するものが無いようです。
ちなみに hoststat は配信先ホストごとの配信成否記録の表示 (sendmail -bh に相当)で、 purgestat は配信先ホストごとの配信成否記録の消去 (sendmail -bH に相当) をします。

次に qmail の設定ファイルを書きます。
qmail の設定ファイルは ports からインストールすると /var/qmail/control 以下に置かれます。
qmail は 1 つの設定項目に対して 1 つのファイルが割当てられています (ファイル名が設定項目名、1 つのファイルは 1 行ないし数行)。
今回設定するファイルは次の 7 つです (デフォルトリレー先は mail.provider.xx.jp とします)。

設定ファイル設定内容
/var/qmail/control/me (必須) qmail が動作するマシンのホスト名 (FQDN)
/var/qmail/control/rcpthosts (必須) 受信を許可する宛先のドメイン名
/var/qmail/control/locals ローカル配送とする宛先のドメイン名
/var/qmail/control/envnoathost 宛先アドレスに "@" が無い場合に追加するドメイン名
/var/qmail/control/smtproutes デフォルトリレー先 SMTP サーバの指定
/var/qmail/control/defaulthost アドレスにドメイン部が無い場合に追加するドメイン名
/var/qmail/control/defaultdomain アドレスのドメイン部に "." が無い場合に追加するドメイン名

次に /var/qmail/boot 内の起動用スクリプトの雛型を /var/qmail/rc という名前でコピーします (なお、qmail を ports からインストールすると、 /usr/local/etc/rc.d/qmail.sh が /var/qmail/rc へのシンボリックリンクとなります)。
雛型にはいくつか種類がありますが、 今回は /var/qmail/boot/maildir を使います。
qmail では、ユーザのメールボックスは mbox 形式 (1 ファイルに複数のメールを格納、sendmail の方式) の他に、 Maildir 形式 (1 メール 1 ファイル) を利用できます。
/var/qmail/boot/maildir はこの Maildir 形式のメールボックスを使うように qmail を起動するためのスクリプトです。

# cp /var/qmail/boot/maildir /var/qmail/rc

次に tcpserver のデータベースファイルを作ります。
実は qmail-smtpd は宛先が /var/qmail/control/rcpthosts に記述されたホスト以外へのメールは全て拒否します。
つまり、LAN 内のクライアントから my-domain.xx.jp 以外へあてたメールも拒否します。
ただし、qmail-smtpd に環境変数 RELAYCLIENT が渡されると /var/qmail/control/rcpthosts の設定に関わらず、 その接続に対してはリレーが許可されます。
tcpserver にリレー許可のアクセス制御情報を記述した データベースを読み込ませることにより、 リレー許可を行ないます。
データベースファイルを準備するため、 /etc/tcp.smtp を作成します。
次の例では、127.*.*.* と 192.168.0.* (* は任意) のホストからの接続については、 環境変数 RELAYCLIENT を設定します。

/etc/tcp.smtp の例
127.:allow,RELAYCLIENT=""
192.168.0.:allow,RELEYCLIENT=""

/etc/tcp.smtp を tcpserver 用のデータベースファイルの cdb 形式に変換するため、tcprules コマンドを実行します。
次のコマンド書式中の /etc/tcp.smtp.cdb が tcpserver のデータベースファイルです。
/etc/tcp.smtp.tmp は tcprules が生成する一時ファイルです。
tcprules の実行終了と同時に削除されます。

# /usr/local/bin/tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp

次に /var/qmail/rc に qmail-smtpd と qmail-popup (qmail-pop3d) を起動する設定を加えます。
/var/qmail/rc 中の exit 0 の行の前に次の行を加えます。
qmail-smtpd は UID 82 (qmaild) GID 81 (qnofiles) で起動し、 接続ログを /var/qmail/splogger 経由で syslog に送ります。
qmail-popup の引数には、POP サーバの FQDN が必要です。
ログは /var/qmail/splogger 経由で syslog に送ります。

追加する行
nohup /usr/local/bin/tcpserver -vHR -x /etc/tcp.smtp.cdb \
-u 82 -g 81 0 smtp /var/qmail/bin/qmail-smtpd 2>&1| \
/var/qmail/bin/splogger smtpd &

nohup /usr/local/bin/tcpserver -vHR 0 pop3 \
/var/qmail/bin/qmail-popup server01.my-domain.xx.jp /bin/selectcheckpw \
/var/qmail/bin/qmail-pop3d Maildir 2>&1| \
/var/qmail/bin/splogger pop3d &

次にエイリアスの設定をします。
最低限 postmaster, mailer-daemon, root の 3 つが必要です (qmail では root へはメールを配送しません)。
qmail では hoge というユーザのエイリアスを設定する場合、 /var/qmail/alias/.qmail-hoge というファイルを作成し、 転送先アドレスをその中に記述します。

postmaster, mailer-daemon, root 宛のメールを user@my-domain.xx.jp へ転送する例
# echo user@my-domain.xx.jp > /var/qmail/alias/.qmail-postmaster
# echo user@my-domain.xx.jp > /var/qmail/alias/.qmail-mailer-daemon
# echo user@my-domain.xx.jp > /var/qmail/alias/.qmail-root

ユーザのメールボックスを作成します。
Maildir 形式のメールボックスを作成するにはホームディレクトリで /var/qmail/bin/maildirmake コマンドを実行します (メールボックスの所有者、パーミッションに注意してください)
また、POP3 のユーザ認証は ~/Maildir/.password に記述されたパスワードを使用します。
これも作成します (~/Maildir/.password のパーミッションは 600 でないと認証に失敗します)

% /var/qmail/bin/maildirmake Maildir
% echo "設定したいパスワード" > ~/Maildir/.password
% chmod 600 ~/Maildir/.password

qmail を起動してメールの配送テストを行ないます。
qmail-inject コマンドを使用してメールが配送されるか確認します (あらかじめユーザ hoge のメールボックスを作成しておいて下さい)。
Ctrl+D で qmail-inject コマンドを終了します。
qmail-inject コマンドを終了するとメールが配送されるので、 ~hoge/Maildir/new 以下にメールが配送されたか確認して下さい。

# /var/qmail/rc start
# /var/qmail/bin/qmail-inject
To: hoge
Subject: test

This is test.

POP3 サーバへの接続の確認も行ないます。
telnet で 110 番ポートへ接続します。
ユーザ名とパスワードを入力して "+OK" という応答があれば、 ユーザ認証に成功しています

# telnet server01.my-domain.xx.jp 110
Trying 192.168.0.1...
Connected to server01.my-domain.xx.jp.
Escape character is '^]'.
+OK <5467.1042076772@server01.my-domain.xx.jp>
USER ユーザ名
+OK 
PASS パスワード
+OK 
quit
+OK 
Connection closed by foreign host.

これで問題なければリブートします。

Top Top へ戻る