SPFメール認証DNS

SPF include 10 個制限の超過対処|3 つの解決策

ドメイン番人6 分で読めます
目次

この記事でわかること

  • SPF の「DNS ルックアップ 10 個制限」が存在する理由(RFC 7208)
  • 制限を超えると起きること(Permerror → SPF=fail 扱い)
  • 3 つの解決策(Flattening / サブドメイン分離 / 不要 include 削除)の比較
  • 自社にどの解決策が向いているかの判断基準

なぜ「10 個制限」があるのか

SPF の仕様(RFC 7208 Section 4.6.4)は、SPF レコードの評価中に発生する DNS ルックアップ回数を 10 個まで に制限しています。

理由はシンプルで、include:redirect= を無制限にネストできてしまうと、1 通のメール検証のために DNS リゾルバが大量のクエリを撃つことになり、メール受信側の負荷が上がる からです。攻撃者が悪意ある SPF を仕掛けて DoS の踏み台にする懸念もあります。

カウント対象は include / a / mx / ptr / exists / redirect の 6 種類。ip4: / ip6: / all は DNS ルックアップが不要なのでカウントされません。

SPF ルックアップ 10 個のカウント対象

制限を超えると何が起きるか

10 個を超えた SPF レコードは、受信側で SPF=permerror(永続的なエラー)として処理されます。fail ではなく permerror 扱いになるのが厄介な点で、DMARC のアラインメント評価でも「SPF が pass しなかった」として扱われ、DMARC ポリシーが quarantine / reject なら メールが届かなくなります。lookup 超過以外にも PermError を引き起こす原因はあるため、全体像はSPF が PermError になる5つの原因で整理しています。

典型的な発症パターン:

  • Google Workspace(_spf.google.com)+ Microsoft 365(spf.protection.outlook.com)+ Salesforce + Mailchimp + Sendgrid と include を積んだら 10 個を超えた
  • 親会社の SPF を継承するために include:parent-group.example.com を 1 つ追加した瞬間に超過
  • include 先の SaaS 側が内部で include をネストしており、自社では include 1 個でも実際は 3〜4 個カウントされていた

「先週まで届いていたのに、今週から取引先に届かない」現象の典型的な犯人がこの 10 個超過です。

なお、include のネスト構造がどう数えられるかは SPF include のネストとは で詳しく解説しています。

解決策 1: 不要 include の削除(最優先で検討)

最も安全で副作用がない解決策は「もう使っていない SaaS の include を削除する」ことです。

3 つの解決策の比較

実務で SPF が肥大化する原因の多くは、過去に試して解約した SaaS の include が残りっぱなしになっているケース。Web 担当者が DNS 編集権限を持っていない組織だと、SaaS 解約時に SPF を整理し忘れたまま放置されがちです。

棚卸し手順:

  1. 現在の SPF を dig TXT example.com で取得
  2. include: ホスト名から SaaS を特定(_spf.google.com → Google Workspace、spf.protection.outlook.com → Microsoft 365、など)
  3. 過去 90 日以内にそこから実際にメールを送っているか を Authentication-Results 等で確認
  4. 送っていない SaaS の include を削除

「過去 90 日送信ゼロ」が確認できた include は遠慮なく外して構いません。唯一の副作用は「あとでその SaaS を再契約したら SPF を戻し忘れる」だけで、ドキュメント化しておけば回避できます。

解決策 2: サブドメインへ送信元を分離

メインドメイン(example.com)と、送信専用サブドメイン(mail.example.com / news.example.com)で SPF レコードを別々に持たせる構成です。

  • example.com → 主に取引メール用(Google Workspace / Microsoft 365 のみ include)
  • mail.example.com → トランザクションメール用(Sendgrid / Postmark など)
  • news.example.com → マーケティング配信用(Mailchimp / HubSpot など)

それぞれのサブドメインで SPF を「10 個に収まる範囲」に独立して設計できるため、最も将来性のある解決策です。

ただし送信元アドレスを noreply@news.example.com のようにサブドメインに切り替える必要があるため、実装難度は高めです。差出人ブランドの統一感が崩れる懸念もあるので、リブランディングのタイミングで導入するのが現実的でしょう。

DMARC との関係性は DMARC ポリシー段階強化ガイド で関連解説をしています。

解決策 3: SPF Flattening(フラッタニング)

Flattening は、include で参照している SaaS の IP アドレスリストを手元で展開して ip4: / ip6: で直書きする手法です。

例:

Before: v=spf1 include:_spf.google.com -all
After:  v=spf1 ip4:35.190.247.0/24 ip4:64.233.160.0/19 ... -all

ip4: / ip6: は DNS ルックアップを伴わないので、ルックアップ数を一気に 0 に圧縮できます。

ただし最大の欠点は「include 先の SaaS が IP を追加・変更すると、自社の SPF が古くなって SPF=fail になる」こと。Google Workspace や Microsoft 365 の送信 IP は不定期に変わるため、手動で Flattening した SPF は数ヶ月で破綻するリスクがあります。

実務的な選択肢:

  • 専用ツール(PowerDMARC / EasyDMARC / DMARCian の SPF Flattening 機能など)で自動更新する
  • マネージド SPF サービス(年額数万円〜数十万円)で IP 更新を任せる
  • 自前運用は「定期的に再展開する CI ジョブ」を組まないと事故る

Flattening の具体手順は SPF Flattening とは に詳しくまとめているので、採用するならそちらを必ず読んでから取り組んでください。

3 つの解決策の選び方

状況 おすすめ
SaaS 解約後の include が残っている まず解決策 1(削除)で 1〜2 個落とせるか確認
取引メールと配信メールを分けたい 解決策 2(サブドメイン分離)が長期的に有利
すぐ実効的に lookup を 0 に近づけたい 解決策 3(Flattening)を専用ツール経由で
上記をどう判断すべきか迷う 棚卸しを先にやってから次の手を決める

特に解決策 3 を「自前手動」で導入するのは強く非推奨です。SaaS 側の IP 変更を追従できず、半年後にメールが届かなくなる事故を毎月のように見かけます。

設定後の検証は SPF/DKIM/DMARC の確認方法 を参照してください。

まずは現状を把握しましょう

ドメイン番人の 無料ドメイン診断 で、SPF のルックアップ数と現在の状態を 30 秒でチェックできます。「10 個に対して残り何個か」を診断結果で確認できます。

SPF Flattening の導入支援、棚卸し代行、サブドメイン分離設計などは お問い合わせ からどうぞ。

関連記事: SPF Flattening とは / SPF include のネスト解説 / SPF/DKIM/DMARC の確認方法

次の一歩は無料診断から。