designetwork

ネットワークを軸としたIT技術メモ

Postfix on EC2で独自ドメイン宛メールをAmazon SESでGmailに転送・統合する

独自ドメインのメールアドレスを開設する際に、メールボックスは既存の自身のGmailに統合したく、EC2公開サーバにPostfixを構築してAmazon SES経由で転送できるようにした。ドメイン認証など、期待する構成とするために各種設定が必要だった。

なお、AWSではオープンリレー対策のOP25B (Outbound Port 25 Blocking) が適用されているが、制限解除を申請すれば外部宛のSMTP(25)通信が可能となる。しかし、Amazon SESを使用することで、バウンスや苦情が多発した際にAWS側でサービス停止してくれたり、加害者になるリスクを軽減できると考えている。

※なりすまし、スパムメール対策等のセキュリティの観点を含むため、導入の際には十分に検証ください。設定誤り、考慮漏れ等がありましたら指摘コメントをお願いします。

環境

  • DNS:お名前.com
  • メールサーバ:Postfix 2.10.1-6 (Amazon Linux 2)
  • メール配信サービス:Amazon SES
  • 証明書:Let's Encrypt

基本的な設定はこちら参照 docs.aws.amazon.com

構成概要

構築する構成は以下の通り。設定は後述。

独自ドメイン宛 (受信)

独自ドメイン宛のメールはPostfix on EC2(Elastic IP付き)で受ける。バーチャルドメインとして設定し、SES経由でGmailのアドレスに送信する。

独自ドメイン発 (送信)

Gmail独自ドメインのメールアドレスを追加し、Gmailから送信する。受信と同様、Postfix→SES経由で外部へメール送信する。

Gmailへのメールアカウントの追加についてはこちら

support.google.com

「デフォルトの返信モードを選択: メールを受信したアドレスから返信する」にしておくと、返信時に自動的にメールアカウントを使い分けられる。(英語設定 When replying to a message: Reply from the same address the message was sent to)

主要設定

上記動作のための主要な設定はこちらの通り。他基本設定・認証・TLS暗号化・レートリミット等は記載を割愛しているため、PostfixAWSドキュメント等を参照。

# /etc/postfix/main.cf
myhostname = mail.daichi703n.com
myorigin = $mydomain

virtual_alias_domains = daichi703n.com
virtual_alias_maps = hash:/etc/postfix/virtual

smtpd_recipient_restrictions = permit_sasl_authenticated, reject_unauth_destination
smtpd_sasl_auth_enable = yes

header_checks = regexp:/etc/postfix/header_checks

sender_canonical_classes = envelope_sender,header_sender
sender_canonical_maps = regexp:/etc/postfix/canonical
local_header_rewrite_clients = static:all

バーチャルドメイン。必要なメールアドレスをGmailに転送。

# /etc/postfix/virtual
daichi703n.com anything
mx@daichi703n.com [private]@gmail.com
[host]@daichi703n.com [private]@gmail.com

SESではFromが認証済み(独自)ドメイン以外のメールは受け付けられない。canonicalFromを自ドメインに書き替えるため、FromReply-Toにコピーして保持する。元メールにReply-Toがある場合はX-Reply-Toとして退避しておく。(※Reply-Toにカンマ区切りで列記すべきなので要追加検討)

# /etc/postfix/header_checks
/^Reply-To: (.*)/ REPLACE X-Reply-To: $1

if !/^From: .*@daichi703n\.com$/
/^From: (.*)/ PREPEND Reply-To: $1
endif

外部から独自ドメイン宛メールのFrom・エンベロープFromを自ドメインに書き替える。自ドメイン からの送信は対象外。

# /etc/postfix/canonical
!/.*@daichi703n\.com/ mx@daichi703n.com

DNS設定

SPF, DKIM, DMARC認証のために以下のDNSレコードを登録している。パラメータは調整余地あり。

daichi703n.com.      300 IN  MX  10 mail.daichi703n.com.
daichi703n.com.     60  IN  TXT "v=spf1 include:daichi703n.com include:amazonses.com ~all"
mail.daichi703n.com.    300 IN  A   [Elastic IP]
mail.daichi703n.com.    300 IN  MX  10 feedback-smtp.ap-northeast-1.amazonses.com.
mail.daichi703n.com.    60  IN  TXT "v=spf1 include:amazonses.com ~all"
_dmarc.daichi703n.com.  60  IN  TXT "v=DMARC1;p=none;rua=mailto:[dmarc_report]@daichi703n.com;ruf=mailto:[dmarc_report]@daichi703n.com;rf=afrf;pct=100"

動作確認メール

Reply-To: [Name] <[yj-private]@yahoo.co.jp>
From: [Name] <mx@daichi703n.com>
X-Reply-To: [Name] <[yj-private]@yahoo.co.jp>
To: [host]@daichi703n.com
Reply-To: [Name] <[host]@daichi703n.com>
From: [Name] <[host]@daichi703n.com>
To: [Name] <[yj-private]@yahoo.co.jp>
Reply-To: [carrier-private]@h.vodafone.ne.jp
From: mx@daichi703n.com
To: [host]@daichi703n.com

ヘッダ参照方法わからず...。動作は期待通り。

認証情報

送信元 (mailed-by): mail.daichi703n.com
署名元 (signed-by): daichi703n.com
---
SPF: PASS (IP: 23.251.234.7)
DKIM: PASS (ドメイン: daichi703n.com)
DMARC: PASS

エラーログ

設定誤り時のPostfixのエラーログ

  • 送信:認証失敗 (reject_unauth_destination不足)
554 5.7.1 <[host]@daichi703n.com>: Recipient address rejected: Access denied
smtp-server: 554 5.7.1 <[host]@daichi703n.com>: Recipient address rejected: Access denied
  • 送信:認証なし外部リレー
454 4.7.1 <[private]@gmail.com>: Relay access denied
smtp-server: 454 4.7.1 <[private]@gmail.com>: Relay access denied
  • 受信:From (sender_canonical_classes, sender_canonical_maps)不備 header_checks で書き換えるだけではエラーになった。
postfix/smtp[16169]: 50DF387715F: to=<[private]@gmail.com>, orig_to=<[to]@daichi703n.com>, relay=email-smtp.ap-northeast-1.amazonaws.com[52.196.119.170]:587, delay=0.33, delays=0.07/0.02/0.13/0.11, dsn=5.0.0, status=bounced (host email-smtp.ap-northeast1.amazonaws.com[52.196.119.170] said: 554 Message rejected: Email address is not verified. The following identities failed the check in region AP-NORTHEAST-1: [carrier-private]@h.vodafone.ne.jp (in reply to end of DATA command))
postfix/cleanup[16168]: A146C877163: message-id=<20220115025742.A146C877163@mail.daichi703n.com>
postfix/bounce[16170]: 50DF387715F: sender non-delivery notification: A146C877163
postfix/qmgr[16157]: A146C877163: from=<>, size=2925, nrcpt=1 (queue active)
postfix/qmgr[16157]: 50DF387715F: removed
postfix/smtp[16169]: A146C877163: to=<[carrier-private]@h.vodafone.ne.jp>, relay=email-smtp.ap-northeast-1.amazonaws.com[52.196.119.170]:587, delay=0.15, delays=0/0/0.14/0, dsn=5.0.0, status=bounced (host email-smtp.ap-northeast-1.amazonaws.com[52.196.119.170] said: 501 Invalid MAIL FROM address provided (in reply to MAIL FROM command))
postfix/qmgr[16157]: A146C877163: removed

まとめ - Postfix on EC2で独自ドメイン宛メールをAmazon SESでGmailに転送する

EC2公開サーバにPostfixを構築してAmazon SES経由で転送できるようにした。ドメイン認証など、期待する構成とするために各種設定が必要だった。 記事中の設定により、独自ドメイン宛のメールを個人Gmailに統合することができた。