メール送信ドメイン認証 SPF と Sender-ID の設定 (2)


テスト環境について


今回検証のために作成した環境は以下の通りです。それぞれの定義から披露しましょう。

構成図1

Windows2000 Server のルータ
2枚のインタフェースがそれぞれ正しく設定されていることを確認したうえで、マイコンピュータを右クリックして「管理」で「コンピュータの管理」を表示します。この一番下のコンポーネント「ルーティングとリモートアクセス」を開きます。この中の「ルーティングインタフェース」に2枚のNICが載っていることを確認し、「IPルーティング」の「静的ルート」で、お互いのセグメントを相手にフォワードするよう設定を記述します。当然ながらLinux や FreeBSD などの PC-UNIX で作っても、L3 スイッチなどでも結構です。

DNS

それぞれのセグメントで named による DNS をセットアップしました。テスト用なので named のバージョン番号などはこだわっていません。なお、キャッシュが効きすぎると設定変更しても反映に時間がかかるので、テスト環境専用にできる場合には TTL などを2分などの小さい値にした方が幸せになれます。

・my.example.jp 側

OS は FreeBSD 4.11-stable (2005/3/5頃 cvsupしたもの) で bind-9.2.3 を使用しました。ポイントは、root サーバにアクセスできない閉じたテスト環境なので、forwarders に相手(example.com)の DNS サーバを指定している点です。

・example.com 側

OS は RedHat Linux 9 で bind 9.2.1 を使用しました。こちらも forwarders を指定する必要があります。

送信側sendmail

今回は FreeBSD 標準の sendmail 8.13.3 を利用しますので、/usr/share/sendmail/cf/cf 以下にテンプレートファイルがあります。mc ファイルから cf ファイルがコンパイルできたら、/etc/mail にインストールします。/etc/rc.conf で sendmail_enable="YES" として再起動します。ps -ax で sendmail のプロセスが2つ起動されていれば完了です。

受信側sendmail + sid-milter

コンパイル・環境設定を実際にやっていきます。

題材は RedHat Linux 9.0 です。このマシンにはすでに rpm で 8.12 系が入っていますが、起動スクリプトはこのまま流用したいので、あえてrpmを消さずに利用したいと思います。(/etc/init.d/sendmail と /etc/sysconfig の下にあるパラメータファイルをバックアップした上で rpm を消してもいいですけど、そのあたりは趣味の問題ということで)

sendmail.org から sendmail.8.13.3 を、sourceforge から sid-milter-0.2.7 を取得します。まず sendmail を MILTER 対応の形でコンパイルします。
(rpm版sendmailだと最初から有効だといううわさがあります。筆者は未確認ですが。)

梅本さんのサイトにあるように devtools/Site/site.config.m4 を作る必要があります。同じディレクトリにサンプルファイルがあるのでこれをコピーして作るのが定石なのですが、ここには標準では入らないオプションがいろいろ入っていて却って邪魔になります。新たにこの2行だけのファイルを作ったほうがよさそうです。
APPENDDEF(`conf_libmilter_ENVDEF', `-DMILTER')
APPENDDEF(`conf_sendmail_ENVDEF', `-DMILTER')
あるいは
APPENDDEF(`confENVDEF',`-DSTARTTLS')
といった STARTTLS 関係のオプションや
#dnl ### Changes for PH_MAP support.
APPENDDEF(`confMAPDEF',`-DPH_MAP')
APPENDDEF(`confLIBS', `-lphclient')
APPENDDEF(`confINCDIRS', `-I/opt/nph/include')
APPENDDEF(`confLIBDIRS', `-L/opt/nph/lib')
というPH(って何かいなと思ったら、CCSO (Ciscoじゃない) という一種のディレクトリサービスで、Eudora ではサポートしているらしい。海の向こうでは使っている人がいたのかも)関係のオプションを全部コメントアウトしてください。
(以下の例ではこのようにコメントアウトして作業をしています)

再度 ./Build -c してみます。(コンパイルしなおすときは -c を付けてください。Build スクリプトのオプションはかの有名な「sendmail 解説」に載っています)

make しているメッセージをちらっと見ると、
cc -O2 -I. -I../../include  -DNEWDB  -UNIS -DMILTER     -c -o bf.o bf.c
ちゃんと -DMILTER が効いているみたいです。(コンパイルの最初の方には出ませんがあわてないでください)

無事コンパイルできましたので、root になってインストールします。当然ですが、service sendmail stop しておいてくださいね。すでに 8.12 が入っているので smmsp アカウントなど面倒なことは調べるまでもないのでいきなり ./Build install します。現行の sendmail に上書きしてくれるようです。

smrsh と man 関係でやたら怒られます。/usr/man がないのが原因のようですので、ln -s /usr/share/man /usr/man としておきましょう。root になった状態で service sendmail start して /var/log/maillog に新しいバージョンで起動されているか確認します。
Mar 23 16:08:15 mail sendmail[21721]: starting daemon (8.13.3): SMTP+queueing@01:00:00
Mar 23 16:08:15 mail sm-msp-queue[21729]: starting daemon (8.13.3): queueing@01:00:00
これで大丈夫。ついでに /usr/sbin/sendmail -d0.10 を実行します。
Version 8.13.3
 Compiled with: DNSMAP LOG MATCHGECOS MILTER MIME7TO8 MIME8TO7
                NAMED_BIND NETINET NETUNIX NEWDB PIPELINING SCANF USERDB XDEBUG
(以下略)
ちゃんと MILTER の文字が入っています。ただこれだけでは libmilter がインストールされないようですので、ソースツリーのトップから cd libmilter して./Build して ./Build install しておきましょう。/usr/lib にインストールされるはずです。

さて、sid-milter のコンパイルにかかりましょう。

INSTALL ドキュメントには sid-filter/Makefile.m4 を編集しろと書いてあります。問題の箇所はさっき追加した libmilter.a の場所などのようです。その場所は現在コメントアウトされているので、とりあえずこの状態で make してみます。
./Build
終わったら root になって
./Build install
して完了です。



ここからはセットアップになります。まずはドメインによる認証をせずに普通に受信させます。

RedHat Linux ではローカル配信エージェント(MDA)に procmail を使う主義だそうですが、procmail の設定となると本稿の範囲を逸脱するので、あまり細工はしないことにしました。

まず sendmail.cf を作るため、/usr/local/src/sendmail-8.13.3/cf/cf の中にある generic-linux.mc を mail.example.com.mc とでもコピーします。
divert(-1)dnl
中略
divert(0)dnl
VERSIONID(`$Id: generic-linux.mc,v 8.1 1999/09/24 22:48:05 gshapiro Exp $')
OSTYPE(linux)dnl
DOMAIN(generic)dnl
define(`confPRIVACY_FLAGS',`goaway')dnl
FEATURE(`access_db',`hash -T -o /etc/mail/access')dnl
FEATURE(`nouucp',`reject')dnl
MAILER(local)dnl
MAILER(smtp)dnl
とりあえず気になるところだけ指定したしょぼい mc ファイルですが、これを make して cf ファイルを作り、/etc/mail/sendmail.cf としてコピーします。と、これだけでは local mailer がないと怒られます。submit.cf を作り直していないのが原因でしたのでちゃんと作って /etc/mail 以下にコピーします。こちらは私の趣味で mail.local を使用するようにしました。ひょっとしたら mail.local 自体がインストールされていないかもしれませんので、ソースツリーから mail.local を Build しておいてください。(どうでもいいことですが、別に procmail が嫌いというわけではありません。こういう用途にはなくてはならないツールですから)
# service sendmail restart
で再起動します。

これだけではだめで、aliases データベースの初期化が必要です。なぜかというと、newaliases コマンドは aliases ファイルが /etc/mail にあると思っているのに実体が /etc にあるからです。
# ln -s /etc/aliases /etc/mail/aliases
# newaliases
としておきます。(今後は /etc/mail/aliases に置かれるのが標準なんだそうです)

これで FreeBSD 側で送信します。
% whoami
too
% echo "test" | mail -s "testmail" too@mail.example.com
example.com 側では
From too@vmfreebsd.my.example.jp  Mon May  9 14:53:01 2005
Date: Mon, 9 May 2005 14:53:31 +0900 (JST)
From too <too@vmfreebsd.my.example.jp>
to: too@mail.example.com
Subject: testmail

test
というメールが届きます。これで問題なさそうです。

次へ

前へ

目次に戻る
>