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 名称。

关键区别:enableDnsSupport 管“能不能解析”,enableDnsHostnames 管“实例有没有名字”。前者是解析能力开关,后者是命名开关。只开后者不开前者,实例不会获得主机名。

二、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。

四、三者的联动关系

把上述组件串起来看,一次成功的私有域名解析需要同时满足以下条件:

  1. VPC 的 enableDnsSupport 为 true,解析器可用。
  2. 实例通过 DHCP 选项集拿到了 AmazonProvidedDNS(或指向能转发到 Route 53 的自定义解析器)作为 DNS 服务器。
  3. 目标私有托管区域已与该 VPC 关联。
  4. PHZ 中存在对应的记录,且记录类型、TTL、目标地址正确。

下面这张图展示了从实例发起查询到返回结果的完整链路,以及三个组件的介入位置:

EC2 实例 10.0.1.25 查询 db.corp.internal DHCP 选项集 domain-name-servers = AmazonProvidedDNS domain-name = corp.internal 下发 DNS 配置 AmazonProvidedDNS 10.0.0.2 (VPC CIDR +2) VPC 解析器 DNS 查询 enableDnsSupport = true(解析能力开关) 私有托管区域 corp.internal db.corp.internal → 10.0.2.50 app.corp.internal → 10.0.1.80 查询 PHZ VPC 关联 vpc-0a1b2c3d... → PHZ 返回解析结果 10.0.2.50 (A 记录) 解析成功条件:enableDnsSupport=true + DHCP 下发 AmazonProvidedDNS + PHZ 已关联该 VPC + PHZ 中存在对应记录 任一条件不满足 → 返回 NXDOMAIN 或 SERVFAIL,需逐项排查

五、常见排查路径

当实例无法解析私有域名时,可以按以下顺序检查:

检查项命令/位置预期值
enableDnsSupportaws ec2 describe-vpc-attribute --vpc-id vpc-xxx --attribute enableDnsSupporttrue
enableDnsHostnamesaws ec2 describe-vpc-attribute --vpc-id vpc-xxx --attribute enableDnsHostnamestrue(如需主机名)
DHCP 选项集aws ec2 describe-dhcp-options 及 VPC 关联domain-name-servers 含 AmazonProvidedDNS
实例 DNS 配置实例内 cat /etc/resolv.confnameserver 10.0.0.2
PHZ 关联aws route53 get-hosted-zone --id ZxxxVPCs 列表包含目标 VPC
记录存在性aws route53 list-resource-record-sets --hosted-zone-id Zxxx包含目标域名记录
在混合云场景中,如果本地 DNS 服务器需要解析 AWS 私有托管区域中的记录,通常通过 Route 53 Resolver 出站端点(Outbound Endpoint)将查询转发到本地,或通过入站端点(Inbound Endpoint)让本地 DNS 查询 AWS 私有区域。这属于跨域解析的进阶内容,但前提仍然是本节所述的 VPC DNS 属性与 PHZ 关联配置正确。

总结来说,VPC DNS 解析是一条由“属性开关 → DHCP 下发 → 解析器查询 → PHZ 关联 → 记录返回”构成的链路。任何一个环节断开,解析都会失败。掌握每个环节的检查方法,就能在混合云环境中快速定位 DNS 问题。