それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

Cloudflare Email ルーティングで受信25ポートを弾幕防御する。

Cloudflare Email ルーティング

cloudflare の Email ルーティングを入れた。

CloudflareのEmailルーティングは、Cloudflareに登録したドメイン宛のメールを任意のメアドに転送してくれるサービス。正直言って使い所がいまいち分からない機能だ。

別になくてもいいじゃん。と思ったのですが、弾幕防御にとても便利なのでは?と気づいたので運用することにした。

設定した。

受信ポート25公開せずに済む。

SMTPを運用したらわかるが、受信25には大量のスパム送信の試行が、それもものすごい量やってくる。それをCloudflareが弾幕防御して被弾代理してくれる。

これが実にありがたい。

Email ルーティング送信元

Cloudflare のEmailルーティングは、特定のIPアドレスだけから配送される。 そのため、受け取る側で、fail2ban を指定しておけば、受信25番ポートを無闇矢鱈に世界に晒す必要がない。

送信元 IP範囲

Cloudflareは「登録したメールアドレス」へ転送するIPアドレスを公開しています。 https://developers.cloudflare.com/email-routing/postmaster/

v4 アドレス範囲。

104.30.0.0/20

v6 は

2405:8100:c000::/38

フォワードされたメールは必ず、上記のIPアドレスからメールが送信される。 これなら、安心してフォワード設定先に自宅サーバーを指定ができそうですよね。

そうなんですね。Cloudflareのメール配送機能は、Cloudflareらしく弾幕防御のためだったんですね。IPアドレス範囲を公開しているということは、そういう意図ですよね。 最初全然気づかなかったよ。

fail2banに設定した。

mailcow の fail2ban と Firewall の 許可リストに追加した。

これが、今回の設定のキモです。受信メール・サーバを運用しなくて済むし、自宅に設置したメールボックス(mailcow/postfix)へ転送する用に指定しておけば、自宅サーバーでもメール運用を気軽に行うことができるです。しかも受信25ポートへの攻撃を意識しなくて済む上に、無駄なリソースを浪費しなくて良い。fail2banで防げるとは言え、攻撃パケットがPostfixまで届くのは嫌だ。望ましくない。CPUリソースの電気の無駄遣いだ。なのでCloudflareにある程度防いでもらった上で、GCPで受け取る側を構成しておこう。そうすれば自宅のルータは静かでいい。

IP指定で相当安全

WEBサイトをCloudflareのCDNでオリジンIPを隠蔽できるように、メールの25番も具体的な接続先を隠蔽することができる。

受信25番ポートは常に何かが設定ミスやゼロデイを調査士に接続に来るので精神衛生上良くない。自宅サーバーで運用しているとほんとうに気持ち悪い。なのでCDNであるCloudflareで一旦受けてておいて、必要なメールだけ自宅サーバーのmailcowに転送すると負担が楽。

Cloudflareは受信だけなので送信SMTPもあれば良いんだけどなぁ・・・

初期登録だけは注意

メールアドレスの初期登録の確認メールは、sparkpostから送信される。

sparkpost はメール送信に特化したサービスなので、、、IPアドレスで絞り込むのが困難だ。 なぜなら、sparkpost の送信アドレスは、SPF用に利用者がログインして使う想定なのでCloudflareが使ってる範囲がわからないのだ。 しかもsparkpostさんはAWSで動的に運用されてるらしくて、IP範囲は想像がつかない。

なので、宛先アドレス登録の確認メールは、fail2banがあるとうまく動作しないので注意。

https://community.cloudflare.com/t/email-routing-verification-email-not-being-delivered/350135

正規表現が使えない。

CloudflareのEmailルーティングは、「正規表現に非対応」です。ですからキャッチオールでまとめて受け取る必要がある。

そこが非常に欠点。カスタム・アドレスに正規表現を使えるようにしてくれると、メインで使える素晴らしい機能になると思う。リクエストのスレッドなども上がっていて他の類似サービスではできるからCloudflareでもやってほしいとかコメントされてるが、Cloudflareは、そこまでの余裕はなさそう。なので自分のPostfixで配送する必要がある。

残念ながら正規表現による振り分けは、EC2/VPS/自宅サーバーのDovecot+SeviveとPostfixのヘッダチェックで運用することになりました。

参考資料

https://community.cloudflare.com/t/wildcard-regex-matching-with-cloudflare-email-routing/331050