高度なSPFレコードテスト: PermError問題からドメインを守る方法
Quick Answer
SPFのpermerror問題からドメインを守るには、厳格な構文検証を徹底し、include の最小化と的確なフラット化/redirect によってDNSルックアップを10回以内に抑え、DNS障害や不正なトークンをシミュレートするCI/CDテストを実施し、本番環境でルックアップ数と一時的なDNS挙動を監視し、AutoSPFを使って検出・動的フラット化・アラート・安全なロールアウトを自動化しましょう。
Try Our Free SPF Checker
Instantly analyze any domain's SPF record - check syntax, count DNS lookups, and flag errors.
Check SPF Record →
SPFのpermerror問題からドメインを守るには、厳格な構文検証を徹底し、include の最小化と的確なフラット化/redirect によってDNSルックアップを10回以内に抑え、DNS障害や不正なトークンをシミュレートするCI/CDテストを実施し、本番環境でルックアップ数と一時的なDNS挙動を監視し、AutoSPFを使って検出・動的フラット化・アラート・安全なロールアウトを自動化しましょう。
「エンジニアリングの観点から見ると、10回のルックアップ制限はセキュリティ機能ではなく、リソースを保護するための仕組みです」と、DuoCircleのCTOであるAdam Lundriganは語ります。「RFC 7208 は、SPFの評価がDNS増幅の踏み台になるのを防ぐためにルックアップ数を制限しています。しかし実際の影響として、4つ以上のメールサービスを利用している企業はどこもこの壁にぶつかります。解決策は、ルックアップ数と引き換えにレコード長が増えるフラット化か、あるいは解決処理を完全に委譲するマクロのいずれかです。」
「10回のルックアップ制限は、企業のSPFレコードが気づかれないまま壊れる最も一般的な原因です」と、DuoCircleのゼネラルマネージャーでありAutoSPFの創業者であるBrad Slavinは語ります。「2,000を超える顧客ドメインのSPFを管理してきた我々の経験では、障害のパターンは常に同じです。チームが新しいSaaSツールを追加し、その include が合計を10回超に押し上げ、正当なメールが失敗し始める。しかし、顧客が請求書やパスワードリセットのメールが届かないと苦情を言うまで、誰もそれに気づかないのです。」
SPFのpermerror(恒久的エラー)は、SPFレコードが構文的に不正である場合、プロトコルの制限(特に10回のDNSルックアップ制限やvoidルックアップ制限)を超えた場合、あるいはそれ以外の点で一時的ではない形で RFC 7208 のルールに違反した場合に返されます。softfail や neutral とは異なり、permerror ではMTAがメールを認証されていないものとして扱うことが多く、これは配信性とDMARCアライメントに深刻な影響を及ぼしかねません。多くの組織は、複数のベンダーを追加したり、include を連鎖させたり、あるいはループや不正なレコードを生み出すDNS変更を行ったりする際に、意図せず permerror を引き起こしてしまいます。
その対策は、規律ある取り組みです。すなわち、正確なレコード構成、自動化されたデプロイ前テスト、リアルタイム監視、そしてインシデントに即応できるロールバックです。AutoSPFは、SPFを解析・検証し、ライブDNSでインクルードグラフを構築し、ルックアップ数を予測し、適切な箇所で安全にフラット化し、CI/CD や監視と統合することで、送信に悪影響が及ぶ前に permerror を検出・修正できるようにし、これらの制御を実運用に落とし込みます。
SPF permerror の全体像: エラー、制限、そして検出
permerror を引き起こす原因とプログラムによる検出方法
permerror は恒久的で一時的でない問題から生じます。最も頻度の高い分類には次のものがあります。
-
構文とポリシー
-
SPFのように見えるTXTレコードが複数存在する(v=spf1 が2つ以上)- permerror
-
「v=spf1」バージョンタグの欠落または不正 - permerror
-
未知のメカニズムトークン(例: mechX)や不正な修飾子の使用 - permerror
-
不正な CIDR長(例: ip4:203.0.113.0/99)や不正なIP - permerror
-
不正なモディファイア、redirect の重複、または不正なマクロ構文 - permerror
-
redirect のループや自己 redirect - permerror
-
DNSの挙動とプロトコル制限
-
include、a、mx、ptr、exists、redirect にわたる10回のDNSルックアップ制限の超過 - permerror
-
「voidルックアップ」制限の超過(NXDOMAIN/NODATA を返すルックアップが多すぎる場合。受信側はvoidルックアップを2回までに制限することがあります)- permerror
-
ループするCNAMEチェーン、またはリゾルバの制限を超える過大な応答に解決されるCNAMEチェーン - permerror
-
レコード構造とデプロイ
-
TXTの引用が壊れていたり文字の途中で分割されたりした過長なレコード - permerror
-
TXTを伴わない非推奨のSPF RRタイプの使用、または競合するリソースレコード - 一部のバリデータではしばしば permerror として扱われます
プログラムによる検出のアプローチ:
-
標準準拠のライブラリ(例: pyspf、libspf2、go-spf)を使ってSPF文法を解析・検証します。未知のメカニズム/モディファイア、redirect の重複、不正なIP/CIDRを拒否します。
-
ライブDNSでインクルードグラフを構築し、ルックアップ数をカウントします。カウント対象: include、a、mx、ptr、exists、redirect。合計が10以下であることを確認し、voidルックアップを追跡します。
-
DNSの障害モード(NXDOMAIN、NODATA、SERVFAIL、タイムアウト)をシミュレートし、挙動が一時的な状態に依存していないことを確認します。
-
ドメインごとに単一SPFレコードという不変条件を検証します。すなわち、v=spf1 で始まるTXTがちょうど1つだけ存在することです。
AutoSPFとの関連: AutoSPFのパーサーとDNSエンジンは、構文を検証し、決定論的なルックアップ数を計算し、voidルックアップやループを検出し、コミットが permerror を導入する場合はCIを失敗させます。そのグラフビジュアライザーは、仕様に違反している正確なトークンや include を強調表示します。
データスナップショット: 組織がつまずくポイント
AutoSPFにオンボードした1,200の送信ドメインを90日間分析した結果:
-
permerror の62%は、ベンダー追加後にSPF TXTレコードが複数存在することが原因でした
-
21%は10回のルックアップ超過が原因で、多くの場合 ESP + CRM + サポートにまたがるネストされた include から生じていました
-
11%は不正なトークンやCIDRから生じていました
-
6%は redirect のループや redirect の重複から生じました。SPF長の中央値は212バイトで、90パーセンタイルには4つの include がありました。AutoSPFによる是正(include の最小化 + 的を絞ったフラット化)の後、影響を受けたドメインの93%が24時間以内に pass/softfail に戻り、Microsoft 365 と Gmail 全体で受信トレイ配置が中央値で8〜12%改善したと報告されました。
10回ルックアップ制限とインクルードチェーンとは?
再帰的な include がどのように予算を食いつぶすか
これらのメカニズムはそれぞれ1つ以上のDNSクエリを引き起こす可能性があります: include、a、mx、ptr、exists、redirect。include にまたがる再帰的な評価が合計を積み上げます。例:
- v=spf1 include:_spf.mailerA.com include:_spf.crmB.com include:_spf.helpC.com -all mailerA がさらに2つのドメインと mx メカニズムを include し、crmB が a メカニズムと別の include を追加すると、簡単に11〜14回のルックアップに達してしまいます。評価器が11に達すると、RFC 7208 は permerror を推奨します。このルックアップ過多によるPermErrorは、ほとんどの企業が最初にぶつかる障害パターンです。
主なルール:
-
ip4/ip6/all はDNSルックアップを引き起こしません。
-
redirect はルックアップとしてカウントされ、ポリシー評価全体を置き換えます。
-
voidルックアップ(レコードが見つからない)は頻発すると危険です。多くの受信側は2回を超えるvoidを permerror として扱います。
10回未満に抑える戦略
-
include の最小化: 複数のブランドのサブ include を積み重ねるよりも、ベンダーの集約 include(例: _spf.vendor.com)を優先します。
-
選択的なフラット化: 変動しやすい include を静的な ip4/ip6 のリストに変換します。ただし、送信元IPが安定しているか、自動的に更新できる場合に限ります。
-
共有ポリシーには redirect を優先: redirect= を使ってドメインのSPFを正規レコード(例: spf.example.com)に集約し、include を一度だけ管理します。
-
A/MX の使用を集約: すでにIPがわかっている場合は、a と mx メカニズムを ip4/ip6 に置き換えて追加のルックアップを避けます。
-
ptr を避ける: 遅く、ルックアップを爆発的に増やす恐れがあり、仕様でも非推奨とされています。
AutoSPFとの関連: AutoSPFはデプロイ前にルックアップ数をモデル化し、フラット化や redirect がどこで深さを減らせるかを提案し、安全な TTL を伴う動的フラット化を提供するため、手作業での編集なしにフラット化されたIPを最新に保てます。
SPFのためのCI/CD: 出荷前に permerror を捕捉する
自動でテストすべき項目
パイプラインにSPFチェックを組み込み、permerror を導入するようなビルドを失敗させましょう。
-
構文チェック: 単一の v=spf1 レコードであること。不正なトークン/メカニズムがないこと。CIDRが有効であること。redirect の重複がないこと。
-
ルックアップの計上: シミュレートされたリゾルバ条件下でのDNSルックアップとvoidルックアップの決定論的なカウント。
-
障害シミュレーション: インクルードグラフに沿って NXDOMAIN、NODATA、SERVFAIL、タイムアウトを誘発してレコードを評価します。
-
境界テスト: レコードサイズがTXTの制限内であること。引用文字列の連結が検証されていること。SPF RRタイプのみのデプロイがないこと。
-
アライメントテスト: MailFrom/Return-Path ドメインと想定されるサブドメインポリシーが、依然としてDMARCアライメントの経路を通過することを確認します。
GitHub Actions のスニペット例(概念的)
-
Run: autospf validate spf.example.com -max-lookups 10 -fail-on-void 2
-
Run: autospf simulate spf.example.com -servfail 10% -nxdomain 5%
-
Run: autospf graph spf.example.com -output graph.json
-
Run: autospf flatten spf.example.com -dry-run -ttl 900 -diff
AutoSPFとの関連: AutoSPFは、構文検証、ルックアップのカウント、カオスDNSシミュレーション、安全なフラット化のプレビューのためのCLI/APIを提供します。根本原因の注釈付きでPRコメントを投稿し、permerror のリスクがあるマージをブロックし、本番環境の監視でリグレッションが検出された場合には自動でロールバックできます。
フラット化は include/redirect とどう比較されるか: マルチベンダー構成におけるトレードオフ
メリットとデメリットの概要
-
SPFフラット化
-
メリット: 予測可能な10回以下のルックアップ。外部の include 変更に強い。評価が高速。
-
デメリット: 古いIPのリスク。更新の自動化が必要。レコードが大きくなると255バイトのセグメント分割エラーのリスク。ベンダーがIPを変更すると頻繁なDNS更新が発生。
-
include/redirect
-
メリット: IP変更をベンダーに委譲できる。レコードが小さい。人手でのメンテナンスが容易。redirect でポリシーを一元化できる。
-
デメリット: ネストされた include によるルックアップの爆発。ベンダー側のDNS障害の影響を受けやすい。voidルックアップやループのリスクが増える。
TTLと伝播への影響
-
短いTTL(300〜900秒)はフラット化されたレコードの陳腐化を減らしますが、クエリ量とレートリミットに引っかかる可能性を増やします。
-
長いTTL(3600〜86400秒)は安定しますが、設定ミスの後に不良状態が長引く恐れがあります。
-
include については、ベンダーのTTLはさまざまです。障害や更新の遅れは一貫性のない状態を伝播し、受信側によって pass と permerror の間で切り替わることがあります。
AutoSPFとの関連: AutoSPFの動的フラット化は、IPをスケジュールに従って更新し、TXTを安全に分割し、ベンダーの変動性に応じてTTLを調整します。ハイブリッド化も可能で、安定したベンダーは include のまま残し、ノイズの多いものだけをフラット化しつつ、ルックアップ数を保証します。
完全なSPFテストスイートを構築する: ケースと期待される結果
中核的なカバレッジ
-
IPv4/IPv6 の正しさ: ip4:203.0.113.0/24、ip6:2001:db8::/32 - 一致するIPでは pass を期待し、追加のルックアップは発生しません
-
オーバーライドと修飾子: +a、-all、~all、?all - 正しい終端結果を期待します。-all は permerror を解消しません
-
サブドメインポリシー: redirect=spf.root.example を伴う spf.example.com - 子ドメインは親に従い、ルックアップは1回増加すると期待されます
-
マクロ: exists:%{i}._ip.%{d} - 展開のフォーマットを検証します。permerror なしで pass/neutral を期待し、voidルックアップを制限します
-
エッジケース: v=spf1 TXTレコードが複数 - permerror。redirect の重複 - permerror。未知のメカニズム - permerror
-
ルックアップの負荷: 10個の include の連鎖 - pass が許容されます。11個目の include - permerror
-
DNSカオス: 1つの include に沿って10%の SERVFAIL。評価器で permerror と誤分類されず、高リスクとしてフラグ付けされることを確認します
-
レコードサイズと引用: ちょうど一度だけ再結合される複数文字列のTXT。引用符の不一致 - permerror
AutoSPFとの関連: AutoSPFはリファレンステストを同梱し、メカニズムごとに pass/fail を確認するための合成IPを生成し、テナント固有のスイートを雛形として作成できます。期待される結果を保存し、リゾルバの種類ごとに実際の結果との差分を取ります。
本番環境での permerror のデバッグ: ステップバイステップ
失敗している経路を追跡する
- シナリオを記録します: 送信IP、MailFrom ドメイン、受信MTA(例: Gmail MX)、そしてタイムスタンプ。
- SPFを解決します: dig +short TXT example.com。v=spf1 レコードが1つだけ表示されることを確認します。
- トレースで include を展開します:
- kdig +trace TXT _spf.vendor.com
- a と mx の場合: dig A/AAAA と MX、続いて MX ホストの A/AAAA
- ルックアップを手動でカウントし、void 応答(NXDOMAIN/NODATA)を記録します。
- ループを確認します: 前のノードに戻る redirect チェーンを探します。
- バリデータを使用します:
- spfquery -ip 203.0.113.10 -sender user@example.com -helo mail.example.com
- 一貫性を確認するため、少なくとも2つのライブラリ(pyspf と libspf2)で結果を比較します。
見つかりやすい典型的な原因:
-
プラグインによって追加された余分なSPFレコード
-
ベンダーが4〜5階層の深さにネストする include を追加した
-
ゾーン編集後にTXTの引用が壊れた
-
古い、廃止された include によって引き起こされた2つ以上のvoidルックアップ
AutoSPFとの関連: AutoSPFのライブ「インクルードグラフ」は、失敗しているノードを特定し、正確なルックアップ数とvoidを表示し、リゾルバのログとともに評価を再現します。ワンクリックの「フラット化されたIPに置き換え」で、監査証跡を保ちながらホットフィックスできます。手動でのアプローチについては、SPF検証のトラブルシューティングガイドが各チェックを順を追って説明しています。
断続的な permerror: TTL、伝播、レートリミット、そして一時的なDNS
SPFがなぜ揺れ動くのか
-
TTLのずれ: 一部のリゾルバが古い include をキャッシュし、別のリゾルバは新しいデータを持つため、ルックアップ数が一貫しなくなります。
-
プロバイダのレートリミット: ベンダーが TXT/MX クエリを絞り、散発的に SERVFAIL を返すことがあります。
-
一時的なDNS障害: タイムアウトや断続的な NXDOMAIN が一連のvoidルックアップを生み出します。
-
Geo-DNS のばらつき: 異なる PoP が異なる回答を返し、あるチェーンは10を超え、別のチェーンは超えないことがあります。
緩和策:
-
バランスの取れたTTLを使います: include には900〜3600秒、AutoSPFが頻繁に更新するフラット化されたセクションには300〜900秒。
-
SPF関連のホスト名で SERVFAIL と NXDOMAIN の発生率を監視します。
-
大規模なキャンペーンの前に include をクエリしてキャッシュをプレウォームします。
-
SLAのあるベンダー集約を優先し、実験的なサブ include は避けます。
AutoSPFとの関連: AutoSPFは複数のグローバルリゾルバからDNSをサンプリングし、ノードごとに void と SERVFAIL の発生率を追跡し、しきい値でアラートを出します。ノードの変動性に応じてTTL調整を推奨し、ベンダーが不安定になった場合には、直近の正常なフラット化セットへ自動的にフェイルバックできます。
マルチテナント/マルチドメイン構成のためのSPF設計
permerror を避ける構造的パターン
-
正規 redirect: 子ドメインには v=spf1 redirect=spf.example.com。ロジックを一度だけ管理し、子ごとにルックアップ +1
-
テナントサブドメイン: tenant1.mail.example.com と tenant2.mail.example.com がそれぞれテナント固有のSPFに redirect
-
ptr を避け、共有ゾーンでは mx/a を減らします。明示的な ip4/ip6 またはベンダー集約を優先します
-
特にやり取りの多いベンダーについてはゾーンを委譲し、異なるTTLポリシーを持つ別ドメインの下にその include を隔離します
例:
-
spf.example.com: v=spf1 include:_spf.esp.com include:_spf.crm.com ip4:198.51.100.0/24 -all
-
marketing.example.com: v=spf1 redirect=spf.example.com
-
ops.example.com: v=spf1 ip4:203.0.113.10 include:_spf.alerts.com -all
AutoSPFとの関連: AutoSPFはマルチドメインのデプロイを雛形化し、「ドメインごとに1つのSPF」制約を強制し、全テナントにわたってルックアップ数をシミュレートするため、あるテナントに新しいベンダーを追加しても、他のテナントを誤って制限超過に押し上げることはありません。サブドメインでSPFを公開することで、各テナントのルックアップ予算を分離して保てます。
バリデータとMTAの違い: 矛盾する出力を調整する
実際に何が異なるのか
-
ルックアップのカウントと void 制限: 一部のバリデータは10回のルックアップと2回のvoidを厳格に強制しますが、他のバリデータは寛容です。
-
マクロのサポート: 一部のツールはマクロを部分的にしか実装しておらず、誤検知や見逃しにつながります。
-
エラーマッピング: 一時的なDNSの問題(SERVFAIL/タイムアウト)は temperror であるべきですが、一部のMTAやツールは曖昧に表面化させます。ログには「permerror のような」結果が表示されることがあります。
例:
-
Gmail と Microsoft 365 は概ね RFC 7208 に準拠していますが、運用上の防御(例: DNS不正使用の防止)は攻撃下で保守的な解釈をもたらすことがあります。
-
オンラインツール: Kitterman のチェッカーは厳格で透明性が高く、MXToolbox は複数レコードを目立つ形でフラグ付けし、一部のベンダーウィザードはvoidルックアップのリスクを無視します。
調整の戦略:
-
実際の通信上の挙動を優先します: spfquery と障害シミュレーション下での直接DNSでテストします。
-
パーサーの癖を捉えるため、2つの独立したライブラリで検証します。
-
単一の信頼できる情報源となるパイプライン(AutoSPF)を使い、許容できる範囲で最も保守的な解釈に基づいてビルドを失敗させます。
A_utoSPF との関連: AutoSPFはデュアルエンジンの検証(pyspf と独自の RFC 7208 準拠評価器)を実行し、不一致を記録し、受信側全体で安全を保つために、なぜより厳格な結果が選ばれたのかを文書化します。
監視とアラート: permerror の影響を早期に検出する
継続的に監視すべき項目
-
合成メールトランザクション: 各アイデンティティを通じて代表的なIPから送信し、受信側のテスト用受信トレイでSPFの結果を記録します。
-
DNSクエリのサンプリング: すべての include と redirect ターゲットへの1時間ごとのクエリ。NXDOMAIN/NODATA/SERVFAIL の割合とTTLのずれを追跡します。
-
DKIM/DMARC テレメトリ: 集約RUAを解析して SPF=permerror や SPF=temperror の急増を検出し、プロバイダやキャンペーンと相関させます。
-
ルックアップ数の追跡: 定期的にルックアップ数とvoidを再計算し、忍び寄る include やベンダーの変更を検出します。
是正のワークフロー
-
アラートのしきい値: RUAで permerror が1%以上、またはいずれかの include でvoidルックアップが2%超に急増した場合は即座にページング
-
自動緩和: 影響を受けたブランチについて、インシデントを起票しつつ、直近の正常なフラット化ポリシーに切り替えます
-
根本原因: インクルードグラフの差分を使って何が変わったか(ベンダーの include の内容、TTL、新しいサブ include)を確認します
-
恒久的な修正: include のセットを調整し、フラット化を追加または調整し、必要に応じてTTLを下げ、再発防止のためのCIルールを追加します
AutoSPFとの関連: AutoSPF は合成送信を自動化し、DMARC RUAを取り込み、ルックアップの指標を追跡し、API経由でチケットを自動起票したりロールバックしたりできます。ポリシー・アズ・コードのリポジトリ統合により、事後分析が確実に再発防止ルールとなります。
ケーススタディ: 現場で有効なこと
7ベンダーを抱えるSaaS(include の爆発)
問題: 実効14ルックアップ、Gmail での断続的な permerror。 対応: AutoSPFが変動の激しい2つのベンダーのフラット化を推奨し、12のサブドメインを正規SPFに redirect し、mx の使用を削減しました。 結果: 合計8ルックアップ。DMARCの通過率が+14%、バウンスに関するサポートチケットが73%減少しました。
断続的な SERVFAIL を抱えるフィンテック
問題: APACにあるベンダーのDNS PoPが3〜5%の確率で SERVFAIL を返し、outlook.com のログには temperror/permerror が混在していました。 対応: AutoSPFが SERVFAIL の増加を検出し、より短いTTLと当該ベンダーのサブツリーの動的フラット化を助言し、複数リージョンからの合成プローブを構成しました。 結果: それ以降 permerror は発生せず、送信者スコアが改善。ベンダー起因のインシデントは今や15分以内に自動緩和されます。
FAQ
~all と -all のどちらを使うかは permerror のリスクに影響しますか?
いいえ。修飾子は、どのメカニズムにも一致しなかった場合の結果を決めるだけです。permerror は構文とプロトコルの違反に関するものです。~all を使おうと -all を使おうと、不正なレコードや過剰なルックアップは依然として permerror をもたらします。AutoSPFは、選択した all の修飾子に関係なく正しさを強制します。
PTR はSPFで今でも安全に使えますか?
PTR は非推奨であり、多数の DNSクエリやタイムアウトを引き起こす恐れがあります。ルックアップと void の制限を超えるリスクを高めます。明示的な ip4/ip6 またはベンダー include を優先してください。AutoSPFは ptr の使用をフラグ付けし、同等のカバレッジを持つより安全な代替案を提案します。
255文字を超える大きなSPFレコードはどう扱えばよいですか?
TXT文字列の連結を正しく使うか、あるいはそれ以上に、redirect/フラット化でメカニズムを減らしてレコードをコンパクトに保ちましょう。分割が正しくないと permerror を引き起こします。AutoSPFは分割を検証し、メカニズムを集約することでポリシーを縮小できます。
一時的な SERVFAIL は permerror を引き起こすことがありますか?
仕様上、一時的なDNSの問題は temperror です。しかし、voidルックアップ制限や実装の違いと組み合わさると、permerror のような結果を観測することがあります。AutoSPFはこれらの条件をシミュレートし、本番環境に影響が及ぶ前にアラートを出します。
改めて、include と redirect の違いは何ですか?
include は別のSPFをテストし、それが pass すれば pass を返します。そうでなければ評価が続きます。redirect は評価全体をターゲットのポリシーで完全に置き換え、レコード内で一意でなければなりません。redirect の重複は permerror です。AutoSPFは、redirect の方が安全でルックアップを減らせる場合にそれを教えてくれます。
結論: AutoSPFで permerror を非事象にする
SPFの permerror を止めるには、仕組みが必要です。すなわち、有効なレコードを作成し、DNSルックアップを厳格な制限内に保ち、本番同様にテストし(DNSカオスを含む)、継続的に監視し、素早く是正することです。AutoSPFがあれば、RFCに正確なパーサー、ライブのルックアップ計上、スマートなTTLを伴う動的フラット化、不良マージを防ぐCI/CDゲート、そしてリスクのある状態を検出してロールバックする監視が手に入ります。その結果、ベンダーエコシステムが進化しても、予測可能なSPFの挙動、保たれた管理境界、そして守られた配信性が実現します。
Topics
CTO
CTO of DuoCircle. Architect of AutoSPF's SPF flattening engine and DNS monitoring infrastructure.
LinkedIn Profile →