AWS VPC 内部 DNS 的工作原理
Source: Dev.to
概述
在 AWS 网络中,资源解析端点,服务进行通信,应用程序按预期运行。在 VPC 内部,DNS 在服务相互发现以及流量路由方式中扮演重要角色。了解 AWS 内部的 DNS 工作原理有助于解释流量为何会如此流动,以及为何某些连接会成功或失败。本文从网络视角逐步讲解 AWS VPC 内的 DNS,侧重于解析流程,而非应用逻辑。
VPC DNS Resolver
每个 VPC 都配备了由 AWS 提供的内置 DNS 解析器。该解析器在 VPC 内的保留 IP 地址上可用,除非另行配置,否则资源会自动使用它。
当 EC2 实例发起 DNS 查询时,请求 不会 直接发送到互联网。相反,它由 VPC DNS 解析器在内部处理,解析器决定名称应如何以及在哪里解析。此设计使 AWS 能够将 DNS 与网络、计算和托管服务紧密集成。
DNS 设置
- DNS 解析 – 决定 VPC 中的资源是否能够解析域名。当启用时,实例可以向 VPC 解析器查询内部和外部域名。
- DNS 主机名 – 决定 AWS 是否为 EC2 实例、负载均衡等资源分配 DNS 名称。
在大多数情况下,这两个设置默认都是启用的。禁用它们并不常见,通常只在专用网络配置中使用。
解析流程
当 VPC 内的实例解析公共域名时:
- 请求被发送到 VPC DNS 解析器。
- 解析器代表实例查询公共 DNS 基础设施。
- 结果返回给实例。
从实例的角度来看,DNS 解析如预期般工作,即使子网是私有的。关键点是 DNS 解析本身并 不 需要互联网访问;只有后续的网络流量才需要。这就是为什么即使出站连接受限或通过 NAT 网关路由,私有实例仍然能够解析外部域名。
内部 DNS 记录
AWS 自动为 VPC 内的许多资源创建 DNS 记录。EC2 实例、负载均衡器以及某些托管服务会被分配内部 DNS 名称,这些名称解析为私有 IP 地址。当一个资源使用这些名称与另一个资源通信时,解析过程完全在 VPC 内部进行,使流量保持内部并避免经过互联网。
这种内部 DNS 行为使服务之间的通信无需硬编码 IP 地址,而 IP 地址随时间可能会变化。
私有托管区域
当涉及私有 DNS 时,DNS 的功能会更加强大。通过 私有托管区域,域名只能在一个或多个 VPC 内解析。这使团队能够对内部服务使用熟悉的域名命名模式,同时保持这些服务对外部不可访问。即使基础设施规模扩大或发生变化,应用程序也可以依赖稳定的名称。
私有 DNS 常用于:
- 内部 API
- 微服务
- 跨多个环境的共享服务
服务集成
许多 AWS 服务在正常运行时高度依赖 DNS。存储、数据库和消息服务的端点以 DNS 名称而非固定 IP 形式公开。当在 VPC 内部访问这些名称时,它们通常会解析为内部地址,尤其是在使用 VPC 端点时。这可将流量保持在 AWS 网络内部,避免不必要的互联网暴露。
设计考虑因素
从网络的角度来看,DNS 是将路由、终端和服务访问连接在一起的粘合剂。DNS 决策会影响流量的走向,尽管它本身并不转发数据包。解析得到的 IP 地址决定了流量是:
- 保持在 VPC 内部
- 通过 NAT 网关转发
- 通过 Internet 网关出站
正因为如此,DNS 应被视为网络设计的一部分,而不是事后考虑。明确的域名命名、统一使用私有 DNS,以及对解析路径的了解,能够让架构更易于理解和排查问题。
故障排除 DNS 问题
VPC 内的 DNS 问题往往源于假设而非配置错误。常见的陷阱包括:
- 期望私有实例在未启用 DNS 解析的情况下解析名称。
- 混淆公共 DNS 记录和私有 DNS 记录。
- 假设 DNS 查询需要互联网访问。
在排除故障时,检查 VPC DNS 设置并了解正在使用的解析器,通常比检查安全规则或路由更快找到答案。
结论
VPC 内的 DNS 设计上很简单,但与 AWS 网络深度集成。VPC DNS 解析器以受控且可预测的方式处理内部和外部的名称解析。一旦了解 DNS 查询的去向以及结果的返回方式,就能更容易地推断连接性、服务访问以及跨 AWS 环境的网络行为。