通过 CNAME 扁平化,Cloudflare 返回 IP 地址而不是 CNAME 记录指向的目标主机名。 此过程支持一些功能并提供更好的性能和灵活性,如 CNAME 扁平化概念页中所述。
请考虑下面的图,以概览 CNAME 扁平化可能涉及的步骤。
domain.test是 Cloudflare 上的 zone,具有以下 CNAME 记录:
| Type | Name | Content | TTL |
|---|---|---|---|
CNAME |
domain.test |
external-origin.test |
3600 |
external-origin.test是不同 DNS 提供商上的 zone,具有以下 A 记录:
| Type | Name | Content | TTL |
|---|---|---|---|
A |
external-origin.test |
192.0.2.1 |
7200 |
在这种情况下,直接用 IP 地址响应 domain.test 查询的过程可以用以下图表示:
flowchart BT
accTitle: CNAME flattening diagram
accDescr: Diagram of CNAME flattening process when there is a request for a domain in Cloudflare and the zone has a CNAME record at apex that points to an external A record.
A((User)) <--query for <code>domain.test</code>--> B[Resolver] --> C
C["Question:
<code>domain.test IN A</code>"]
subgraph Y[Cloudflare DNS]
direction RL
D{{Look up record}} --> G["Answer:
<code>domain.test 3600 CNAME external-origin.test</code>
This means that <code>domain.test</code> is a <code>CNAME</code> at the zone apex.
Forced <code>CNAME</code> flattening is enabled."] --- H{{Resolve <code>external-origin.test</code>}}
K{{Append answer with overwritten query name}} --> L["Answer:
<code>domain.test 7200 IN A 192.0.2.1</code>"] --- M{Proxy status}
M --Proxied--> O["Answer:
<code>domain.test 300 IN A {$Cloudflare IP 1}</code>
<code>domain.test 300 IN A {$Cloudflare IP 2}</code>"]
M --DNS only--> N["Answer:
<code>domain.test 3600 IN A 192.0.2.1</code>"]
end
subgraph Z [External DNS provider]
J["Answer:
<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 ↗ 组成,其生存时间(TTL)设置为
300。 - 如果 Cloudflare 中的 CNAME 记录未被代理,扁平化答案由外部 DNS 提供商的 IP 地址组成,其 TTL 对应于外部记录和 Cloudflare CNAME 记录之间的较低值。