DNS 全面笔记(含 Cloudflare 与 GitHub Pages)
1. DNS 分类与层级
DNS 是一个分布式、层次化的命名系统,大体可以从 角色 和 功能 两个角度分类。
(1)按层级分类
| 层级 | 作用 | 示例 |
|---|---|---|
| 根 DNS 服务器(Root Servers) | 整个 DNS 的最高层,管理顶级域(TLD)的指向 | 13 个逻辑根服务器(A–M root) |
| 顶级域 DNS 服务器(TLD Servers) | 管理特定顶级域(如 .com、.org、.jp) | .com 的 TLD 服务器存放 .com 下所有二级域的 NS 记录 |
| 权威 DNS 服务器(Authoritative DNS) | 域名的最终解释者,保存着某个域名的实际记录(A、CNAME 等) | Cloudflare、阿里云 DNS |
| 递归 DNS 服务器(Recursive DNS) | 帮用户完成整个查询过程,缓存结果 | Google DNS (8.8.8.8),ISP 的 DNS |
(2)按功能分类
| 分类 | 作用 | 举例 |
|---|---|---|
| 递归解析器(Resolver) | 接受客户端查询,递归向上寻找答案,缓存结果 | Google DNS、Cloudflare DNS(1.1.1.1) |
| 权威服务器(Authoritative) | 保存域名最终记录,并返回权威答案 | Cloudflare、Route53 |
| 转发 DNS(Forwarder) | 接收请求但自己不解析,而是转发给上游解析器 | 企业内部 DNS 服务器 |
| 根 / TLD / 中间层 | 提供委托(Delegation),指引下一层权威 | 根 → TLD → 域名权威 |
简化记忆:
- 根服务器:告诉你去找哪个 TLD
- TLD 服务器:告诉你去找哪个权威
- 权威服务器:给你最终结果
- 递归服务器:帮你跑完这一圈,并缓存答案
2. DNS 报文结构回顾
DNS 报文包含:
- Header(ID, Flags, 计数)
- Question Section(查询目标)
- Answer Section(答案记录)
- Authority Section(权威 NS)
- Additional Section(Glue 记录)
Cloudflare 作为权威服务器时,会返回 AA=1(权威答案),但 RA=0(不提供递归)。
3. 静态 DNS vs 动态 DNS(DDNS)
| 特性 | 静态 DNS | 动态 DNS |
|---|---|---|
| IP | 固定 | 变化(家庭宽带) |
| 更新 | 手动修改 | 自动(DDNS 客户端+API) |
| TTL | 长(数小时) | 短(1-5 分钟) |
| 场景 | 企业官网、云服务器 | 家庭 NAS、远程访问 |
Cloudflare 支持 DDNS:通过 API 更新 A 记录,确保域名始终指向最新 IP。
4. GitHub Pages 与 Cloudflare 的关系详解
你提到的“两个 CNAME 记录都指向 test.github.io,但显示不同页面”的问题,本质是 Cloudflare 负责 DNS 解析,GitHub Pages 负责内容路由。
(1)解析过程
-
用户访问域名 输入
domain-a.com -
DNS 解析(Cloudflare)
- Cloudflare 的权威 DNS 返回一条 CNAME:
domain-a.com→test.github.io - 浏览器最终得到 GitHub Pages 的 IP
- Cloudflare 的权威 DNS 返回一条 CNAME:
-
请求到 GitHub Pages
- 浏览器发起 HTTP 请求,请求头里的
Host字段 =domain-a.com - GitHub Pages 接收到后,会检查
domain-a.com是否配置在某个仓库
- 浏览器发起 HTTP 请求,请求头里的
-
GitHub Pages 内容匹配
- 在仓库
repo-a的 Settings → Pages 中,如果配置了domain-a.com,GitHub Pages 会从这个仓库返回页面 - 即使 CNAME 都指向
test.github.io,GitHub Pages 也能根据 Host 分流
- 在仓库
(2)GitHub Pages 的关键机制
- 每个仓库可配置一个 自定义域名
- 仓库根目录必须有
CNAME文件(内容就是域名) - GitHub 验证域名所有权(DNS 层设置 CNAME 记录)
- 最终:同一个
username.github.io可以托管多个域名,但每个仓库对应一个独立域名
(3)Cloudflare 的角色
- 作为权威 DNS:负责把
domain-a.com解析到 GitHub Pages 的 IP - 可选代理模式(橙色小云):
- 开启:流量先到 Cloudflare,经过 CDN/防火墙,再转发给 GitHub
- 关闭:流量直接到 GitHub
- 附加功能:HTTPS 强制、缓存、性能优化
5. 综合流程图
sequenceDiagram
participant User as 用户浏览器
participant RecDNS as 递归DNS(8.8.8.8)
participant Root as 根服务器
participant TLD as .com 服务器
participant CF as Cloudflare 权威DNS
participant GH as GitHub Pages
User->>RecDNS: 查询 domain-a.com A
RecDNS->>Root: 查 .com NS
Root-->>RecDNS: 返回 .com TLD 地址
RecDNS->>TLD: 查 domain-a.com NS
TLD-->>RecDNS: 返回 Cloudflare NS
RecDNS->>CF: 查 domain-a.com A
CF-->>RecDNS: 返回 CNAME: test.github.io
RecDNS-->>User: 返回 GitHub IP
User->>GH: HTTP 请求 Host=domain-a.com
GH-->>User: 返回 repo-a 的页面
6. 总结
- DNS 分类:根 → TLD → 权威 → 递归
- 报文结构:Header, Question, Answer, Authority, Additional
- Cloudflare:既是权威 DNS,又能提供代理、防护和 DDNS 功能
- GitHub Pages:依赖 Host 字段和仓库 CNAME 文件来分流
- 协作机制:Cloudflare 解析 + GitHub Pages 内容匹配,让多个域名可指向同一个
github.io,却显示不同仓库内容