セカンダリメールサーバの構築


専攻 www サーバ に MTA をインストールする. これは, である.

qmail のインストール

mailにあって www にはない機能は, apop, imap のうけつけ,ezmlm である. すなわち,qmail の本体のインストールおよび tcpserver による smtp 要求の受け付けのみが必要とされる.以下の手順のうち,制御ファイル,テスト の部分はプライマリメールサーバと異なっている.

[1] ソース取得・コンパイル

qmail のディレクトリを作成する.

# mkdir /var/qmail

qmail ユーザ, グループを追加する.

   # groupadd -g gid qmail
   # adduser --system --ingroup nofiles --home /var/qmail/alias alias
   # adduser --system --ingroup nofiles --home /var/qmail qmaild
   # adduser --system --ingroup nofiles --home /var/qmail qmaill
   # adduser --system --ingroup nofiles --home /var/qmail qmailp
   # groupadd -g gid qmail
   # adduser --system --ingroup qmail --home /var/qmail qmailq
   # adduser --system --ingroup qmail --home /var/qmail qmailr
   # adduser --system --ingroup qmail --home /var/qmail qmails

Slink 版では qmail関連グループはシステムインストール時にすでに存在して いた. しかし Potato 版では, qmail 関連のシステムユーザおよびグループユー ザはすべて存在しなくなったので追加する. これらはシステムユーザ・グルー プなので,グループユーザに関しては gid 100-999 の中で空いている番号を使う.システムユーザのuidに 関してはadduser に--systemオプションを付けることで 自動的にdebian policy に沿ったuidをつけてくれる(詳細は Debian Policy Manual - The Operating System). 特に 1000-29999 は gate-system が使用するので, 使わない. あらかじめ変更する.

ftp://ftp.jp.qmail.org/qmail/qmail-1.03.tar.gz を取得. 展 開する. できたディレクトリ(qmail-1.03/)に移って, コンパイル.

$ tar xvfz qmail-1.03.tar.gz
$ cd qmail-1.03
# make
# make man
# make setup
# make check

[2] 初期設定

[2.1] 制御ファイル

qmail 制御ファイルに設定を書き込む. 制御ファイルは /var/qmail/control/ 以下にあり, その一覧は, http://man.qmail.jp/jman5/qmail-control.html

まず,自ホスト名を設定する (詳細は http://man.qmail.jp/jinstall/install.ctl.html).

qmail-1.03.tar.gz を展開してできたディレクトリ(qmail-1.03/)に移る.

# ./config

このスクリプトは,ホスト名を DNS 検索する.以下の内容が書き込まれる.

/var/qmail/control/defaultdomain     ep.sci.hokudai.ac.jp
/var/qmail/control/locals            localhost
                                     orange.ep.sci.hokudai.ac.jp
/var/qmail/control/me                orange.ep.sci.hokudai.ac.jp
/var/qmail/control/plusdomain        ac.jp
/var/qmail/control/rcpthosts         localhost
                                     orange.ep.sci.hokudai.ac.jp

セカンダリメールサーバとして使うために,ドメイン部が ep.sci.hokudai.ac.jp である宛先のメールを受け取るようにする.

# echo ep.sci.hokudai.ac.jp >> /var/qmail/control/rcpthosts

DNS サーバ によって,www.ep.sci.hokudai.ac.jp という別名を当てられている場合,

# echo www.ep.sci.hokudai.ac.jp >> /var/qmail/control/locals
とする.ここで,ep.sci.hokudai.ac.jp を加えてはいけない.ep.sci.hokudai.ac.jp あてのメールをリモート配送させるためである.

ep.sci.hokudai.ac.jp あてのメールをMX レコードを DNS 検索することなしに,mail.ep.sci.hokudai.ac.jp に送るために,以下を行う.

これは, http://man.qmail.jp/faq/faq2.html, http://www.jp.qmail.org/q103/jman8/qmail-remote.html#smtproutes を参考にしたものである.

# echo ep.sci.hokudai.ac.jp:mail.ep.sci.hokudai.ac.jp > /var/qmail/control/smtproutes
# chmod 644 /var/qmail/control/smtproutes

更に,メール発信の際にはドメイン部のないメールアドレスに,ep.sci.hokudai.ac.jp というドメイン部を付加するために,以下を行う.

# echo ep.sci.hokudai.ac.jp > /var/qmail/control/defaulthost
# chmod 644 /var/qmail/control/defaulthost

そのほかに,以下を設定.

# echo 10000000 >> /var/qmail/control/databytes
# chmod 644 /var/qmail/control/databytes
# echo 604800 >> /var/qmail/control/queuelifetime
# chmod 644 /var/qmail/control/queuelifetime
メールキュー最大滞在時間 queuelifetime は長めに設定する. プライマリのメールサーバ の障害時には,セカンダリサーバとして メールをキューにためておくためである.

これら制御ファイルの効果は,qmail-showctl コマンド(マニュアルは http://man.qmail.jp/jman8/qmail-showctl.html にある)で確認できる.

[2.2] 各種エイリアスアドレス

システムのアドレスを設定する.

# cd /var/qmail/alias
# echo '&epmail' > .qmail-root
# echo '&root' > .qmail-postmaster
# echo '&root' > .qmail-mailer-daemon
# echo '&root' > .qmail-bin
# echo '&root' > .qmail-daemon
# echo '&root' > .qmail-games
# echo '&root' > .qmail-ingres
# echo '&root' > .qmail-nobody
# echo '&root' > .qmail-system
# echo '&root' > .qmail-toor
# echo '&root' > .qmail-uucp
# echo '&root' > .qmail-usenet
# echo '&root' > .qmail-anonymous
# echo '&root' > .qmail-mail
# echo '&epwww' > .qmail-www
# echo '&epdns' > .qmail-dns
# echo '&epnews' > .qmail-news
# chmod 644 .qmail-*

以上により, postmaster, mailer-daemon, bin, daemon, games, ingres, nobody, system, toor, uucp, usenet, anonymous, mail あてのメールは, root に転送され, root あてのメールは epmail に転送される. 詳細は, dot-qmail(5).

[2.3] パスを通す

/var/qmail/bin 以下のコマンドにパスを通す. bash の場合, /etc/profile の PATH= の行を編集し, /var/qmail/bin を付け加える.

# /etc/profile: system-wide .profile file for the Bourne shell (sh(1))
# and Bourne compatible shells (bash(1), ksh(1), ash(1), ...).

PATH="/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:/var/qmail/bin"

csh の場合, /etc/csh.cshrc を編集し, 同様に付け加える.

# /etc/csh.cshrc: system-wide .cshrc file for csh(1)/tcsh(1).
# $Id: csh.cshrc,v 1.4 1998/06/05 21:04:02 luisgh Exp $

setenv PATH /usr/local/bin:/usr/bin:/bin:/var/qmail/bin

[2.4] man を有効にする

/etc/manpath.config を編集し以下の部分を付け加える.

#MANDATORY_MANPATH/usr/src/pvm3/man
......
MANDATORY_MANPATH/usr/local/man
MANDATORY_MANPATH/var/qmail/man
...
#*PATH**MANPATH*
.........
MANPATH_MAP/opt/sbin/opt/man
MANPATH_MAP/var/qmail/bin/var/qmail/man
...
#*PATH**CATPATH*
.........
MANDB_MAP/opt/man/var/cache/man/opt
MANDB_MAP/var/qmail/man/var/qmail/man

[2.5] ~/Mailbox への配送

/etc/profile に以下を書き加える.

...
export PATH PS1

umask 022

MAIL="$HOME/Mailbox"
MAILDROP="$HOME/Mailbox"

export MAIL MAILDROP

/etc/csh.cshrc に以下を書き加える.

...
set prompt = "%U%m%u:%B%~%b%# "
endif
endif

setenv MAIL $HOME/Mailbox
setenv MAILDROP $HOME/Mailbox

なお, 各ユーザのホームディレクトリのパーミッションは 755 でないと, メール配送時にエラーが出るらしい.

[3] qmail 起動

# cp /var/qmail/boot/home /var/qmail/rc
# csh -cf '/var/qmail/rc &'

qmail は起動する. qmail-send, splogger qmail, qmail-lspawn, qmail-rspawn, qmail-clean を ps で確認する.

次にブート時に qmail を走らせるようにするため, 以下のことを行う. ブー トスクリプトに関わる設定ファイルは/etc/inittab/etc/init.d/rc である.

/etc/init.d/qmail に以下の起動スクリプトを記述し, 実行許可を与える.

# 起動スクリプト
csh -cf '/var/qmail/rc &'
# chmod 755 /etc/init.d/qmail

/etc/rc[2-5].d/ の下に, これへのリンクを置く. この数字(2-5)は RUNLEVEL に対応する. 2-5 はマルチユーザモード, 0 は halt, 1 は single user mode, 6 は reboot に対応する.

# cd /etc/rc2.d/
# ln -s ../init.d/qmail S80qmail
# ls -al S80qmail
lrwxrwxrwx  1 root  root  15  S80qmail -> ../init.d/qmail

# cd /etc/rc3.d/
(RUNLEVEL 3-5 も同様)

このリンクの名前の S に続く2桁の数字(80)が, 起動のタイミングを決定する. reboot して, qmail デーモン群の起動を ps で確認.

[3.1] テスト

以下を行う.この一連のテストは, http://man.qmail.jp/jinstall/test.deliver.html を基にしたものである.

ローカル配送テスト1:自分に送ってみる.kyoma は自分のユーザ名に変える.

% echo to: kyoma@orange.ep.sci.hokudai.ac.jp | /var/qmail/bin/qmail-inject
~kyoma/Mailbox にメールが送られることを確認.

ローカル配送テスト2:存在しない宛先に送ってみる.

% echo to: nonexistent@orange.ep.sci.hokudai.ac.jp | \
/var/qmail/bin/qmail-inject -f kyoma@orange.ep.sci.hokudai.ac.jp
バウンスメールが ~kyoma/Mailbox に送られることを確認.

リモート送り出しテスト1:他のホスト上のアカウントへ送ってみる.

% echo to: kyoma | /var/qmail/bin/qmail-inject
kyoma@ep.sci.hokudai.ac.jp にメールが届くことを確認. 届いたメールの From: は kyoma@ep.sci.hokudai.ac.jp になっているか.

リモート送り出しテスト2:他のホスト上の存在しない宛先に送ってみる.

% echo to: nonexistent | /var/qmail/bin/qmail-inject
MAILER-DAEMON@ep.sci.hokudai.ac.jp からの バウンスメールが kyoma@ep.sci.hokudai.ac.jp に送られることを確認.

[4] sendmail の「置き換え」

文献 4, 5に従う.

ただし, sendmail ではなく, exim がインストールされている場合は, exim を無効にする.

exim のブートスクリプトは, /etc/init.d/exim4 で, これに /etc/rc[2-5].d/S20exim, /etc/rc{1,6}.d/K20exim からリンクが張られている. これを無効にする.

# chmod 000 /etc/init.d/exim4
# mv /etc/init.d/exim /etc/init.d/exim4.bak

また, cron から呼び出される処理も無効にする. /etc/cron.daily/exim4-base の先頭の方に次の行を書き足す. 3 行目の [ と ! の間にはスペースが一つある ことに注意.詰めて書くとエラーが出る.

#!/bin/sh
# by TOYODA Eizi, 1999-09-22. We need not exim.
if [ ! -f /etc/exim.conf ]; then
exit 0
fi
# Uncomment the following lines to get daily e-mail reports
...

これで /etc/cron.daily/exim は無効になり, いずれ /etc/exim.conf を使って設定を行った暁には本当に動作するだろう. (豊田, 1999/09/22)

次に文献 4, 5 の通りの「sendmail 置き換 え」作業を行う.

# chmod 000 /usr/lib/sendmail
# chmod 000 /usr/sbin/sendmail

# mv /usr/lib/sendmail /usr/lib/sendmail.bak
# mv /usr/sbin/sendmail /usr/sbin/sendmail.bak

# ln -s /var/qmail/bin/sendmail /usr/lib/sendmail
# ln -s /var/qmail/bin/sendmail /usr/sbin/sendmail

最後にリンクを張ったのは, 「qmail の "sendmail" wrapperを MUA から使えるようにする」ため. /usr/lib/sendmail は, cron や gate-system がメールを出すのに使うので, リンクを張るのを忘れないこと.

cron デーモンが送るメール

www では cron デーモンがメールを送信する場合、あて先は root@ep.sci.hokudai.ac.jp となる。
しかし、これでは先に設定した qmail のエイリアスによって epmail に送られてしまい www 管理者へ届かない。
そこで正しく www 管理者へ送るために以下の作業を行う。

/etc/crontab 内の先頭の方に次のように MAILTO を加える。

・・・
# This file also has a username field, that none of the other crontabs do.

SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

MAILTO=epwww@ep.sci.hokudai.ac.jp

# m h dom mon dow user command
・・・

cron を再起動する。

/etc/init.d/cron restart


[5] smtp

パソコンのメールソフトを使ってメールを利用するユーザは多いと考えられる ことから, mail が smtp 要求を受けるべきは, 1) mail にあるアカウント宛 に届くメール, 2) 地惑内のホスト(サブドメイン取得後なら, *.ep.sci.hokudai.ac.jp か)からの送られてきたメール, であろう.

qmail の FAQ 5.4「特定のクライアントにだけリレーとして使わせたい」(文献 1)に従って作業を行う. この FAQ では, tcpserver を使うやり方と, tcp-wrappers を使うやり方の二つが述べられて いる. tcpserver の導入によって, 同時に多くの smtp 要求を受け付けられ, 接続の記録が取れるようになる(文献 2)という利点 から, tcpserver を使うことにする.

[5.1] tcpserver 導入

文献 2に従って, qmail-smtpd の呼び出しを inetd から tcpserver に移す.

[5.1.1] inetd の停止

su になって, /etc/inetd.conf 中の smtp の行をコメントアウト (行頭に # を付す)して, inetd に HUP を送る . これによって, qmail-smtpd が inetd から呼び出されなくなる.

[5.1.2]tcpserver のインストール

tcpserver は ucspi-tcp ツール群のひとつの機能である. ucspi-tcp ツール群のうち tcpserver は入ってくる TCP 接続を受け付けるプログラムである. ftp://ftp.jp.qmail.org/qmail/ucspi-tcp-0.88.tar.gz を取得. 展開する. 続いて付属ドキュメントに従ってコンパイルする.

$ tar xvfz ucspi-tcp-0.88.tar.gz
$ make
# make setup check

[5.1.3]tcpserver の起動

qmaild の UID, nofiles の GID を確認した上で, 以下を実行する.

# tcpserver -u xxxx -g yyyy 0 smtp /var/qmail/bin/qmail-smtpd &
xxxx: qmaild の UID. yyyy: nofiles の GID.

inetd から qmail-smtpd を呼び出していたときと同様の受信テストを行い, inetd から tcpserver への移行 の成否を確認する.

次に qmail と同様に, ブート時に起動するようにする. /etc/init.d/tcpserver に以下を記述する. 編集後, root に実行許可を出す.

#!/bin/sh
#

# smtp
/usr/local/bin/tcpserver -u xxxx -g yyyy 0 smtp /var/qmail/bin/qmail-smtpd &
# chmod 755 /etc/init.d/tcpserver 

/etc/rc[2-5].d/ の下に, これへのリンクを置く.

# cd /etc/rc2.d/
# ln -s ../init.d/tcpserver S80tcpserver
# ls -al S80tcpserver
lrwxrwxrwx  1 root  root  15  S80tcpserver -> ../init.d/tcpserver

# cd /etc/rc3.d/
(RUNLEVEL 3-5 も同様)

[5.2] tcpserver 設定

smtp 中継を許可するホストを指定する. まず, 文献 1 に従って, /etc/tcp.smtp を書く. 例えば, 133.87.52.40 という IP アドレスのホストからの smtp 中継を許可するためには, この1行目のように 書く. 2 行目の 127. はローカルホストを指す. これは常に書くこと.

133.87.52.40:allow,RELAYCLIENT=""
127.:allow,RELAYCLIENT=""

次に以下のコマンドを実行する. tcp.smtp を元に /etc/tcp.smtp.cdb ができる.

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

tcpserver 起動スクリプト /etc/init.d/tcpserver の起動行は以下のように 編集しなおす(1 行で書く).

/usr/local/bin/tcpserver -v -x /etc/tcp.smtp.cdb -u xxxx -g yyyy 0 smtp /var/qmail/bin/qmail-smtpd 2>&1 | /var/qmail/bin/splogger smtpd 3 &
(xxxx: qmaild の UID. yyyy: nofiles の GID. )
追加された部分を説明すると -x /etc/tcp.smtp.cdb はデータベースファイル /etc/tcp.smtp.cdb を参照させるための設定である. また, 接続の記録を取るために -v オプションと splogger への受け 渡しが記述されている.

[5.3] tcpserver 起動確認

grey を reboot する. tcpserver の起動を確認する.

先ほど /etc/tcp.smtp に書いた IP アドレス(ここでは, 133.87.52.40)を 持つパソコンから, メーラー(例. eudora-J1.3.8.8r6)を使って, smtp サー バを blue に設定し, blue 以外の任意のホストにあるアカウント宛のメール を発信してみる.

/var/log/syslog に残るログは, 以下のようなものとなる事を確認する.

Jul 8 18:06:15 blue smtpd: 931424775.300370 tcpserver: status: 1/40
Jul 8 18:06:15 blue smtpd: 931424775.301735 tcpserver: pid 185 from 133.50.133.146
Jul 8 18:06:15 blue smtpd: 931424775.326543 tcpserver: ok 185 blue.ep.sci.hokudai.ac.jp:133.87.45.26:25
grey.sci.hokudai.ac.jp:133.87.52.40::2064
Jul 8 18:06:15 blue smtpd: 931424775.862705 tcpserver: end 185 status 0
Jul 8 18:06:15 blue smtpd: 931424775.863054 tcpserver: status: 0/40

[5.4]接続制御データベースファイル /etc/tcp.smtp.cdb 自動生成

gate-system から登録 IP アドレス一覧を受け渡してもらい, /etc/tcp.smtp.cdb を自動生成する. そのために, 標準入力から IP アドレス リストを読み込み, /etc/tcp.smtp を書くスクリプトを書いた. これを, /usr/local/sbin/list-2-tcp とする. root への実行許可を忘れずに.

#!/usr/bin/perl
#Kyoma TAKAHASHI 1999.08.11
#                1999.09.09
#                1999.11.09

#      list-2-tcp file

$add = ':allow,RELAYCLIENT=""';
$bottom = '127.';

$rulefile = shift;

open(RULEFILE,"> $rulefile");

while(<>) {
        chop($ip = $_);
        if($ip ne '') {
        if(/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/) {
                ($_) = /([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/;
                s/^0+//;
                s/\.0+/\./g;
                s/^\./0\./;
                s/\.$/\.0/;
                s/\.\./\.0\./g; s/\.\./\.0\./g;
                print RULEFILE $_,$add,"\n";
        }}
}

print RULEFILE $bottom,$add;

close(RULEFILE);

/usr/local/sbin/tcp_smtp_cdb を以下のように書く. root への実行許可を忘 れずに. gate の ip データベース更新時には, gate-system によってこのス クリプトが呼び出される.

#!/bin/sh
# Kyoma TAKAHASHI 1999.9.9
# 10.16

/usr/local/bin/gate-ip-show -f ip `/usr/local/bin/gate-ip-list stable` | /usr/local/sbin/list-2-tcp /etc/tcp.smtp && /usr/local/bin/tcprules /etc/tcp.smtp.cdb /etc/tcp.smtp.tmp < /etc/tcp.smtp

gate-ip-show, gate-ip-list は, gate-system のコマンドである.

パーミッションは以下のように設定する.

# chmod 755 /usr/local/sbin/tcp_smtp_cdb

[5.5] 文献

  1. http://man.qmail.jp/faq/faq5.html#5.4.
  2. http://man.qmail.jp/faq/faq5.html#5.1.
  3. http://man.qmail.jp/jinstall/install3.html
  4. http://man.qmail.jp/jinstall/remove.sendmail.html

www サーバにおけるメールの発信

qmail では,メールの発信は qmail-inject (マニュアルは http://man.qmail.jp/jman8/qmail-inject.html) による.

発信者アドレス(From:)

qmail-inject を使って普通にメールを発信した場合, 発信者アドレスは,kyoma@ep.sci.hokudai.ac.jp のようになる. これは,ユーザ名をローカル部,/var/qmail/control/defaulthost を ドメイン部としたアドレスである.

From: に入るアドレスを, 他のアドレスとするには,以下のいずれかによる.

  1. 環境変数 QMAILUSER, QMAILHOST を 設定したいアドレスに対応したものにしておく.
  2. qmail-inject に渡すメッセージのヘッダに, From: フィールドを設け,明示する.

宛先アドレス(To:)

また,ドメイン部のない宛先にメールを出した場合, これもまた,/var/qmail/control/defaulthost をドメイン部とする. このため,プライマリメールサーバのホスト のアドレス宛となる.

これは,cron デーモンが送るレポートメールにも該当する.

返送先アドレス(Return-Path:)

外ホストに送ってバウンスしたときなど, 配送不能メッセージが戻ってくる先がこれである.

これも From: と同様,ユーザ名をローカル部,/var/qmail/control/defaulthost を ドメイン部としたアドレスとなる.

Return-Path: に入るアドレスを, 他のアドレスとするには,以下のいずれかによる.

  1. 環境変数 QMAILSUSER と QMAILSHOST を 設定したいアドレスに対応したものにしておく.
  2. qmail-inject を, qmail-inject -f kyoma@cosmos.sci.hokudai.ac.jp のように -f オプションを付けて起動.

セカンダリメールサーバとしてのはたらき

準備

セカンダリ MX レコードが www サーバ に向いていることが必要.

プライマリメールサーバダウン時の動作

外部から ep.sci.hokudai.ac.jp あてに送られてきたメールは,セカンダリメールサーバである www サーバ に送られる. www サーバは,これを受け取るが,ローカルあてではなく,リモート配送すべきと判断する. ep.sci.hokudai.ac.jp あてのメールは,MX レコードの検索なしに,mail.ep.sci.hokudai.ac.jp あてに送ることになっている. しかし,mail.ep.sci.hokudai.ac.jp はダウンしているため,リモート配送は成功せず,メールキューにたまる.

mail.ep.sci.hokudai.ac.jp の復活後,これらのたまったメールはめでたく配送されていく. キューにたまったメールを速やかに配送させるためには,

# kill -ALRM [qmail-send の PID]
とする. http://man.qmail.jp/jman8/qmail-send.html を参照せよ.

また,プライマリのメールサーバ と同じように接続制御データベースと共に tcpserver による smtp の受付をさせているため,ep ドメイン内の smtp クライアント (パソコンなど) からのメールを任意の宛先に smtp 転送できる.


最終更新日: 2004/02/16(小松 研吾) Copyright © 2001 epcore