技術4課の前田です。 お客様環境で稼働しているECS on Fargateにおいて、メール送信ができない事象に遭遇しました。 事象にはAWSが設けているメール送信制限が関わっていたため、ブログにさせていただきました。
結論
- ECS on Fargateにもメール送信制限は適用される。
- 宛先IPがRFC 1918で定義されているIPアドレス範囲外の場合にメール送信制限が適用される。
- 過去(弊社にて観測される限り2022年8月時点では)、ECS on Fargateに対する制限解除申請は許可されていなかったが、現在は許可されている。
事象について
下記が今回発生した事象の特徴です。
- ECS on Fargateから、Transit Gatewayを経由して別VPCに存在するメール送信サーバにメールを送信したいが、送信することが出来ない。
- セキュリティグループ、ルートテーブルなどのネットワーク設定やアプリケーション設定に問題はない。
図で表すと下記のようになります。(具体的なIPアドレスは伏せるためX.X.X.Xと表記しております。)
ネットワークもアプリケーションも問題ないということで、「メール送信制限がECS on Fargateにも適用されるんじゃないか」という話になりました。
メール送信制限とは
EC2とLambdaにおいて、デフォルトではport25のアウトバウンド通信ができないようにAWSから制限が設けられています。 これは、AWSアカウント内のサーバーが知らない間にスパムメールの送信者にされそうになったとき、AWS内のサーバを守るためです。
一般的にOP25B(Outbound port 25 Blocking)と呼称されている仕組みで、他のクラウド事業者やInternet Service Providerでも導入されています。
AWSにおける制限の仕様については、Amazon EC2 の Service Quotas - Amazon Elastic Compute Cloudに記載されています。
すべてのインスタンスで、Amazon EC2 はデフォルトでポート 25 を介したパブリック IP アドレスへのアウトバウンドトラフィックを制限します。
(中略)
この制限は、ポート 25 経由で次の宛先に送信されるアウトバウンドトラフィックには適用されません。
・発信元のネットワークインターフェイスが存在する VPC のプライマリ CIDR ブロック内の IP アドレス。
・RFC 1918、RFC 6598、および RFC 4193 で定義されている CIDR 内の IP アドレス。
公式ドキュメントではECS on Fargateに制限が設けられている旨は記載されていなかったので、AWSに問い合わせました。
制限はECS on Fargateにも適用されるのか?
AWS側からは下記の回答が返ってきました。
- ECS on Fargateもメール送信制限の対象になる。
- EC2と同様に、接続先がプライベートIPアドレスでもRFC 1918で定義されているIPアドレス範囲外(※1)である場合はメール送信制限の対象になる。
- 過去、Fargateに対する制限解除申請は許可されていなかった(※2)が、現在は許可している。
※1…メール送信サーバのプライベートIPはRFC 1918定義外のIPだったため、条件に該当していました。
※2弊社のメール送信制限解除申請の形跡を見る限り、2022年8月時点までは許可されていませんでした。
上記の回答を受け、ECS on Fargateのメール送信制限解除申請を実施したところ、メール送信出来るようになりました!
これで一件落着…なのですが、ブログにする以上エビデンスは載せたいということで、次の章からは実際に動作検証をしてみようと思います。
動作検証
今回検証に使用する環境が下記になります。事象に似たような環境 + αを用意しています。
今回は下記の2パターンに分けて検証します。
尚、この検証では実際にメール送信は実施せず、ポート番号25を指定してメール送信サーバにリクエスト送信することのみ実施します。(以降、port25通信と呼称します。)
パターン | 検証内容 |
---|---|
A | 送信元VPCに存在するECS on Fargateからメール送信サーバAに対してport25通信できること。 |
B | 送信元VPCに存在するECS on Fargateからメール送信サーバBに対してport25通信できないこと。メール送信制限解除後は通信できること。 |
パターンAについて
EC2の場合、下記のRFC 1918で定義されているIPアドレス範囲内に対するport25通信は制限解除せずに通信可能です。
ECS on Fargateも同様であれば、「172.16.0.4」を割り振っているメール送信サーバAへのport25通信は成功するはずです。
10.0.0.0 - 10.255.255.255 (10/8 prefix) 172.16.0.0 - 172.31.255.255 (172.16/12 prefix) 192.168.0.0 - 192.168.255.255 (192.168/16 prefix)
メール送信サーバAの設定について
メール送信サーバAは下記のように設定しています。localhost以外からのport25通信をリッスンする必要があるため、postfixの設定において「inet_interfaces = all」を設定しています。
パターンBについて
RFC 1918定義外のIP「128.0.0.4」を割り振っているメール送信サーバBへのport25通信が失敗することを確認します。次にメール送信制限解除をAWSに申請し、制限解除後はport25通信が成功することを確認します。
メール送信サーバBの設定について
対照実験的に検証を実施するため、メール送信サーバAと同様の設定を施しています。
パターンAの結果
ECS Execで接続しているFargateから、port25通信を試みます。予想通り、通信出来ました!
パターンBの結果
port25通信は出来ませんでした!無事に(?)制限に抵触したようです!
メール送信制限解除申請を送ってみます。承認されるでしょうか…。
承認されました!(回答文は一部しか載せていません)
改めてメール送信サーバBへport25通信を試みると…通信出来ました!このことから、現在はECS on Fargateにもメール送信制限解除が許可されていることが確認できました。
結論(再掲)
冒頭に記載した結論を再掲します。
- ECS on Fargateにもメール送信制限は適用される。
- 宛先IPがRFC 1918で定義されているIPアドレス範囲外の場合にメール送信制限が適用される。
- 過去(弊社にて観測される限り2022年8月時点では)、ECS on Fargateに対する制限解除申請は許可されていなかったが、現在は許可されている。
感想
今回は比較的しっかりと検証してみました!どなたかの一助になれば幸いです!