3. VPC DNS解析原理
在混合云架构中,VPC 内的 DNS 解析行为并不是“自动发生”的,它由三个相互配合的组件共同决定:VPC 的 DNS 属性开关、DHCP 选项集下发的解析器地址,以及私有托管区域(Private Hosted Zone, PHZ)与 VPC 的关联关系。理解这三者的分工与联动,是排查“为什么实例解析不到某个域名”这类问题的前提。
一、VPC 的两个 DNS 属性:enableDnsSupport 与 enableDnsHostnames
每个 VPC 都有两个独立的 DNS 相关属性,它们的作用完全不同,经常被混淆。
enableDnsSupport(DNS 解析支持)决定 VPC 是否使用 Amazon 提供的 DNS 解析器(位于 VPC 网段 +2 地址,即 VPC CIDR 的第二个可用 IP,例如 VPC 为 10.0.0.0/16 时解析器地址为 10.0.0.2)。该属性为 true 时,VPC 内的资源可以通过这个解析器查询公有 DNS 记录,也可以解析与 VPC 关联的私有托管区域中的记录。若关闭,实例将无法使用 AmazonProvidedDNS,只能依赖自定义 DNS 服务器。
enableDnsHostnames(DNS 主机名支持)决定 VPC 内的 EC2 实例是否自动获得一个公有 DNS 主机名和私有 DNS 主机名。它生效的前提是 enableDnsSupport 必须为 true。开启后,实例会获得形如 ip-10-0-1-25.us-east-1.compute.internal 的私有 DNS 名称,以及(若实例有公网 IP)对应的公有 DNS 名称。
二、AmazonProvidedDNS 与 DHCP 选项集
AmazonProvidedDNS 是 AWS 在每个 VPC 中提供的 DNS 解析服务,其地址固定为 VPC CIDR 的基地址 +2。实例要使用它,必须通过 DHCP 选项集把该地址下发给实例。
DHCP 选项集是 VPC 级别的配置,包含以下关键字段:
- domain-name:实例的默认域名,例如
corp.internal或us-east-1.compute.internal。 - domain-name-servers:DNS 服务器地址。使用 AmazonProvidedDNS 时填
AmazonProvidedDNS,AWS 会自动替换为 VPC 的 +2 地址;也可以填自定义 DNS 服务器 IP。 - ntp-servers、netbios-name-servers 等可选字段。
一个 VPC 只能关联一个 DHCP 选项集,但一个选项集可以关联多个 VPC。新建 VPC 时若未指定,会使用默认选项集,其 domain-name-servers 即为 AmazonProvidedDNS。
下面是一个自定义 DHCP 选项集的示例,将解析器指向本地数据中心的 DNS 服务器,同时保留 AmazonProvidedDNS 作为备用:
aws ec2 create-dhcp-options \
--dhcp-configurations \
"Key=domain-name,Values=corp.internal" \
"Key=domain-name-servers,Values=10.0.0.2,192.168.10.53" \
--tag-specifications 'ResourceType=dhcp-options,Tags=[{Key=Name,Value=hybrid-dns-options}]'
# 将选项集关联到 VPC
aws ec2 associate-dhcp-options \
--dhcp-options-id dopt-0abc1234567890def \
--vpc-id vpc-0a1b2c3d4e5f67890
注意:DHCP 选项集的变更不会立即对已有实例生效。实例需要重新获取 DHCP 租约(重启网络或重启实例)才能拿到新的 DNS 配置。这是排查“改了选项集但解析没变”时的常见原因。
三、私有托管区域与 VPC 的关联
私有托管区域是 Route 53 中不对外公开的 DNS 区域,只有与其关联的 VPC 才能解析其中的记录。关联关系决定了“哪些 VPC 能看到这个区域”。
创建 PHZ 并关联 VPC 的典型流程如下:
# 创建私有托管区域
aws route53 create-hosted-zone \
--name corp.internal \
--vpc VPCRegion=us-east-1,VPCId=vpc-0a1b2c3d4e5f67890 \
--caller-reference hybrid-dns-001
# 为已有 PHZ 追加关联另一个 VPC
aws route53 associate-vpc-with-hosted-zone \
--hosted-zone-id Z1234567890ABC \
--vpc VPCRegion=us-east-1,VPCId=vpc-0fedcba9876543210
关联生效后,被关联 VPC 内的实例通过 AmazonProvidedDNS 查询 db.corp.internal 时,解析器会命中该 PHZ 并返回其中配置的记录。未关联的 VPC 查询同一域名则返回 NXDOMAIN。
四、三者的联动关系
把上述组件串起来看,一次成功的私有域名解析需要同时满足以下条件:
- VPC 的 enableDnsSupport 为 true,解析器可用。
- 实例通过 DHCP 选项集拿到了 AmazonProvidedDNS(或指向能转发到 Route 53 的自定义解析器)作为 DNS 服务器。
- 目标私有托管区域已与该 VPC 关联。
- PHZ 中存在对应的记录,且记录类型、TTL、目标地址正确。
下面这张图展示了从实例发起查询到返回结果的完整链路,以及三个组件的介入位置:
五、常见排查路径
当实例无法解析私有域名时,可以按以下顺序检查:
| 检查项 | 命令/位置 | 预期值 |
|---|---|---|
| enableDnsSupport | aws ec2 describe-vpc-attribute --vpc-id vpc-xxx --attribute enableDnsSupport | true |
| enableDnsHostnames | aws ec2 describe-vpc-attribute --vpc-id vpc-xxx --attribute enableDnsHostnames | true(如需主机名) |
| DHCP 选项集 | aws ec2 describe-dhcp-options 及 VPC 关联 | domain-name-servers 含 AmazonProvidedDNS |
| 实例 DNS 配置 | 实例内 cat /etc/resolv.conf | nameserver 10.0.0.2 |
| PHZ 关联 | aws route53 get-hosted-zone --id Zxxx | VPCs 列表包含目标 VPC |
| 记录存在性 | aws route53 list-resource-record-sets --hosted-zone-id Zxxx | 包含目标域名记录 |
总结来说,VPC DNS 解析是一条由“属性开关 → DHCP 下发 → 解析器查询 → PHZ 关联 → 记录返回”构成的链路。任何一个环节断开,解析都会失败。掌握每个环节的检查方法,就能在混合云环境中快速定位 DNS 问题。