FCrDNS(正引き確認済み逆引き DNS)
概要
FCrDNS(正引き確認済み逆引き DNS) は、IP アドレスの逆引き結果(PTR レコード)を正引き(A / AAAA レコード)で再検証し、双方向の一致を確認する DNS の検証手法です。単なる逆引き(rDNS)が「IP → ホスト名」の片方向だけを見るのに対し、FCrDNS は「IP → ホスト名 → IP」の往復を検証して、そのホスト名が本当にその IP アドレスの所有者のものかを確認します。
この仕組みは RFC 8601(2019 年)の Authentication-Results ヘッダーで iprev という認証方式として定義されています。RFC 7001(2013 年)で初めて導入され、RFC 8601 で置き換えられました。
メール配信の文脈では、2024 年 2 月に Google(Gmail)と Yahoo が全送信者に対して FCrDNS の設定を必須化しました。この要件は送信量に関係なく適用され、FCrDNS が成立していない送信元からのメールは拒否またはスパムフォルダに振り分けられます。SPF・DKIM・DMARC と並ぶ送信者認証のベースライン要件です。
仕組み
FCrDNS の検証は 2 段階で行われます。
- 送信元 IP アドレスの PTR レコードを引いて、ホスト名を取得する(逆引き)
- 取得したホスト名の A レコード(IPv6 なら AAAA レコード)を引いて、元の IP アドレスが含まれているかを確認する(正引き)
この 2 つが一致していれば FCrDNS は pass です。
# ステップ 1: 逆引き(PTR)
93.184.216.34 → PTR → mail.example.com
# ステップ 2: 正引き(A)
mail.example.com → A → 93.184.216.34
# 結果: IP が一致 → FCrDNS pass
一方、PTR レコードが指すホスト名の A レコードが別の IP を返す場合、または A レコードが存在しない場合、FCrDNS は fail になります。
# ステップ 1: 逆引き(PTR)
198.51.100.25 → PTR → server1.hosting.example.net
# ステップ 2: 正引き(A)
server1.hosting.example.net → A → 203.0.113.50
# 結果: IP が不一致 → FCrDNS fail
なぜ双方向検証が必要なのか
PTR レコードだけの検証では不十分な理由は、PTR レコードの管理構造にあります。PTR レコードは IP アドレスブロックの管理者(ホスティングプロバイダーなど)が設定するものであり、任意のホスト名を指すことが技術的に可能です。攻撃者が VPS を契約して PTR レコードを mail.legitimate-company.com に向けることは、ホスティング事業者の管理画面からできてしまいます。
しかし、mail.legitimate-company.com の A レコードは legitimate-company.com のドメイン管理者しか変更できません。FCrDNS は、PTR レコードの指すホスト名を A レコードで再検証することで、ドメイン管理権限を持たない第三者による PTR の不正設定を検出します。
メールサーバーの検証フロー
受信サーバーが SMTP 接続を受け付けたとき、FCrDNS の検証は次のタイミングで行われます。
- TCP 接続を受け付ける — 送信元 IP アドレスが確定する
- PTR レコードを引く — IP に対応するホスト名を取得する
- 取得したホスト名の A / AAAA レコードを引く — 正引きで IP を再確認する
- 元の IP と一致するか判定する
この検証は SMTP の HELO / EHLO コマンドの前に行われるため、メールヘッダーの内容には依存しません。SPF がエンベロープ From のドメインを使い、DKIM が署名ヘッダーを使うのとは異なり、FCrDNS は純粋に IP アドレスレベルの検証です。
Authentication-Results ヘッダーでの表記
受信サーバーが FCrDNS の検証結果を記録する際、Authentication-Results ヘッダーに iprev として記載します(RFC 8601)。
Authentication-Results: mx.example.com;
iprev=pass (mail.example.com) smtp.remote-ip=93.184.216.34;
spf=pass smtp.mailfrom=example.com;
dkim=pass header.d=example.com
iprev=pass は FCrDNS が成功したことを示します。iprev=fail の場合、PTR レコードが存在しないか、正引きとの一致が確認できなかったことを意味します。
設定例
FCrDNS を成立させるには、PTR レコードと A レコードの両方を正しく設定します。
IPv4 の場合
送信サーバーの IP が 93.184.216.34、ホスト名が mail.example.com の場合、次の 2 つのレコードが必要です。
; A レコード(ドメインの DNS で設定)
mail.example.com. IN A 93.184.216.34
; PTR レコード(ホスティングプロバイダーで設定)
34.216.184.93.in-addr.arpa. IN PTR mail.example.com.
IPv6 の場合
IPv6 アドレス 2001:db8::1 を使う場合も同様に、AAAA レコードと PTR レコードの双方を設定します。
; AAAA レコード(ドメインの DNS で設定)
mail.example.com. IN AAAA 2001:db8::1
; PTR レコード(ホスティングプロバイダーで設定)
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa. IN PTR mail.example.com.
命名のベストプラクティス
PTR レコードのホスト名は送信ドメインと関連付けるのが望ましいです。
; 推奨: 送信ドメインのサブドメイン
mail.example.com → 93.184.216.34
; 非推奨: プロバイダーのデフォルトホスト名
93-184-216-34.compute.provider.net → 93.184.216.34
プロバイダーのデフォルトホスト名でも FCrDNS 自体は pass しますが、受信サーバーによっては PTR のホスト名と HELO ドメインの関連性も追加でチェックします。送信ドメインのサブドメインを使うことで、関連性の検証にも対応できます。
確認方法
FCrDNS の検証は dig コマンドで手動で再現できます。
# ステップ 1: 送信サーバー IP の逆引き
dig -x 93.184.216.34
# ステップ 2: PTR の結果(ホスト名)を正引き
dig A mail.example.com
ステップ 1 で返ったホスト名をステップ 2 で正引きし、元の IP アドレスが含まれていれば FCrDNS は成立しています。
実際の Google Public DNS(8.8.8.8)で試すと、次のようになります。
# 逆引き
dig -x 8.8.8.8
dns.google.
# 正引き
dig A dns.google
8.8.8.8
→ IP が一致するため FCrDNS pass
ワンライナーで検証する場合は次のように組み合わせます。
# PTR を取得し、その結果を正引きして IP の一致を確認する
PTR=$(dig -x 8.8.8.8 +short) && dig A "$PTR" +short
外部の視点からも確認したい場合は、Labee Dev Toolbox の IP API を使うと、外部の視点から見た結果を取得できます。
curl "https://labee.dev/api/ip?ip=8.8.8.8"
レスポンスは次の形式で返ります。
{
"success": true,
"data": {
"ip": "8.8.8.8",
"type": "IPv4",
"isPrivate": false,
"ptr": "dns.google"
},
"error": null,
"meta": { "responseTime": 42 }
}
data.ptr に逆引き結果のホスト名が返ります。この値が null の場合、PTR レコードが設定されていないため FCrDNS は成立しません。PTR が返った場合は、そのホスト名を dig A で正引きして、元の IP と一致するかを確認します。
メール認証全体の設定状況は、Mail Auth API でも確認できます。
curl "https://labee.dev/api/mail-auth?domain=example.com"
レスポンスは次の形式で返ります。
{
"success": true,
"data": {
"spf": {
"record": "v=spf1 include:_spf.google.com ~all",
"exists": true
},
"dkim": {
"record": null,
"exists": false,
"selector": "default"
},
"dmarc": {
"record": "v=DMARC1; p=reject; rua=mailto:dmarc@example.com",
"exists": true
},
"bimi": {
"record": null,
"exists": false
}
},
"error": null,
"meta": { "responseTime": 120 }
}
data.spf、data.dkim、data.dmarc、data.bimi の各フィールドでドメインの認証レコードを一括確認できます。FCrDNS は IP アドレスレベルの検証のため直接は含まれませんが、SPF・DMARC の設定と合わせて確認することで送信者認証の全体像を把握できます。
よくある問題
FCrDNS のトラブルは、PTR と A レコードの不整合や、共有 IP・IPv6 環境での設定漏れに起因するケースが大半です。
PTR が設定されているのに FCrDNS が fail する
最も多いパターンです。ホスティングプロバイダーのデフォルト PTR(例: 93-184-216-34.compute.provider.net)が設定されていても、そのホスト名の A レコードが存在しなければ FCrDNS は fail します。解決するには、PTR レコードを自分のドメインのサブドメイン(例: mail.example.com)に変更し、そのサブドメインの A レコードが送信サーバーの IP を指すように設定します。
共有 IP 環境で FCrDNS を設定できない
共有ホスティングでは IP アドレスを複数ユーザーで共有しているため、PTR レコードを個別に設定できません。この場合の対処法は 2 つあります。
- 専用 IP を持つ VPS やクラウドインスタンスにメールサーバーを移す
- SendGrid、Amazon SES、Postmark などの ESP(Email Service Provider)を使う。これらのサービスは自社の送信 IP に対して FCrDNS を設定済みです
IPv6 の FCrDNS を忘れている
IPv4 で FCrDNS を正しく設定していても、サーバーが IPv6 でもメールを送信している場合、IPv6 側の PTR レコードと AAAA レコードの設定が必要です。IPv6 の PTR が未設定だと、IPv6 経由で送信されたメールだけが拒否されます。サーバーの IPv6 アドレスに対しても PTR と AAAA の双方を設定するか、メール送信を IPv4 に限定します。
クラウドプロバイダーでの PTR 設定に時間がかかる
AWS の Elastic IP では逆引き DNS の設定にサポートへの申請が必要で、即時反映されません。GCP はプロジェクトの DNS 設定から逆引きゾーンを作成する形式です。新しいメールサーバーを構築する際は、PTR レコードの設定を最初の工程として行い、DNS の伝搬時間(TTL による)を考慮したスケジュールを立ててください。
FCrDNS は pass しているのにメールが届かない
FCrDNS はメール配信の必要条件ですが、十分条件ではありません。FCrDNS が pass していても、SPF・DKIM・DMARC のいずれかが fail していればメールは拒否される可能性があります。Authentication-Results ヘッダーで iprev、spf、dkim、dmarc の各結果を確認し、全てが pass しているかを検証してください。
SPF・DKIM・DMARC との関係
FCrDNS は IP アドレスレベルの検証であり、メール認証の全体像の中では最も基礎的なレイヤーに位置します。
| 認証方式 | 検証対象 | 検証レイヤー |
|---|---|---|
| FCrDNS (iprev) | 送信元 IP の PTR と A レコードの整合 | IP アドレス |
| SPF | エンベロープ From ドメインの送信許可 IP リスト | ドメイン(エンベロープ) |
| DKIM | メール本文とヘッダーの電子署名 | メッセージ |
| DMARC | SPF / DKIM の結果とヘッダー From の一致 | ポリシー |
FCrDNS が fail した場合、SPF や DKIM が pass していてもメールが拒否されることがあります。Google の送信者ガイドラインでは、FCrDNS は SPF・DKIM・DMARC とは独立した要件として位置付けられています。全ての認証方式を pass させることで、メール配信の信頼性が確保されます。