次のページ 前のページ 目次へ

9. 仮想的なMail/Pop

9.1 Qmail の注意点

この章はsendmailのみに関する内容です。qmailの章はHOWTOの次のバージョン で追加します(訳注:Qmailに関するマニュアルは「Qmail+MH」などが出て います)。

9.2 問題

現在、仮想メールのサポートに関する要求はますます増えています。Sendmailは 仮想メールをサポートすると言っていますが、その内容は異なるドメインからの メール取り込みのことのようです。 メールをどこかにフォワードさせるということができます。しかしもしローカル マシンにフォワードしたりbob@domain1.com、bob@domain2.comにメールが 来る場合などでは同じメールフォルダにたまってしまうでしょう。これは bob宛のメールが実際は違う人宛で中身も違うのだから問題です。

9.3 悪い解決方法

ユーザー名に番号を追加(例えばbob1, bob2など)したり、頭に文字を入れて dom1bob, dom2bobにしたりすることによってユーザーの一意性(unique)を 保証することはできます。これを裏で変換するように mailやpop をハック(hack) することもできますが汚い(messy)方法です。 出ていく方のメールもまたバーナー(ヘッダ)にmaindomain.comがついていて 各サブドメインのメールバーナーも違ったものにしたいのです。

9.4 良い解決方法

各仮想ファイルシステムに各ドメイン用の/etc/passwdを用意してい ます。これはbob@domain1.combob@domain2.comが、別々の /etc/passwd上の違うユーザーであり、メールのトラブルはないという ことになります。このユーザー達には自分用のspoolディレクトリが用意されていて、 各仮想ファイルシステム上のメールフォルダは互いに違うものであることになりま す。

しかし、sendmailはちょっとしたソースコードの修正が必要です。 sendmailは/etc/sendmail.cwと呼ばれるファイルを持っています。 これはsendmailが他のホストに転送しないでローカルに配送する全ての ホスト名を含んでいるファイルです。

sendmailはマシン上の全デバイスの内部チェックを、ローカルIPでこのリストを 初期化するために行います。 もし同じマシン上の仮想ドメイン間でメールを送る場合、問題が出てきてしまい ます。sendmailには他の仮想ドメインがローカルアドレスであり、メールもロー カルにスプールするという考えはないのです。

例えばbob@domain1.comさんがfred@domain2.comにメールを送ったと します。domain1.comのsendmailはdomain2.comがローカルであると 判断するのでdomain1.comにメールをスプールしてしまい、結果として domain2.comにメールが届くことはありません。 そこでsendmailを修正してやります(著者はv8.8.5のsendmailでこれを行い、特に 問題はありません)。src/main.cの494行辺りを編集します。 sendmailのソースは適当なサイトやディストリビューションCDROMから入手できま す。

vi v8.8.5/src/main.c # Approximately Line 493
として、
load_if_names();
という箇所を
/* load_if_names(); Commented out since hurts virtual */
とコメントアウトしてしまいます(訳注:この関数はインターフェースの 走査と追加名の場所をしめす関数でconf.c line 4399にこの関数自体が あります。IPリストのスキャンなどを行っています)。 もし仮想ドメイン間のメール送信が必要ならこれを行うだけでよいことに注意して 下さい。

問題は解決されたのですが、メインのイーサネットデバイスeth0は削除されていま せん。そこで、もし同一マシンの仮想IPからeth0上のIPにメールを送る場合は ローカルに送られます。著者はダミーIPvirtual1.domain.com (10.10.10.157)として使っています。このホストにはメールを送らないのでどの仮想ドメイン もいりません。これはシステムが大丈夫かどうかチェックするために sshでログイン する時に使うIPでもあります。

/etc/sendmail.cwの編集

vi /etc/sendmail.cw
mail.domain1.com
domain1.com
domain1
localhost
m4を使って/etc/sendmail.cfを好きなように作ります。 著者は以下のようなものを使いました。
divert(0)dnl
VERSIONID(`@(#)tcpproto.mc      8.5 (Berkeley) 3/23/96')
OSTYPE(linux)
FEATURE(redirect)
FEATURE(always_add_domain)
FEATURE(use_cw_file)
FEATURE(local_procmail)
MAILER(local)
MAILER(smtp)
(訳注:m4はUNIXマクロプロセッサで、たいていのシステムに入っています。 最新バージョンはftp://prep.ai.mit.edu/pub/gnu/から 入手できます。m4 linux.mc > /etc/sendmail.cfなどとして使います。 m4の例が/usr/lib/m4-exampleにあります。オプションはm4 --help で調べて下さい)

/etc/sendmail.cfを仮想ドメイン応答するように編集。

vi /etc/sendmail.cf # 86行辺りを編集 

#  my official SMTP hostname (defined automatically)
#Dj$w.Foo.COM
という箇所があるので、これを

#  my official SMTP hostname (defined automatically)
Djdomain1.com
としておきます。

sendmailはそれ自身ではそのサービスを始めることができず、inetdを 通して起動する必要があります。これは役に立つことでもなく起動時間を 遅くしているだけでしょう。読者が高速なサイトを管理しているなら 仮想マシン上に他のドメインを占有させるべきではないかもしれません。

-bd フラグを付けて起動することは決してしないで下さい。 (訳注:このフラグはsendmailをデーモンとして起動するオプションです。 くわしいことはman sendmailして下さい)。 また各ドメインで配送していないメールを送り出す(queue up)するために sendmail -qと実行する必要があることに注意してください。

#!/bin/sh

# Source function library.
. /etc/rc.d/init.d/functions

case "$1" in
  start)
        echo -n "Starting sendmail: "
        daemon sendmail -q1h
        echo
        echo -n "Starting virtual sendmail: "
        for i in /virtual/*
        do
                if [ ! -d "$i" ]
                then
                        continue
                fi
                if [ "$i" = "/virtual/lost+found" ]
                then
                        continue
                fi
                chroot $i sendmail -q1h
                echo -n "."
        done
        echo " done"
        touch /var/lock/subsys/sendmail
        ;;
  stop)
        echo -n "Stopping sendmail: "
        killproc sendmail
        echo
        rm -f /var/lock/subsys/sendmail
        ;;
  *)
        echo "Usage: sendmail {start|stop}"
        exit 1
esac

exit 0

popは特に何もせずにインストールしてしまいます。virtualdのパートを追加した上で inetdのエントリーをすることが必要です。sendmailとpopに関するinetd.confの エントリは、

pop-3 stream tcp nowait root /usr/bin/virtuald virtuald /virtual/conf.pop in.qpop -s 
smtp stream tcp nowait root /usr/bin/virtuald virtuald /virtual/conf.mail sendmail -bs
となります。


次のページ 前のページ 目次へ