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)解析过程

  1. 用户访问域名 输入 domain-a.com

  2. DNS 解析(Cloudflare)

    • Cloudflare 的权威 DNS 返回一条 CNAME:domain-a.comtest.github.io
    • 浏览器最终得到 GitHub Pages 的 IP
  3. 请求到 GitHub Pages

    • 浏览器发起 HTTP 请求,请求头里的 Host 字段 = domain-a.com
    • GitHub Pages 接收到后,会检查 domain-a.com 是否配置在某个仓库
  4. GitHub Pages 内容匹配

    • 在仓库 repo-aSettings → 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,却显示不同仓库内容