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 服务器,也可以用于仅在您的网络中可见的专用地区。如需了解详情,请参阅 Cloud DNS 概览
  • Managed Service for Microsoft Active Directory 是运行 Microsoft Active Directory(包含网域控制器)的高可用性安全强化型服务。
  • 公开 DNS是一项 Google 服务,但不属于 Google Cloud,它用作开放的递归 DNS 解析器。
  • Google Domains 是用于购买、转移或管理网域的域名注册商。它是一项 Google 服务,但不属于 Google Cloud。

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

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

  • 找到并联系您的组织的企业 DNS 服务器管理员。请求他们提供所需的配置信息,以便将您的本地配置映射到 Google Cloud 上合适的架构。如需了解详情,请参阅使用条件转发从本地访问 DNS 记录,以了解访问 Google Cloud 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 专用托管地区。

下图展示了这种安排:

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

如需为 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 操作。
  • 您可能会发现集成灵活性较高的环境有困难,例如自动扩缩的实例组。
  • 系统可能与 Cloud 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,并接受来自团队的拉取请求。在这两种情况下,宿主项目中具有 DNS Admin IAM 角色的服务帐号都可以在更改获得批准后自动进行部署。

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

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

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

DNS 转发地区的最佳做法

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

DNS 转发不能用于在不同的 Google Cloud 环境之间转发,无论它们以何种方式互连。对于这种用例,请使用 DNS 对等互连

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

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

参考架构展示了使用此设置的流量。

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

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

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

参考架构展示了使用此设置的流量。

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

确保 DNS 流量不会在您的 VPC 或本地的任何位置被过滤掉。包括:

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

  • 请确保您的 DNS 服务器不会禁止查询。如果您的本地 DNS 服务器只接受来自特定 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 时才会被 GCP 接受。但是,来自任何 VPC 的查询都具有与来源相同的 35.199.192.0/19 IP 范围。因此,除非您在本地拥有完全独立的环境,否则响应无法正确路由。

下图说明了多个 VPC 执行出站转发的问题:

多个 VPC 执行出站转发的问题(点击可放大)
多个 VPC 执行出站转发的问题(点击可放大)

我们建议您指定单个 VPC 以通过出站转发查询本地域名服务器。然后,其他 VPC 可以通过 DNS 对等互连地区定位指定的 VPC 来查询本地域名服务器。然后,系统会根据指定 VPC 的 VPC 名称解析顺序,将其他 VPC 的查询转发到本地域名服务器。参考架构部分展示了此设置。

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

VPC 网络对等互连与 DNS 对等互连不同。VPC 网络对等互连允许多个项目中的虚拟机相互连接,但不会更改名称解析。每个 VPC 中的资源仍遵循各自的解析顺序。相反,通过 DNS 对等互连,您可以允许将特定地区的请求转发到另一个 VPC。这样,无论 VPC 是否互连,您都可以将请求转发到其他 Google Cloud 环境。

VPC 网络对等互连和 DNS 对等互连的设置也有所不同。 对于 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 隧道或 Cloud Interconnect(专用连接或合作伙伴连接)来连接 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 网络中范围 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 中范围 35.199.192.0/19 的自定义路由通告添加到本地。
  10. (可选)如果您还使用自动生成的内部 DNS 名称,请将每个辐射项目地区(如 spoke-project-x.internal)与中心项目进行对等互连,并转发来自本地对 .internal 的所有查询。

后续步骤