CNAME flattening では、Cloudflare は CNAME レコードが指すターゲットホスト名ではなく、IP アドレスを返します。 この処理はいくつかの機能を支え、CNAME flattening の概要 で述べているとおり、パフォーマンスと柔軟性を高めます。
次の図で、CNAME flattening に含まれる手順の概要を確認できます。
domain.testは Cloudflare 上のゾーンで、次の CNAME レコードがあります。
| タイプ | 名前 | コンテンツ | TTL |
|---|---|---|---|
CNAME |
domain.test |
external-origin.test |
3600 |
external-origin.testは別の DNS プロバイダー上のゾーンで、次の A レコードがあります。
| タイプ | 名前 | コンテンツ | TTL |
|---|---|---|---|
A |
external-origin.test |
192.0.2.1 |
7200 |
この場合、domain.test へのクエリに IP アドレスを直接返す処理は、次の図で表せます。
flowchart BT
accTitle: CNAME flattening の図
accDescr: Cloudflare 上のドメインへのリクエストがあり、ゾーン apex の CNAME レコードが外部の A レコードを指す場合の CNAME flattening 処理の図。
A((ユーザー)) <--<code>domain.test</code> へのクエリ--> B[リゾルバー] --> C
C["質問:
<code>domain.test IN A</code>"]
subgraph Y[Cloudflare DNS]
direction RL
D{{レコードを検索}} --> G["回答:
<code>domain.test 3600 CNAME external-origin.test</code>
これは <code>domain.test</code> がゾーン apex の <code>CNAME</code> であることを意味します。
強制的な <code>CNAME</code> flattening が有効です。"] --- H{{<code>external-origin.test</code> を解決}}
K{{クエリ名を上書きして回答を追加}} --> L["回答:
<code>domain.test 7200 IN A 192.0.2.1</code>"] --- M{プロキシステータス}
M --プロキシ済み--> O["回答:
<code>domain.test 300 IN A {$Cloudflare IP 1}</code>
<code>domain.test 300 IN A {$Cloudflare IP 2}</code>"]
M --DNS のみ--> N["回答:
<code>domain.test 3600 IN A 192.0.2.1</code>"]
end
subgraph Z [外部 DNS プロバイダー]
J["回答:
<code>external-origin.test 7200 IN A 192.0.2.1</code>"]
end
C --> D
H --- J --- K
O --> B
N --> B
- CNAME レコードが Cloudflare でプロキシされている場合、回答は複数の Cloudflare IP ↗ で構成され、Time to Live(TTL)は
300になります。 - Cloudflare 上の CNAME レコードがプロキシされていない場合、flatten した回答は外部 DNS プロバイダーの IP アドレスになり、TTL は外部レコードと Cloudflare の CNAME レコードのうち小さい方になります。