hnwの日記

独自ドメインGmailのメール紛失事件をCloudflare Email Routingで解決した話

この記事は、KLab Engineer Advent Calendar 2024 の25日目の記事です。

はじめに

独自ドメインを長年維持している方々の多くは、現在もGoogle Workspace(旧G Suite無償版)を利用しているのではないでしょうか。筆者もその一人です。独自ドメインのメールを送受信でき、Gmailの便利な機能を無償で利用できるのは本当にありがたいですね。

そんなわけで長年独自ドメインのメールを運用してきたわけですが、最近になって一部のメールが届かないトラブルに見舞われました。その解決策としてCloudflare Email Routingを導入したところ、あっさり問題が解決しました。本記事では、その設定手順および得た知見を紹介します。

メール紛失事件について

今回の取り組みのきっかけになった「メール紛失事件」について説明します。ここ6ヶ月ほど、au IDの二段階認証メールが筆者所有の独自ドメインのメールアドレスに届かない問題が起きていました。この独自ドメインのメールアドレスはGoogle Workspaceで管理しており、このメール以外は特にトラブルなく利用できています。

まずauのサポートに問い合わせましたが、同様の事例報告はないそうで、auサポートでは解決できませんでした。次に、Googleに問い合わせようとしましたが、無償ユーザーのため正式なサポートに頼ることができません。また、Google Workspace管理コンソールの「メールログの検索」も無償ユーザーでは利用できませんでした1。

他サービスからのメールは問題なく届いているため、auが行儀の悪いメールを送っているか、Googleがエラーメール扱いにする条件が厳しすぎるか、どちらかが原因と考えられます。いずれにせよ旧G Suite無償版ではトラブル時の打ち手が少なく、リスクのある環境であることを再認識しました。

やったことの概要

上記の問題を解決するため、Google Workspaceの前段にCloudflare Email Routingを入れることにしました。Cloudflare Email Routingを利用して、問題が起きているメールだけをYahoo! メールなど別サービスに転送すれば問題が解決するのではないか?と考えたためです。

図1:Cloudflare Email Routing導入の概要

手順は以下の通りです。説明上、Google Workspaceで管理しているメールアドレスを[email protected]とします。

  1. ユーザーエイリアスドメインの設定 Google Workspaceの「ユーザーエイリアスドメイン」を利用し、サブドメインのメールアドレスでもメールを受信できるように設定します([email protected])。

  2. Cloudflare Email Routingの導入 元のアドレス宛のメールをCloudflare Email Routingで受信し、サブドメインのアドレスに転送する構成にします。

この方法だと元のGoogle Workspaceのフィルタ設定をそのまま利用可能ですから、他の方法に比べて移行の手間が少なく、万一事故があっても元に戻しやすいという利点があります。

旧G Suite無償版とは

詳細の説明に入る前に、旧G Suite無償版について説明します。

Googleのサービス(Gmail・Google カレンダー・Google Driveなど)を独自ドメインで組織メンバー向けに提供するサービスがGoogle Workspace ですが、以前はG Suite(さらに以前はGoogle Apps)と呼ばれていました。

これが大昔(2012年以前)は10人以下の組織であれば無料で使えるという大盤振る舞いをしていました。当時個人でドメインを所有していた人は全員利用していたように思います(筆者の周りでは本当にそんな印象でした)。2012年に無償版の新規提供は終了しましたが、それ以前からの契約者は引き続き無償提供されています。

2022年にGoogleが「無償版やめるんでお金払うか引っ越して」と言い出したものの、しばらくして「やめるのやめます」となり、移行せずモタモタしていた人(筆者を含む)は再び救われたような経緯があります。

若い人には信じられないような話だと思いますが、古参の人が独自ドメインのメールアドレスを維持できているのはそんなカラクリがあるのです。本当にありがたいことです。

Cloudflare Email Routingとは

Cloudflare Email Routing についても紹介します。

CloudflareはCDNの会社として有名ですが、独自ドメインを維持している人にとっては無償でDNSを提供してくれる会社でもあります。それ以外にも様々なサービスを提供しています。

Cloudflare Email Routingはメールの転送サービスです。1ドメインあたり最大200個の宛先・転送先を管理でき、キャッチオールアドレス(未定義のアドレス全部を受け取るアドレス)も提供しています。大盤振る舞いなことに、利用料金は無料です。

図2:メールの転送状況が可視化されている

図2のように管理画面からメールの転送状況を確認できるのも便利ですね。

設定1:ユーザーエイリアスドメインの設定

まずはGoogle Workspaceでユーザーエイリアスドメインを設定する手順を説明します。ユーザーエイリアスドメインを設定することで、サブドメインのメールアドレスでもメールを受信できるようになります。例えば、[email protected]というアドレスでメールを受信することが可能になります。

手順

  1. Google Workspace管理コンソールにログイン 管理者アカウントでGoogle Workspaceの管理コンソール にログインします。

  2. ドメインの追加 「アカウント」「ドメイン」「ドメインの管理」ページに移動し、「ドメインをを追加」を選択します。ドメイン名を入力し(例:ws.example.com)、「ユーザーエイリアスドメイン」チェックボックスを選択して「ドメインを追加して所有権を証明」ボタンを押します。

  3. ドメインの所有権の確認 ページ内の指示に従ってドメインのDNS設定でTXTフィールドを追加して「確認」ボタンを押します。

  4. ユーザーエイリアスドメインの有効化 「自社ドメインで Gmail の使用を開始する」ボタンを押し、ページ内の指示に従ってMXレコードを設定します。完了後に「確認」ボタンを押すと設定完了です。

  5. メール送信テスト 設定が反映されたか確認するために、サブドメインのメールアドレスにテストメールを送信します。

設定2:Cloudflare Email Routingの導入

次に、Cloudflare Email Routingを導入する方法を説明します。Cloudflare Email Routingを利用することで、独自ドメインのメールを受信し、指定したアドレスに転送することができます。

注意点ですが、対象ドメインのDNS管理にCloudflareを利用していることがEmail Routing利用の前提になります。他社でDNS管理している場合は利用できません。

手順

  1. Cloudflare管理コンソールにログイン Cloudflareの管理コンソールにログインし、ドメイン管理画面に移動します。

  2. 転送ルールの設定 「Email」「Email Routing」ページに移動し、「Routing Rules」タブで転送アドレスの設定を行います。例えば、[email protected] 宛のメールを [email protected] に転送する設定を行います。

  3. 転送先アドレスの確認 転送先として設定したメールアドレスに確認メールが届くので、メールの「Verify email address」ボタンを押します。

  4. Email Routingの有効化 「Overview」タブから「Enable Email Routing」リンクをクリックします。これによりMXレコードが書き換わり、メール転送が開始されます。

  5. メール送信テスト 設定が反映されたか確認するために、テストメールを送信します。メールが正しく転送されることを確認します。

結果:何もしていないのに問題が解決した

上記の設定を行ったところ、それだけでau IDの二段階認証メールがGoogle Workspaceで受け取れるようになりました。

仮に元のメールに何かしら問題があるとすれば、Cloudflare Email Routingを経由したところで問題は変わらないはずですから2、受け取れるようになったのは全く予想外です。

状況が改善したのでいったんは様子見になりますが、メール紛失事件が再発する可能性も否定できません。もしそうなったら改めて対処したいと思います。

今回得られた知見

知見1:ユーザーエイリアスドメインに「gmail」は使えない

Google Workspaceのユーザーエイリアスドメインとして「gmail.example.com」のようなドメインは指定できません。指定しようとすると「無効なドメインです」と怒られますが、なぜ怒られるのかしばらく理解できませんでした。

フィッシング目的で紛らわしいURLを作られないように、という配慮なんでしょうね。

知見2:サービスごとに登録メールアドレスを変えておくと便利

サービスごとに異なるメールアドレスを使用するのは一般的に良いテクニックですが、Cloudflare Email Routingを使う場合は特に有用です。今回のように一部の送信者からのメールだけトラブルがあるような場合に、特定のメールだけ転送先を変えることができます。

知見3:GmailはRFC違反のMessage-IDを書き換える

今回、Google Workspaceで受け取ったメールを別のアカウントに転送しようとしたところ、一部メールがDMARCエラーになりCloudflareが受け取ってくれないことがわかりました。今回の場合、1回目は同じメールを正常として受け取っているはずなので、少々不思議と言えば不思議です。

図3:Gmailからのメール転送時に発生したトラブル

図4:転送時にCloudflare Email Routingで出たエラー

調べたところ、GmailはMessage-IDがRFC違反のメールを受け取るとMessage-IDを書き換えるそうです。一方で、DKIMの署名検証はメールヘッダも対象なので、ヘッダを書き換えたメールが転送されて署名検証で失敗してしまうということなのでしょう3。

RFC違反のメールを送るのが悪いのかGmailがメッセージIDを書き換えてしまうのがやり過ぎなのかCloudflareの実装が悪いのか筆者の知識では判断できませんが、挙動がわかっていれば対処もできるので良しとしましょう。今回の場合は転送先をGoogle Workspaceのサブドメイン宛にすることで転送時もエラーが起きなくなりました。

ちなみに、私が受け取っているメールの中でこのような挙動になるのは「【au ID】2段階認証確認コード通知」「【au PAY】ご利用のお知らせ」などauからのメールの一部のみです。これらのメールのメッセージIDは012.345.678.JavaMail.spluser@c1hsm01aのような形式なのですが、RFCの定義では<と>で囲まれている必要があるようです。

まとめ

  • æ—§G Suite無償版でメール受信トラブルがあった場合、Cloudflare Email Routingを前段に入れる選択肢がある
    • エラーログを確認できる
    • 問題のあるメールだけ転送先を変更できる
    • (記事中では触れませんでしたが)Email Workers で複雑な処理をすることもできる
  • au IDの二段階認証メールのMessage-IDはRFC違反
    • トラブルの原因になりうる
    • 今回の問題の直接の原因とまでは言い切れないが、少なくとも遠因ではありそう

  1. 有償ユーザーであればログからエラー内容が確認できるはずで、もう少し手がかりが得られるはずです。
  2. 転送することで送信元IPアドレスが変わってSPFチェックでsoftfailするので、むしろ状況が悪化しても不思議はありません。
  3. GmailもCloudflare Email RoutingもARC (Authenticated Received Chain) をサポートしており、本来ならこのような事故を防げるはずだと思うのですが、どうにも謎です。
'); $entries_chunk.insertBefore(sections[0]); } else { chunk_id += 1; var $prev_entries_chunk = $entries_chunk; var $read_more_link = $('

これ以前の記事を表示する

'); $read_more_link.on('click', {chunk_id: chunk_id}, function(e){ $(e.target).hide(); $(this).remove(); $('#entries-chunk-' + e.data.chunk_id).fadeIn("slow"); }); $prev_entries_chunk.append($read_more_link); var $entries_chunk = $('
'); $entries_chunk.hide(); $entries_chunk.insertAfter($prev_entries_chunk); } } $(sections[i]).appendTo($entries_chunk); } });