DNS 最佳做法

本文档提供了有关混合 DNS 的专用区域、DNS 转发和参考架构的最佳做法。

人和应用使用域名系统 (DNS) 更容易处理应用和服务,因为使用名称比使用 IP 地址更易于记忆,也更灵活。在由本地和一个或多个云平台组成的混合环境中,内部资源的 DNS 记录通常需要跨环境访问。传统上,本地 DNS 记录是使用权威 DNS 服务器手动管理的,例如 UNIX/Linux 环境中的 BIND 或 Microsoft Windows 环境中的 Active Directory。

本文介绍了在不同环境之间转发专用 DNS 请求的最佳做法,以确保可在本地环境和 Google Cloud 中对服务进行寻址。

一般原则

了解 Google Cloud 上的 DNS 概念

当您在 Google Cloud 上使用 DNS 时,请务必了解 Google Cloud 中可用于 DNS 解析和域名的不同系统和服务:

  • 内部 DNS 是自动为 Compute Engine 上的虚拟机和内部负载平衡器创建 DNS 名称的服务。
  • Cloud DNS 提供低延迟、高可用性的 DNS 区域服务。它既可以作为互联网上公开区域的权威 DNS 服务器,也可以用于仅在您的网络中可见的专用区域。
  • Managed Service for Microsoft Active Directory 是运行 Microsoft Active Directory(包含网域控制器)的高可用性安全强化型服务。
  • 公开 DNS是一项 Google 服务,但不属于 Google Cloud,它用作开放的递归 DNS 解析器。
  • Google Domains 是用于购买、转移或管理网域的域名注册商。它是一项 Google 服务,但不属于 Google Cloud。

确定利益相关方、工具和流程

当您考虑在混合环境中构建 DNS 策略时,首先应熟悉当前架构并与所有利益相关方取得联系。执行以下操作:

  • 找到并联系您的组织的企业 DNS 服务器管理员。请求他们提供所需的配置信息,以便将您的本地配置映射到 Google Cloud 上合适的架构。如需了解用于访问 Google Cloud DNS 记录的方法,请参阅使用条件转发从本地访问 DNS 记录
  • 熟悉当前的 DNS 软件,并识别您的组织中专用的域名。
  • 找出网络团队中能够确保流量正确路由到 Cloud DNS 服务器的联系人。
  • 熟悉您的混合连接策略以及混合云和多云模式及做法。

创建一种简单、一致的命名标准

创建一种在您的组织中用法一致且易于记忆的命名标准。例如,假设您的组织使用 example.com 作为其二级域名和公共资源的域名(例如 www.example.com)。对于本文档而言,托管公开区域的位置无关紧要,因为其范围是迁移专用区域。

如需为本地企业资源命名,您可以选择以下模式:

  • 您可以为本地服务器和 Google Cloud 设置独立的域名。此模式针对不同的环境使用单独的网域,例如,本地服务器使用 corp.example.com,Google Cloud 上的所有资源则使用 gcp.example.com。如果您使用其他公有云环境,则每个环境都可以有一个单独的子网域。这是首选模式,因为在环境之间转发请求很简单。

    您也可以使用单独的域名,例如 example.comexample.cloud

  • 您可以将 Google Cloud 网域作为包含本地服务器的网域的子网域。如果使用 example.com 网域,则本地服务器可以使用 corp.example.com,而 Google Cloud 可以使用 gcp.corp.example.com。当大多数资源保留在本地时,这是一种常见的模式。

  • 您可以将本地网域作为包含 Google Cloud 记录的网域的子网域。使用 example.com 网域时,Google Cloud 可以使用 corp.example.com,本地可以使用 dc.corp.example.com。这是一种不常见的模式,但它可能适用于本地资源较少的数字化组织。

  • 您可以为 Google Cloud 和本地服务器使用同一网域。在这种情况下,Google Cloud 和本地服务器所用资源都使用 corp.example.com 网域。避免使用这种模式,因为它会使混合环境中的记录管理变得更困难;只有当您使用单独的权威 DNS 系统时,这种模式才可能适用。

本页面的其余部分使用以下域名:

  • example.com 用作公共记录(无论托管在何处)的域名。
  • corp.example.com 用作由您的本地 DNS 服务器托管的区域。此区域托管您的本地资源的记录。
  • gcp.example.com 用作托管 Google Cloud 资源的记录的 Cloud DNS 专用代管区域。

下图展示了这种安排。

设置域名的示例(点击可放大)。
设置域名的示例(点击可放大)

如需为 Virtual Private Cloud (VPC) 网络中的资源命名,您可以遵循相应的准则,如解决方案指南 VPC 设计的最佳做法和参考架构中的准则。

选择执行 DNS 解析的位置

在混合环境中,DNS 解析可以在不同的位置执行。您可以执行以下操作:

  • 采用使用两个权威 DNS 系统的混合方法。
  • 在本地进行 DNS 解析。
  • 将所有 DNS 解析移至 Cloud DNS。

我们建议使用混合方法,因此本文档重点介绍了此方法。但是,为了完整起见,本文档也简要介绍了其他方法。

采用使用两个权威 DNS 系统的混合方法

我们建议采用使用两个权威 DNS 系统的混合方法。在此方法中:

  • 您的专用 Google Cloud 环境的权威 DNS 解析由 Cloud DNS 完成。
  • 本地资源的权威 DNS 解析由本地现有的 DNS 服务器托管。

下图展示了这种安排。

具有两个权威 DNS 系统的混合架构(点击可放大)。
具有两个权威 DNS 系统的混合架构(点击可放大)

此方案是首选使用场景。本文档后面会进行以下详细介绍:

  • 如何在使用专用区域和 DNS 转发的环境之间设置转发。
  • 如何配置防火墙和路由。
  • 展示如何使用一个或多个 VPC 网络的参考架构。

在本地进行 DNS 解析

另一种方法是继续使用现有的本地 DNS 服务器以权威方式托管所有内部域名。在这种情况下,您可以使用备用域名服务器,通过出站 DNS 转发功能转发来自 Google Cloud 的所有请求。

此方法具有以下优势:

  • 您对业务流程所做的更改较少。
  • 您可以继续使用现有工具。
  • 您可以使用拒绝列表在本地过滤单独的 DNS 请求。

不过,它具有以下缺点:

  • 来自 Google Cloud 的 DNS 请求的延迟时间较长。
  • 您的系统依靠与本地环境的连接来进行 DNS 操作。
  • 您可能会发现集成灵活性较高的环境有困难,例如自动扩缩的实例组。
  • 系统可能与 Dataproc 等产品不兼容,因为这些产品依赖于 Google Cloud 实例名称的反向解析。

将所有 DNS 解析移至 Cloud DNS

另一种方法是迁移到 Cloud DNS,作为所有网域解析的权威服务。然后,您可以使用专用区域和入站 DNS 转发功能将您现有的本地名称解析迁移到 Cloud DNS。

此方法具有以下优势:

  • 您无需在本地维护高可用性 DNS 服务。
  • 系统可以通过 Cloud DNS 来利用集中式日志记录和监控功能。

不过,它具有以下缺点:

  • 来自本地的 DNS 请求具有较高的延迟时间。
  • 您的系统需要稳定连接到您的 VPC 网络才能进行名称解析。

Cloud DNS 专用区域的最佳做法

专用地区托管的 DNS 记录仅在您的组织内部可见。本文档不介绍 Cloud DNS 上的公开区域。公开区域涵盖组织的公开记录,例如公开网站的 DNS 记录,并且在混合设置中不具有相关性。

使用自动化功能管理共享 VPC 宿主项目中的专用区域

如果您在组织内使用共享 VPC 网络,则必须在宿主项目中托管 Cloud DNS 上的所有专用区域。所有服务项目都可以自动访问附加到共享 VPC 网络的专用区域中的记录。

下图展示了专用区域在共享 VPC 网络中的托管方式:

托管在共享 VPC 网络中的专用区域(点击可放大)。
托管在共享 VPC 网络中的专用区域(点击可放大)

如果您希望团队设置各自的 DNS 记录,我们建议您自动创建 DNS 记录。例如,您可以创建 Web 应用或内部 API,供用户在特定子网域下设置自己的 DNS 记录。该应用会验证这些记录是否符合您的组织的规则。

或者,您可以将您的 DNS 配置以 TerraformCloud Deployment Manager 描述符的形式放入代码库,如 Cloud Source Repositories,并接受来自团队的拉取请求。

在这两种情况下,宿主项目中具有 IAM DNS Administrator 角色的服务帐号都可以在更改获得批准后自动部署这些更改。

使用最小权限原则设置 IAM 角色

使用最小权限安全原则,仅向组织中需要执行此任务的人员授予更改 DNS 记录的权限。避免使用基本角色,因为这些角色可能会为用户授予超出所需的资源访问权限。Cloud DNS 提供权限和角色,允许您授予特定于 DNS 的读取和写入权限。

如果必须将创建专用 DNS 区域的功能与创建公开区域的功能分开,请使用 dns.networks.bindPrivateDNSZone 权限。

DNS 转发区域和服务器政策的最佳做法

Cloud DNS 提供 DNS 转发区域DNS 服务器政策,以允许在您的本地和 Google Cloud 环境之间查找 DNS 名称。您可以通过多种方式配置 DNS 转发。以下部分列出了混合 DNS 设置的最佳做法。混合 DNS 的参考架构对这些最佳做法进行了说明。

使用转发区域查询本地服务器

为确保您可以在本地环境中查询 DNS 记录,请为公司资源在本地使用的网域设置转发区域(例如,corp.example.com)。这种方法优于使用启用备用域名服务器的 DNS 政策。它会保留对 Compute Engine 内部 DNS 名称的访问权限,并且仍然可以通过本地域名服务器解析公共 IP 地址,无需额外的跃点。

使用此设置的流量显示在混合 DNS 的参考架构中。

只有在所有 DNS 流量都需要在本地进行监控或过滤,且专用 DNS 日志记录不能满足您的要求时,才能使用备用域名服务器。

使用 DNS 服务器政策允许来自本地的查询

如需允许本地主机查询托管在 Cloud DNS 专用区域(例如 gcp.example.com)中的 DNS 记录,请使用入站 DNS 转发功能创建 DNS 服务器政策。通过入站 DNS 转发功能,您的系统可以查询项目中的所有专用区域以及内部 DNS IP 地址和对等互连区域。虽然每个子网都有单独的入站转发 IP 地址,但所有 DNS 查询均返回相同的响应,延迟时间没有差异。您的应用可以向其中的任何 IP 地址发送请求。

使用此设置的流量显示在混合 DNS 的参考架构中。

打开 Google Cloud 和本地防火墙以允许 DNS 流量

通过执行以下操作,确保 DNS 流量不会在 VPC 网络或本地环境中的任何位置过滤掉:

  • 确保本地防火墙通过 Cloud DNS 传递查询。Cloud DNS 发送来自 IP 地址范围 35.199.192.0/19 的查询。DNS 使用 UDP 端口 53 或 TCP 端口 53,具体取决于请求或响应的大小。

  • 确保您的 DNS 服务器未阻止查询。如果您的本地 DNS 服务器只接受来自特定 IP 地址的请求,请确保包含 IP 范围 35.199.192.0/19

  • 确保流量可以从本地流向您的转发 IP 地址。 对于入站转发,请确保本地防火墙不会阻止流量从本地 DNS 服务器或其他客户端流向转发 IP 地址。您可能需要为本地防火墙创建防火墙规则,允许来自 UDP 端口 53 上所有客户端的流量流向转发 IP 地址。

使用条件转发从本地访问 DNS 记录

如需借助 Cloud DNS 访问本地企业 DNS 服务器上托管的专用记录,您只能使用转发区域。但是,根据您使用的 DNS 服务器软件,您可以通过多种方式从本地访问 Google Cloud 中的 DNS 记录。在每种情况下,都使用入站 DNS 转发功能访问记录:

  • 条件转发使用条件转发意味着您企业的 DNS 服务器会将对特定区域或子网域的请求转发到 Google Cloud 上的转发 IP 地址。我们推荐这种方法,因为它是最简单的方法,可让您集中监控企业 DNS 服务器上的所有 DNS 请求。

  • 委托。如果 Google Cloud 上的专用区域是您在本地使用的区域的子网域,您还可以在该区域中设置 NS 条目,将该子网域委派给 Google Cloud 域名服务器。如果您使用此设置,则客户端可以直接与 Google Cloud 上的转发 IP 地址通信,因此请确保防火墙会传递这些请求。

  • 区域转移。Cloud DNS 不支持区域转移,因此您无法使用区域转移将 DNS 记录与您的本地 DNS 服务器同步。

使用 DNS 对等互连避免来自多个 VPC 网络的出站转发

请勿使用从多个 VPC 网络到本地 DNS 服务器的出站转发,因为这会导致返回流量出现问题。只有在您的 DNS 服务器被路由到发出查询的 VPC 网络时,Google Cloud 才会接受这些响应。但是,来自任何 VPC 网络的查询都具有与来源相同的 IP 范围 35.199.192.0/19。因此,除非您在本地拥有单独的环境,否则响应无法正确路由。

下图说明了具有多个 VPC 网络进行出站转发的问题。

多个 VPC 网络进行出站转发的问题(点击可放大)。
多个 VPC 网络进行出站转发的问题(点击可放大)

建议您指定一个 VPC 网络,以使用出站转发功能查询本地域名服务器。然后,其他 VPC 网络可以使用 DNS 对等互连区域定位指定的 VPC 网络,以查询本地域名服务器。然后,这些查询会根据指定 VPC 网络的 VPC 名称解析顺序,转发到本地域名服务器。混合 DNS 的参考架构展示了此设置。

了解 DNS 对等互连与 VPC 网络对等互连之间的区别

VPC 网络对等互连与 DNS 对等互连不同。VPC 网络对等互连允许多个项目中的虚拟机 (VM) 实例相互访问,但不会更改名称解析。每个 VPC 网络中的资源仍然遵循各自的解析顺序。

相反,通过 DNS 对等互连,您可以允许将特定区域的请求转发到另一个 VPC 网络。这样,无论 VPC 网络是否互连,您都可以将请求转发到其他 Google Cloud 环境。

VPC 网络对等互连和 DNS 对等互连的设置也有所不同。 对于 VPC 网络对等互连,这两个 VPC 网络都需要与其他 VPC 网络建立对等互连关系。然后,对等互连会自动变成双向对等互连。

DNS 对等互连单向转发 DNS 请求,并且不需要 VPC 网络之间的双向关系。被称为 DNS 使用方网络的 VPC 网络会对另一个称为 DNS 提供方网络的 VPC 网络中的 Cloud DNS 对等互连区域执行查找。拥有提供方网络中项目的 IAM 权限 dns.networks.targetWithPeeringZone 的用户可以在使用方网络和提供方网络之间建立 DNS 对等互连。如需设置来自使用方 VPC 网络的 DNS 对等互连,您需要具有提供方 VPC 网络的宿主项目的 DNS 对等角色。

如果您使用自动生成的名称,请为内部区域使用 DNS 对等互连

如果您为内部 DNS 服务创建的虚拟机使用自动生成的名称,则可以使用 DNS 对等互连将 projectname.internal 区域转发到其他项目。您可以汇聚中心项目中的所有 .internal 区域,使其可用于本地。

下图展示了此设置。

网格设置中的 DNS 对等互连(点击可放大)。
网格设置中的 DNS 对等互连(点击可放大)

如果您遇到问题,请参阅问题排查指南

Cloud DNS 问题排查指南提供了解决您在设置 Cloud DNS 时可能会遇到的常见错误的说明。

混合 DNS 的参考架构

本部分为混合环境中使用 Cloud DNS 专用区域的常见场景提供了一些参考架构。在每种情况下,本地资源记录和 Google Cloud 资源记录以及区域都是在环境中进行管理的。所有记录均可供本地主机和 Google Cloud 主机进行查询。

使用与您的 VPC 网络设计对应的参考架构:

  • 使用单个共享 VPC 网络的混合架构:使用与本地环境互连的单个 VPC 网络。

  • 使用多个独立 VPC 网络的混合架构:通过不同的 VPN 隧道或 VLAN 连接将多个 VPC 网络连接到本地环境,并在本地共享同一个 DNS 基础架构。

  • 使用中心 VPC 网络连接到辐射 VPC 网络的混合架构:使用 VPC 网络对等互连将中心 VPC 网络连接到多个独立的辐射 VPC 网络。

在每种情况下,本地环境通过一个或多个 Cloud VPN 隧道、专用互连或合作伙伴互连连接来连接到 Google Cloud VPC 网络。这与每个 VPC 网络使用的连接方法无关。

使用单个共享 VPC 网络的混合架构

最常见的使用场景是连接到本地环境的单个共享 VPC 网络,如下图所示。

使用单个共享 VPC 网络的混合架构(点击可放大)。
使用单个共享 VPC 网络的混合架构(点击可放大)

如需设置此架构,请执行以下操作:

  1. 将本地 DNS 服务器设置为 corp.example.com 的权威服务器。
  2. 在共享 VPC 网络的宿主项目中,在 Cloud DNS 上配置权威专用区域(例如 gcp.example.com),并为该区域中的资源设置所有记录。
  3. 在宿主项目上为共享 VPC 网络设置 DNS 服务器政策,以允许入站 DNS 转发。
  4. 设置将 corp.example.com 转发到本地 DNS 服务器的 DNS 转发区域。共享 VPC 网络需要获得授权才能查询转发区域。
  5. 在您的本地 DNS 服务器上设置到 gcp.example.com 的转发,指向共享 VPC 网络中的入站转发 IP 地址。
  6. 确保您的本地防火墙允许 DNS 流量。
  7. 在 Cloud Router 路由器实例中,将范围 35.199.192.0/19 的自定义路由通告添加到本地环境。

使用多个独立 VPC 网络的混合架构

混合架构的另一种方式是使用多个独立 VPC 网络。Google Cloud 环境中的这些 VPC 网络不通过 VPC 网络对等互连相互连接。所有 VPC 网络均使用独立 Cloud VPN 隧道或 VLAN 连接来连接到您的本地环境。

这种架构的典型使用场景是您拥有不相互通信但共享 DNS 服务器的独立生产环境和开发环境。

下图展示了此架构。

使用多个独立 VPC 网络的混合架构(点击可放大)。
使用多个独立 VPC 网络的混合架构(点击可放大)

如需设置此架构,请执行以下操作:

  1. 将本地 DNS 服务器设置为 corp.example.com 的权威服务器。
  2. 在生产共享 VPC 网络的宿主项目中,在 Cloud DNS 上配置专用区域(如 prod.gcp.example.com),并为该区域中的资源设置所有记录。
  3. 在开发共享 VPC 网络的宿主项目中,在 Cloud DNS 上配置专用区域(如 dev.gcp.example.com),并为该区域中的资源设置所有记录。
  4. 在宿主项目上为生产共享 VPC 网络设置 DNS 服务器政策,并允许入站 DNS 转发。
  5. 在生产共享 VPC 网络中,设置 DNS 地区,将 corp.example.com 转发到本地 DNS 服务器。
  6. example.com 设置从开发共享 VPC 网络到生产共享 VPC 网络的 DNS 对等互连地区。
  7. dev.gcp.example.com 设置从生产共享 VPC 网络到开发共享 VPC 网络的 DNS 对等互连区域。
  8. 在您的本地 DNS 服务器上设置到 gcp.example.com 的转发,指向生产共享 VPC 网络中的入站转发 IP 地址。
  9. 确保防火墙允许本地和 Google Cloud 防火墙上的 DNS 流量。
  10. 在 Cloud Router 路由器实例中,将生产共享 VPC 网络中的 IP 范围 35.199.192.0/19 的自定义路由通告添加到本地环境。

使用中心 VPC 网络连接到辐射 VPC 网络的混合架构

另一种方法是使用 Cloud Interconnect 或 Cloud VPN 将本地基础架构连接到单个中心 VPC 网络。您可以使用 VPC 网络对等互连将此 VPC 网络与多个辐射 VPC 网络进行对等互连。每个辐射 VPC 网络在 Cloud DNS 上托管自己的专用区域。VPC 网络对等互连上的自定义路由以及 Cloud Router 上的自定义路由通告允许本地和所有辐射 VPC 网络之间进行完整的路由交换和连接。DNS 对等互连与 VPC 网络对等互连并行运行,以允许环境之间的名称解析。

下图展示了此架构。

使用中心 VPC 网络连接到辐射 VPC 网络的混合架构(点击可放大)。
使用中心 VPC 网络连接到辐射 VPC 网络的混合架构(点击可放大)

如需设置此架构,请执行以下操作:

  1. 将本地 DNS 服务器设置为 corp.example.com 的权威服务器。
  2. 在 Cloud DNS 上为每个辐射 VPC 网络配置专用区域(如 projectX.gcp.example.com),并为该区域中的资源设置所有记录。
  3. 在中心项目上为生产共享 VPC 网络设置 DNS 服务器政策,以允许入站 DNS 转发。
  4. 在中心 VPC 网络中,为 corp.example.com 创建专用 DNS 区域,并配置到本地 DNS 服务器的出站转发。
  5. projectX.gcp.example.com 设置从中心 VPC 网络到每个辐射 VPC 网络的 DNS 对等互连区域。
  6. example.com 设置从每个辐射 VPC 网络到中心 VPC 网络的 DNS 对等互连区域。
  7. 在您的本地 DNS 服务器上设置到 gcp.example.com 的转发,指向中心 VPC 网络中的入站转发 IP 地址。
  8. 确保防火墙允许本地和 Google Cloud 防火墙上的 DNS 流量。
  9. 在 Cloud Router 路由器实例中,将中心 VPC 网络中的 IP 范围 35.199.192.0/19 的自定义路由通告添加到本地环境。
  10. (可选)如果您还使用自动生成的内部 DNS 名称,请将每个辐射项目区域(如 spoke-project-x.internal)与中心项目进行对等互连,并转发来自本地对 .internal 的所有查询。

后续步骤

  • 如需了解您在使用 Cloud DNS 时可能会遇到的常见问题的解决方案,请参阅问题排查
  • 如需寻找方法并了解如何实现使用 Google Cloud 的混合设置,请参阅解决方案指南混合云和多云模式及做法
  • 如需试用其他 Google Cloud 功能,请参阅我们的教程