2011/02/09 CentOS5.5





宛先により配送先を振り分けるメールサーバ

他のパターンはPostfixでメールサーバを構築する(解説)も参照してください。

インバウンドにしろアウトバウンドにしろ、メールは宛先によってサーバを振り分けたいことがよくあります。
たとえば学校など、生徒用メールサーバと教員用メールサーバは分かれているが、外部からは一台のサーバで受け付けることがよくあります。
送信時も、企業がメールを送信するとき、グループ企業用のメールは別のLANへ向かって送信し、その他のメールは外部へと転送することがよくあります。

これら「配送制御」を主に担うサーバをメールハブと呼びます。またその動作から「メールルーティング」などとも呼ばれます。この辺りの名称はあまり定められていないようです。

条件
 メールアドレスの@マーク以降を見て、指定されたサーバに転送します。
 不明なドメインのメールについてはデフォルトでは転送しません。
 メールをドメイン別へ振り分けるが、自身はメールを溜めこまない。
 
 この図の中のノートパソコンを、外部の不特定多数のクライアントとみなすことも、内部のクライアントとみなすこともできます。
 内部のクライアントとみなす場合は、インターネット向けの経路がないことになります。 

 この場合、Postfix以外にすでに動作しているメールサーバdomainA、domainBがあるものとします。

Postfixをインストールする
Postfixを設定する
Transportリストを記述する
Telnetでメールの転送を確かめる


Postfixをインストールする
postfixがインストールされているか確かめ、見つからなければPostfixをインストールします。

#rpm -q postfix
(Postfixとバージョン番号が表示されるか?)

表示されなければ
#yum install postfix
としてインストールします。リポジトリへ接続できることが条件です。

インストールしても、Postfixは起動しません。一見起動したように見えますが、statusを見ると起動してません。
これはデフォルトでSendmailが起動しているので、すでに25番ポートが使用されているからです。

sendmailを止めてPostfixを起動させます。

#service sendmail stop  (Sendmailを止めます)
#chkconfig sendmain off (自動起動を止めます)
#service postfix start   (Postfixを起動させます)
#chkconfig postfix on   (自動起動を有効にします)
#service postfix status  (動作を確認します)

「telnet localhost 25」などとして25番ポートのPostfixへアクセスできるか確認します。
ファイアウォールも確認しておきましょう。


Postfixを設定する
次にPostfixの設定ファイルを編集します。
/etc/postfix/main.cfを次のように編集します。

myhostname
ホスト名として相手のSMTPに名乗るメールサーバ名です。礼儀でしょう。
指定するのは必ずFQDN名です。ドットの無いマシン名だけではダメです。
基本的にどんな名前でも構いませんが、相手のメールサーバとかぶってはいけません。拒否られます。
値を指定しない場合、hostsファイルから自分で解決する。
検証環境でお互いに指定しないと、対抗のメールサーバとデフォルト名で重複する可能性があります。
相手と重複しなければ、指定しなくても動作します。
myhostname = mail.example.local

mydomain
myhostnameとほぼ同様です。
指定するのは、myhostnameのドメイン部分です。
mydomain = example.local

inet_interface
どのIPアドレスへサービスをバインドするかです。
デフォルトはlocalhostへバインドされていますので、メールサーバ自身しかPostfixへアクセスできません。
とりあえず全てのIPアドレスへサービスを提供しましょう。
inet_interface = all

mynetworks
これはメールを外部へ中継することを許す送信元を指定します。
許された相手なら、どこへでもメールを中継してしまいます。気を付けましょう。
なにも指定されていなければ、同一セグメントのクライアントからは許可です。
しかし今回の場合は振り分け制御が目的なので、明示的に信頼するアドレスを自身に制限して、知らないアドレス宛てのメール中継はしないように設定します。

mynetworks = 127.0.0.0/8


relay_domains
中継を許可する宛先ドメインを記述します。このドメインなら不特定多数の相手から中継を受け付けます
今回は、example.localとそのサブドメイン宛の中継を許可することにします。

relay_domains = example.local

example.localと記述すれば、サブドメインも全て許可されます。
Postfixの中継可否の流れは
1.信頼されたクライアント(mynetworks、mynetworks_style)からは、全ての宛先に対して中継。
2.信頼されていないクライアントからでも、宛先がrelay_domainsに対してなら中継。
となります。
中継の意味には、自分自身のメールボックスも含まれます。だからrelay_domainsに自ドメインが含まれていないとローカル配送(自分宛てのメールを受信・保存)も行われなくなります。
relay_domainsになにも指定しない場合relay_domainsには$mydestinationが含まれます。

transport_maps
配送先リストファイルを指定します。
このパラメータはデフォルトでは無いので、追記する必要があります。

transport_maps = hash:/etc/postfix/transport

ファイルの冒頭に「hash:」を記述するのを忘れないように。
このファイルの中に、メールのルーティングルールを記述します。

Transportリストを記述する
ルーティングルールとなる、転送リストを記述します。
中継が行われるときに初めて使用されます。
中継が許可されているメールをどこへ送るかを記述するのであって、中継可否そのものは行われません。
中継可否はrelay_domainsとmynetworksで制御されます。
mynetworksはなんでも転送。ただしその後はtransportファイルに従う。と覚えます。

#vi transport

example.local  :[192.168.1.100]
sub.example.local  :sub.example.local
.example.local  :[mailtrans.example.local]



example.local   :[mail.example.local]
@example.local宛のメールはmail.example.localのAレコードに対して配送されます。
[ ]でくくると、Aレコードとして処理されます。IPアドレス、ホスト名を記述します。

sub.example.local   :sub.example.local
@sub.example.local宛のメールは、submail.example.localのMXレコードに対して配送されます。
直接記述すると、MXレコードで解決されます。ドメイン名を指定できますが、ホスト名、IPアドレスは記述できません。

.example.local  :[mailtrans.example.local]
冒頭にドットを付けた場合、サブドメインを意味します。
sub1.example.localやtest.example.localなどexample.localのサブドメインのアドレスは、mailtrans.example.localのAレコードに対して送信されます。
この場合は先にsub.example.localが指定されているため、それ以外のサブドメインが対象になります。

ファイルを記述したら、ハッシュ化し、Postfixに再読み込みさせます。

#postmap transport
#service postfix restart


リストを変更したら、必ずハッシュ化、再読み込みを行いましょう。
Postfixを再読み込みさせた後にハッシュ化しても意味がありません。

Telnetでメールの転送を確かめる
TelnetでSMTPの挙動を確認します。

メールサーバ上でメールのログを監視します。
#tail -f /var/log/maillog

ローカルホスト以外の端末から、「telnet CentOSサーバ 25」として直接SMTPサービスにログインし、SMTPコマンドを実行します。

太字部分が入力内容です。
宛先のメールは、外部のインターネットメールを使用します。

220 localhost.localdomain ESMTP Postfix
helo localhost
250 localhost.localdomain
mail from: user1@example.local
250 2.1.0 Ok
rcpt to: user@example.local
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
helo postfix
.
250 2.0.0 Ok: queued as 0625633CC90
quit
221 2.0.0 Bye

tailで監視している/var/log/maillogの内容で

Jan 29 18:43:24 localhost postfix/smtp[3075]: D420533CC90: to=<user@hogehoge.net>, rely=[宛先のメールサーバ:25], delay=1.4, delays=1/0.03/0.18/0.2, dsn=2.0.0, status=sen (250 OK)

という内容が出れば成功です。

同様のコマンドでsub.example.local宛のメール、abc.example.local宛のメールが正しく配送されるかを確認します。
そしてそれ以外の宛先のメールでも試験し、(relay_domainsに基づき)中継が拒否されることを確認します。

もし「reject」というログが出力されれば、転送が禁止されています。

思い通りにいかない場合は、各コンフィグの初歩的な記述ミス(スペースの有無、綴りミス)、宛先アドレスの確認、DNSサーバの確認を行います。






prev.gif