前回は、リレーサーバー側で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.dbtransport設定
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 = maymain.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=senttransportに登録していない宛先は、従来どおり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/transportPostfix全体の外部宛配送先としてリレーサーバーを使用するように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リレーサーバー導入は完了です。
なお、リレーサーバーの正式証明書への差し替えについては、ワイルドカード証明書の秘密鍵を安全に配布・共有する仕組みとして、別記事で整理します。
(おしまい)


コメント