Cloud DNS:解析、委派与切换
验证:未记录
- 适用版本
- 未记录
- 验证范围
- 尚未登记验证记录。
Console:Network services → Cloud DNS。
推荐做法#
- Public zone 必须完成父域 NS 委派;Private zone 明确可见 VPC。
- 切换前先降低 TTL 并等待旧 TTL,再改记录;用权威与递归查询分别验收。
- DNSSEC 配置包含父域 DS;停用前先处理 DS 缓存。
常用操作#
替换为实际资源;本段不依赖 lab.env。
DOMAIN='REPLACE_FQDN'
AUTH_NS='REPLACE_AUTHORITATIVE_NS'
dig @"$AUTH_NS" "$DOMAIN" A +noall +answer
dig @8.8.8.8 "$DOMAIN" A +noall +answer
dig "$DOMAIN" AAAA +noall +answer容易踩的坑#
- 创建 zone 不会购买域名或自动委派;查询成功不证明 HTTPS/应用正常。
- Private zone 缺记录不保证回退公共同名 zone;旧 AAAA 可能把用户导向错误入口。
配置说明与完整示例(按需展开)
1. Route 53 的能力分别在哪里#
| AWS Route 53 能力 | GCP 对应 | 区别 |
|---|---|---|
| Public hosted zone | Cloud DNS public managed zone | 创建区域后还要在父域配置 NS 委派 |
| Private hosted zone | Cloud DNS private managed zone | 指定可见 VPC;不向互联网发布 |
| A / AAAA / CNAME / MX / TXT / CAA | Cloud DNS record sets | 同名同类型组成一个 RRset,按集合更新 |
| Alias 到 ALB/CloudFront | 按目标产品配置地址或域名 | 不照搬 AWS Alias;区域顶点通常用全局 LB 静态 IP 的 A/AAAA |
| Weighted / 地理位置 / Failover | Cloud DNS routing policies | 策略、健康检查和目标类型的支持范围不同,见路由实验 |
| Resolver inbound/outbound | Cloud DNS server policies / forwarding zones | 还需要 VPN、Interconnect 等网络路径 |
| 域名注册 | 域名注册商,另行管理 | 托管 DNS 区域不会替你购买或续费域名 |
| DNSSEC | Cloud DNS DNSSEC + 父域 DS | 只打开区域开关不等于信任链建立 |
A 是 IPv4,AAAA 是 IPv6;CNAME 指向另一个名称,不能与同名其他数据并存,也不能代替区域顶点必需的 SOA/NS。TXT 常用于域名验证,MX 用于邮件路由,CAA 限制可签发证书的 CA。记录管理
2. 公共区域:创建、查询、委派#
前置:环境篇、DNS Administrator、dig。你需要一个自有域或可委派的子域。没有域名也能直接查询分配的权威 NS,但无法完成公网递归解析验收。
source lab.env
gcloud services enable dns.googleapis.com
export DNS_ZONE_NAME='lab.example.com.' # 替换为自有实验子域,保留末尾点
export DNS_ZONE='lab-public'
gcloud dns managed-zones create "$DNS_ZONE" --dns-name="$DNS_ZONE_NAME" --description='DNS lab'
gcloud dns managed-zones describe "$DNS_ZONE" --format='value(nameServers)'
export AUTH_NS=$(gcloud dns managed-zones describe "$DNS_ZONE" --format='value(nameServers[0])')
# 文档示例 IP,只验证 DNS,不能用于访问实际网站。
gcloud dns record-sets create "app.$DNS_ZONE_NAME" --zone="$DNS_ZONE" --type=A --ttl=60 --rrdatas=192.0.2.10
gcloud dns record-sets create "www.$DNS_ZONE_NAME" --zone="$DNS_ZONE" --type=CNAME --ttl=60 --rrdatas="app.$DNS_ZONE_NAME"
gcloud dns record-sets create "verify.$DNS_ZONE_NAME" --zone="$DNS_ZONE" --type=TXT --ttl=60 --rrdatas='"gcp-lab-verification"'
dig @"$AUTH_NS" "app.$DNS_ZONE_NAME" A +noall +answer
dig @"$AUTH_NS" "www.$DNS_ZONE_NAME" CNAME +noall +answer
dig @"$AUTH_NS" "verify.$DNS_ZONE_NAME" TXT +noall +answer委派位置很重要:
- 若托管整个注册域,在注册商处将权威 NS 改为 Cloud DNS 给出的完整集合。
- 若托管
lab.example.com子域,在父区域example.com创建lab的 NS 记录,填写该完整集合;不要替换整个父域的 NS。 - DNS 区域可能有同名旧副本;以父域真正委派的 NS 为准。
dig +trace "app.$DNS_ZONE_NAME" A
dig @8.8.8.8 "app.$DNS_ZONE_NAME" A +noall +answer这条 dig 命令的各部分含义如下:
| 参数 | 含义 |
|---|---|
@8.8.8.8 |
向 Google Public DNS 的递归解析器发起查询;前面的 @"$AUTH_NS" 则直接查询本实验区域的权威名称服务器 |
"app.$DNS_ZONE_NAME" |
要查询的域名;例如 DNS_ZONE_NAME=lab.example.com. 时,查询 app.lab.example.com. |
A |
查询 IPv4 地址记录;换成 AAAA 查询 IPv6 地址,换成 CNAME 查询别名记录 |
+noall |
先关闭所有常规输出显示项,隐藏响应头、问题区、统计信息等 |
+answer |
再开启 Answer(答案)区的显示;与前面的 +noall 配合,只保留答案记录 |
+noall +answer 按顺序关闭常规输出再显示答案,不影响查询类型。dig 手册
例如,答案可能显示为:
app.lab.example.com. 60 IN A 192.0.2.10依次是域名、TTL(秒)、记录类别(IN 表示 Internet)、记录类型和 IPv4 地址。递归解析器返回的缓存记录 TTL 可能小于配置的 60 秒。若没有答案输出,先去掉 +noall +answer 查看完整响应中的 status,区分域名不存在(NXDOMAIN)、解析失败(SERVFAIL)或没有该类型记录等情况。
验收:权威查询与公网递归查询都得到 192.0.2.10。若前者成功、后者失败,优先检查父域 NS、缓存与 DS,而不是重建应用。
3. 修改、TTL 与故障#
gcloud dns record-sets update "app.$DNS_ZONE_NAME" --zone="$DNS_ZONE" --type=A --ttl=60 --rrdatas=192.0.2.20
dig @"$AUTH_NS" "app.$DNS_ZONE_NAME" A +noall +answer
dig @8.8.8.8 "app.$DNS_ZONE_NAME" A +noall +answer旧缓存按原 TTL 过期;变更当天才调低 TTL,不能使已经缓存的长 TTL 立即缩短。NXDOMAIN 也存在负缓存。正式切换先降低 TTL、等待原 TTL,再改目标,验证后恢复合理 TTL。
停用 DNSSEC 前,先移除父域 DS 并等待其缓存过期,再关闭签名。 顺序反了会使验证型解析器返回
SERVFAIL。启用时则要把对应 DS 发布到父域,并验证信任链。DNSSEC 配置
4. 私有区域#
前置:VM与 lab-vpc,无需域名。
export VM_IP=$(gcloud compute instances describe lab-vm --zone="$ZONE" --format='value(networkInterfaces[0].networkIP)')
gcloud dns managed-zones create lab-private --dns-name=lab.internal. --description='Private DNS lab' --visibility=private --networks=lab-vpc
gcloud dns record-sets create admin.lab.internal. --zone=lab-private --type=A --ttl=60 --rrdatas="$VM_IP"
gcloud compute ssh lab-vm --zone="$ZONE" --tunnel-through-iap --command='getent hosts admin.lab.internal'验收:VM 内得到内网 IP,本机默认解析不到。删除 A 记录,等缓存过期后查询应失败,再重建恢复。私有区域的同名命名空间可能遮蔽公共解析;私有区域缺记录时,不应期待自动回退公共同名区域。私有区域
DNS peering 只共享解析视图,不会让两个 VPC 的业务流量自动互通;forwarding zone 也需要转发目标能通过网络到达。
5. 清理#
先清理路由实验和证书验证记录;域名仍服务其他应用时不要删除区域。
gcloud dns record-sets delete "app.$DNS_ZONE_NAME" --zone="$DNS_ZONE" --type=A
gcloud dns record-sets delete "www.$DNS_ZONE_NAME" --zone="$DNS_ZONE" --type=CNAME
gcloud dns record-sets delete "verify.$DNS_ZONE_NAME" --zone="$DNS_ZONE" --type=TXT
gcloud dns record-sets delete admin.lab.internal. --zone=lab-private --type=A
gcloud dns managed-zones delete lab-private若启用了 DNSSEC,先按上面的顺序清理父域 DS。移除实验 NS 委派后,再 gcloud dns managed-zones delete "$DNS_ZONE"。公共/私有区域、查询和附加功能按各自计费规则核对。