|
||
|
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に関連する、ネットワークの知識など、メールのトラブル原因は多岐に渡ることが多いです。 |
|