2011/02/09 CentOS5.5





DMZを介したメールの配送

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

インターネットに公開した一台のメールサーバで全ての役目を負わせるのは設定が複雑になりやすく、設定ミスもおきます。
ここでは役割を分け、DMZメールサーバとLANメールサーバを作るのが一般的な構成です。

DMZメールサーバの役割
 外部からのメール → 内部ドメイン充てのメールだけを中継。その他は拒否
 内部からのメール → LANメールサーバからのみどこへでも中継。

LANメールサーバの構成
 内部宛てのメール → 自分自身がメールドメインを持ち、自分ドメイン宛てのメールは受信・保存。
 外部宛てのメール → 自NWからのクライアントのみ受け付け、DMZメールサーバへ中継

それでもDMZサーバの「外部から内部宛てのメールは中継する」+「内部から外部へのメールは何でも中継する」の構成を誤って設定すると、「外部から外部へなんでも中継する」サーバができてしまいます。


条件
 LAN内のメールサーバは全ての宛先への中継を許可する。外部宛のメールは一律にDMZサーバへ中継する。
 LAN内のメールサーバはインバウンドのメールはDMZから受け取る。
 DMZのサーバは全てのアドレスから、内部向けのドメインのメールだけを内側へ中継する。
 DMZのサーバは全てのアドレスへ中継を許可するのは、LAN内のメールサーバからだけ。
 

SMTPで送信、受信と表現すると紛らわしいので、通常はアウトバウンド・インバウンド、あるいは外部宛・内部宛などと呼びます。

メールの中継は「入りと出」という2方向ではなく、外からの「入りと出」と内からの「入りと出」という4方向を気にする必要があります。
ポリシーの違うサーバをそれぞれ異なるセキュリティポリシーで運用することで、ぐっと不正アクセスの要素を減らします。

Postfixをインストールする(DMZ/LAN)
LANのメールサーバを設定する
DMZのメールサーバを設定する
Telnetでメールの転送を確かめる(インバウンド・アウトバウンド)

Postfixをインストールする(DMZサーバ/LANサーバ)
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へアクセスできるか確認します。
ファイアウォールも確認しておきましょう。


LANのメールサーバを設定する
インターネットへ向けて送信しない閉じたメールサーバを構築します。
(SMTPサービスを設定、POPサービスの設定、メールアカウントの作成を行っています)

次に上位メールサーバへ一律転送するメールサーバを構築します。
(中継許可セグメント、中継サーバを指定します)
ここでは指定するrelayhostのアドレスはDMZサーバになります。

設定パラメータはまとめてみます。

inet_interface
inet_interface = all

mynetworks
mynetworks = 192.168.1.0/24

myhostname
myhostname = mail.example.local

mydomain
mydomain = example.local

relayhost
relayhost = [xxx.xxx.xxx.xxx] (DMZのSMTPサーバのアドレス。次の送信先サーバ)


ここまで設定したら、Postfixにコンフィグを読み込ませます。

#service postfix restart


DMZのメールサーバを設定する
宛先により配送先を振り分けるを参考に、DMZのメールサーバを設定します。
インバウンドのメールは、特定のドメイン宛(example.local)のメールだけLAN内のメールサーバへ中継。
アウトバウンドのメールは、LAN内のメールサーバを信頼し、どこへでも中継します。

myhostname
myhostname = dmz.example.local

mydomain
mydomain = example.local

inet_interface
inet_interface = all

mynetworks
mynetworks = aaa.aaa.aaa.aaa/32 (LANメールサーバアドレス。無制限の中継を信用するメールサーバ)

relay_domains
relay_domains = example.local  (外部からのメールでも、このドメインだけは中継してあげる)

transport_maps

transport_maps = hash:/etc/postfix/transport (特定のドメインをメールサーバへ送るためのルール)

transportファイルの作成
example.local  smtp:[aaa.aaa.aaa.aaa]   (LAN内のメールサーバのアドレス)
  作成後、postmap /etc/postfix/transport でDBを更新します。


ISPが独自のメール送信を許していない場合は、ISPメールサーバ宛にrelayhostを記述します。
relayhost
relayhost = [ISPメールサーバ]

(直接DMZサーバで受けるような環境ではあまり要求されないでしょうが)SMTP-AUTHで規制されている場合はSASLを設定してSMTP-AUTHクライアント機能を使用します。SMTP-AUTHを使って上位メールサーバへ転送する


Telnetで転送を確認する(インバウンド・アウトバウンド)
Telnetで転送を確認します。

インバウンドとアウトバウンドを確認するため、LAN用メールサーバと、DMZメールサーバの両方を監視します。
両方のメールサーバでTelnetでSMTPの挙動を確認します。

#tail -f /var/log/maillog

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


インバウンドテスト


太字部分が入力内容です。

220 localhost.localdomain ESMTP Postfix
helo localhost
250 localhost.localdomain
mail from: user1@hogehoge.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で監視しているログを確認します。

DMZメールサーバ
Feb  9 22:42:54 localhost postfix/qmgr[4460]: 7496211E60: from=<user1@hogehoge.net>, size=342, nrcpt=1 (queue active)
Feb  9 22:42:54 localhost postfix/smtp[4498]: 7496211E60: to=<user@example.local>, relay=
[LANのメールサーバ]:25, delay=5.3, delays=5/0.01/0.18/0.07, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 7A42933CC9B)

LANメールサーバ
Feb  3 22:54:20 localhost postfix/local[31299]: 7A42933CC9B: to=<user@example.local>, relay=local, delay=0.07, delays=0.03/0.02/0/0.01, dsn=2.0.0, status=sent (delivered to mailbox)

という内容が出ればインバウンドは成功です。
もしダメな場合、チェック点は以下のようなものでしょうか。
DMZサーバ
・myhostname、mydomainが指定されておらず、LANメールサーバと重複している。
・Transportが正しく指定されていない。postmapでハッシュが生成されていない。Postfixを再起動していない。
・relay_domainsが設定されていない。

LANサーバ
・myhostname、mydomainが指定されておらず、DMZメールサーバと重複している。

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

Feb  9 22:54:15 localhost postfix/smtpd[4518]: NOQUEUE: reject: RCPT from unknown[宛先のメールサーバ]: 554 5.7.1 <user@example.net>: Relay access denied; from=<user@hogehoge.net> to=<user@xxx.internet.net> proto=SMTP

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


アウトバウンドテスト

LANメールサーバへ、中継を許可されたセグメント(通常は同じセグメント)から25番へTelnetします。

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

220 localhost.localdomain ESMTP Postfix
helo localhost
250 localhost.localdomain
mail from: user1@example.local
250 2.1.0 Ok
rcpt to: test@internetmail.example
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で監視しているログを確認します。

LANメールサーバ
Feb  3 23:04:13 localhost postfix/qmgr[31273]: 12D4A33CC9B: from=<user1@example.local>, size=355, nrcpt=1 (queue active)
Feb  3 23:04:13 localhost postfix/smtp[31323]: 12D4A33CC9B: to=<test@internetmail.example>, relay=[
DMZのメールサーバ]:25, delay=2.8, delays=2.7/0.02/0.02/0.04, dsn=2.0.0, status=sent (250 2.0.0 Ok: queued as 4D93811E60)

DMZメールサーバ
Feb  9 23:01:09 localhost postfix/smtp[4543]: 4D93811E60: to=<test@internetmail.example>, relay=[宛先のメールサーバ]:25, delay=0.94, delays=0.06/0.01/0.18/0.69, dsn=2.0.0, status=sent (250 OK)

という内容が出ればアウトバウンドは成功です。
もしダメな場合、チェック点は以下のようなものでしょうか。
LANサーバ
・mynetworksがローカルホスト限定になっている。
・myhostname、mydomainが指定されておらず、DMZメールサーバと重複している。
・relayhostが指定されていない。IPアドレス、ホスト名をブロックかっこ[ ]でくくっていない。

DMZサーバ
・myhostname、mydomainが指定されておらず、LANメールサーバと重複している。
・ISPが直接送信を許可していない環境で、relayhostが指定されていない。
・mynetworksにLANメールサーバが指定されていない。

単純な設定ミスや記述ミスが原因のことが多いです。
あるいは設定項目の意味の思い違い、ドメイン名などDNSに関連する、ネットワークの知識など、メールのトラブル原因は多岐に渡ることが多いです。






prev.gif