SMTPリレーサーバー導入:メールサーバー 554 FCrDNS check failed 対策 (4)

Internet

 前回は、リレーサーバー側でDovecot SASLとPostfix submissionを設定し、送信元サーバーからの送信認証を受け付ける構成を準備しました。
 今回は、送信元サーバー側のPostfixを設定し、リレーサーバー経由でメールを送信できるようにします。
本番運用中のメールサーバーであるため、まずはtransport設定を利用し、既存のメール配送経路を維持したまま、特定の宛先のみリレーサーバー経由で送信できることを確認します。動作確認後、最終的にrelayhostを設定し、外部宛メールの配送経路をリレーサーバー経由へ切り替えます。

SMTP認証情報の設定

送信元サーバーからリレーサーバーへ接続するため、PostfixにSMTP認証情報を設定します。
認証情報はsasl_passwdファイルに記述し、postmapコマンドでPostfixが参照できる形式に変換します。

sasl_passwdには、リレーサーバーへ接続するときに使用するリレー送信用SMTPアカウントとパスワードを記述します。

[root@exiv ~]# vi /etc/postfix/sasl_passwd

リレーサーバーホスト名および認証情報を設定します。

  • リレー接続先とポート
    [relay.exiv.net]:587 ※ STARTTLS
    ※角括弧 [ ] はDNS MXレコードを参照せずに指定ホストに直接接続
  • 区切り:
    スペース(半角スペース)
  • SMTP_USER(リレー送信用SMTPアカウント)
    postfixadminで作成したリレー送信用SMTPアカウントを記入します。
  • 区切り
    :(コロン)を入力
  • SMTP_PASSWORD(パスワード)
    リレー送信用SMTPアカウントのパスワードを記入します。
[relay.exiv.net]:587 SMTP_USER:SMTP_PASSWORD

入力内容を保存して終了。設定した情報をpostmapコマンドでpostfix参照用のデータベースに変換します。
作成したファイルのパーミッションをオーナーのみに制限します。

[root@exiv ~]# postmap /etc/postfix/sasl_passwd
[root@exiv ~]# chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
transport設定

transport は「宛先ごとに送信経路を切り替える」機能です。特定のメールアドレスだけをリレーサーバー経由で送信するためのルーティング定義を設定します。transportは、宛先ごとの配送ルール(transport map)を定義するファイルです。

[root@exiv ~]# vi /etc/postfix/transport

ファイルには初期状態でコメントが記載されていますが、そのまま最下行に配送設定を追記します。

#宛先(テスト送信に利用するドメイン外のメールアドレス)  smtp:[relay.exiv.net]:587
[email protected] smtp:[relay.exiv.net]:587

※本記事でテキストで記載しているメールアドレスやIPアドレスは自動収集対策として伏字やダミーで記載しています。

transportファイルの行の構文は以下のとおりです。

  • 宛先:
    テスト送信に利用するドメイン外のメールアドレスを記入します。
  • 区切り:
    スペースまたはタブで区切ります(1つ以上で可)。
  • プロトコル/接続先/ポート
    smtp:[relay.exiv.net]:587
    ※角括弧 [ ] はDNS MXレコードを参照せずに指定ホストに直接接続

入力内容を保存して終了。設定した transport ファイルを postmap でPostfix用のデータベース(.db)に変換します。その後、作成したファイルのパーミッションをオーナーのみに制限します。

[root@exiv ~]# postmap /etc/postfix/transport
[root@exiv ~]# chmod 600 /etc/postfix/transport /etc/postfix/transport.db
送信元サーバー:Postfix設定確認

リレーサーバーへの接続に関係するPostfix設定を確認します。

relayhostは、Postfix全体のリレー先を指定する設定です。
transport_mapsは、宛先ごとに配送経路を指定する設定です。

[root@exiv ~]# postconf relayhost transport_maps
relayhost =
transport_maps =

 smtp_sasl_auth_enableおよびsmtp_sasl_password_mapsは、リレーサーバーへ接続する際の送信認証についての設定です。
smtp_tls_security_levelは、リレーサーバーへ接続するときのTLS利用に関する設定です。

[root@exiv ~]# postconf smtp_sasl_auth_enable smtp_sasl_password_maps smtp_tls_security_level
smtp_sasl_auth_enable = no
smtp_sasl_password_maps =
smtp_tls_security_level = may
main.cf 設定追加

 main.cf には、transportによるルーティングの参照設定、リレーサーバー接続時に必要となる認証参照設定(sasl_passwdとの連携)、外部SMTP接続時のTLS動作条件(smtp_tls_security_level)を追記します。

 確認したところ、smtp_tls_security_level = may はmain.cfに記述されていました。
今回は既存のTLS設定を維持し、transportによるルーティング設定と、リレーサーバー接続時に使用するSMTP認証設定を追加します。
設定内容にコメントを残したいため、postconfではなくmain.cfを直接編集します。

[root@exiv ~]# vi /etc/postfix/main.cf
# ルーティングの参照設定
transport_maps = hash:/etc/postfix/transport

# リレーサーバー接続時に必要となる認証参照設定
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous

# 外部SMTP接続時のTLS動作条件
# リレーサーバ経由に完全に切り替えるタイミングでencryptに変更する
smtp_tls_security_level = may 

 テスト構成では、transportファイルに記述した条件に合致したメールのみリレーサーバー経由で送信されます。transportに記述していない宛先は、従来どおり通常の配送経路を使用します。

また、標準のsmtpトランスポートを利用するため、master.cfの設定は不要です。
※テスト段階では、relayhostはまだ設定しません。

Postfix設定反映と動作確認

設定内容に問題がないことを確認し、Postfixをリロードします。

[root@exiv ~]# postfix check
[root@exiv ~]# systemctl reload postfix

続いて、transport設定が意図どおり登録されていることを確認します。

[root@exiv ~]# postmap -q [email protected] /etc/postfix/transport
smtp:[relay.exiv.net]:587

[root@exiv ~]# postmap -q [email protected] /etc/postfix/transport
[root@exiv ~]#

 transportに登録した宛先では、対応する配送設定(smtp:[relay.exiv.net]:587)が表示されます。
transportに登録していない宛先では、何も表示されません。

 transportの登録内容を確認できたら、テストメールを送信します。
別の端末またはメールクライアントから、transportに登録した宛先と、登録していない宛先の2つへ同時にテストメールを送信します。

メールログを検証し、実際の配送経路の違いを確認します。

# tail /var/log/maillog
  :
(ログ抜粋)
  :
to=<[email protected]>, relay=gmail-smtp-in.l.google.com[142.251.169.26]:25, dsn=2.0.0, status=sent
to=<[email protected]>, relay=relay.exiv.net[xxx.xxx.xxx.xxx]:587, dsn=2.0.0, status=sent

transportに登録していない宛先は、従来どおりGmailのMXへ配送されています。一方、transportに登録した宛先は、relay.exiv.net:587経由で配送されています。
この結果から、transport設定により、特定の宛先のみがリレーサーバー経由で配送されていることが確認できました。

受信側でメールヘッダーを確認する

 送信元サーバー側のログで、transportに登録した宛先がリレーサーバー経由で配送されていることが確認できました。
 次に、受信側のメールヘッダーを検証し、SPF、DKIM、DMARCの認証結果と配送経路を確認します。
Gmailで受信したメールを開き、メニューから「原文を表示」を選択します。
下図のように、SPF、DKIM、DMARCがいずれもpassしていることが確認できます。

表示されたヘッダーで、Authentication-Results、Received、Return-Pathなどを確認します。

Received: from relay.exiv.net (relay.exiv.net. [xxx.xxx.xxx.xxx])
        by mx.google.com with ESMTPS ...
        for <[email protected]>
        (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256);

Received-SPF: pass
        (google.com: domain of [email protected] designates xxx.xxx.xxx.xxx as permitted sender)
        client-ip=xxx.xxx.xxx.xxx;

Authentication-Results: mx.google.com;
        dkim=pass [email protected] header.s=default;
        spf=pass [email protected];
        dmarc=pass header.from=exiv.net

Received: from mail.exiv.net (mail.exiv.net [xxx.xxx.xxx.xxx])
        by relay.exiv.net (Postfix) with ESMTPSA
        for <[email protected]>;

メールヘッダーでは、以下を確認します。

  • Received
     Gmail側の受信サーバーでは、relay.exiv.netからの配送として受け付けられています。
  • Received-SPF
     exiv.netのSPFレコードにより、リレーサーバーのIPアドレスが正当な送信元として扱われています。
  • Authentication-Results
     SPF、DKIM、DMARCはいずれもpassしています。
  • 下位のReceived
     mail.exiv.netからrelay.exiv.netへESMTPSAで送信されています。
     送信元サーバーからリレーサーバーへ、認証付きで配送されたことが分かります。

ここまでの検証で、transport設定により、特定の宛先だけをリレーサーバー経由で配送できていることが確認できました。

本番運用へ切り替える

transport設定による限定テストで、リレーサーバー経由の送信動作が確認できました。
本番運用では、送信元サーバー側のrelayhostを設定し、外部宛メールをリレーサーバー経由で配送するように切り替えます。
最初に限定テストで使用した設定を解除します。
transportファイルの最下行に追加した宛先指定を削除し、postmapを再実行してPostfixが参照するデータベースを更新します。

[root@exiv ~]# vi /etc/postfix/transport
※ 最下行、[email protected] smtp:[relay.exiv.net]:587 の記載を削除して保存します。

[root@exiv ~]# postmap /etc/postfix/transport

Postfix全体の外部宛配送先としてリレーサーバーを使用するようにrelayhostを設定します。
transport_mapsの指定も解除しておきます。

[root@exiv ~]# postconf -e 'relayhost = [relay.exiv.net]:587'
[root@exiv ~]# postconf -e 'transport_maps ='
[root@exiv ~]# postconf -e 'smtp_tls_security_level = encrypt'

設定内容に問題がないことを確認し、Postfixをリロードします。

[root@exiv ~]# postfix check
[root@exiv ~]# systemctl reload postfix

複数の外部宛先にテストメールを送信します。
メールログで配送先がrelay.exiv.net:587になっていることを確認します。

[root@exiv ~]# tail /var/log/maillog
  :
(ログ抜粋)
  :
to=<[email protected]>, relay=relay.exiv.net[xxx.xxx.xxx.xxx]:587, dsn=2.0.0, status=sent
to=<[email protected]>, relay=relay.exiv.net[xxx.xxx.xxx.xxx]:587, dsn=2.0.0, status=sent

ログ上で、外部宛メールがいずれもrelay.exiv.net:587経由で配送されていれば、本番切り替えは完了です。

リレーサーバー導入完了

これで、FCrDNS check failed対策としてのSMTPリレーサーバー導入は完了です。
なお、リレーサーバーの正式証明書への差し替えについては、ワイルドカード証明書の秘密鍵を安全に配布・共有する仕組みとして、別記事で整理します。

(おしまい)

コメント

タイトルとURLをコピーしました