为虚拟机实例创建 PTR 记录


通过可配置的 PTR 记录,您可以定义与虚拟机实例的外部 IP 地址关联的反向 DNS 记录,以使依赖这些记录的应用可以按预期运行。

某些应用需要使用反向 DNS 记录(PTR 记录)才能将 IP 地址解析为域名。例如,采用 SMTP 的应用需要使用指向发送电子邮件所用的网域的 PTR 记录。 如果没有该记录,垃圾邮件过滤器会将电子邮件标记为信誉较低,这将导致电子邮件最终被递送到垃圾邮件文件夹,或根本不会发送。

您只能将 PTR 记录添加到虚拟机实例的主要网络接口。PTR 记录不适用于负载均衡器前端、Cloud NAT 或其他非虚拟机 IP 地址。

仅当实例的主要网络接口连接到具有外部 IPv6 地址范围的双栈子网时,才能使用 IPv6 PTR 记录。在这种情况下,您可以具有单独的 IPv4 和 IPv6 PTR 记录。

如需创建自定义 PTR 记录来替换自动创建的内部 DNS PTR 名称,请参阅代管式反向查找可用区

准备工作

  • 设置身份验证(如果尚未设置)。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以按如下方式向 Compute Engine 进行身份验证。

    选择标签页以了解您打算如何使用本页面上的示例:

    控制台

    当您使用 Google Cloud 控制台访问 Google Cloud 服务和 API 时,无需设置身份验证。

    gcloud

    1. 安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init
    2. 设置默认区域和可用区

    REST

    如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。

      安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init

验证域名所有权

在创建具有自定义 PTR 记录的虚拟机之前,验证您是该域名的所有者。验证所有权是一项安全措施,目的是向 Google 证明您就是域名的所有者。

您可以通过以下两种方式验证域名:

  • 如果您有 Google 账号,则可以使用 Search Console 进行验证。
  • 如果您拥有 Google 或非 Google 账号,则可以通过将虚拟机的 IP 地址添加到 DNS 配置进行验证。

使用 Search Console 进行验证

  1. 打开 Search Console,然后使用您将 PTR 记录添加到实例中所用的 Google 账号登录。当然,您可以使用多个账号验证域名所有权。
  2. 输入 PTR 域名。
  3. 点击继续
  4. 按照说明操作,然后点击 Go to Property(前往属性)。
  5. 点击设置(位于底部附近的左侧菜单中),然后点击所有权验证

验证您对域名的所有权后,请在设置窗格中,点击用户以查看其他经过验证的所有者。如需在其他域名中添加 PTR 记录,请点击左侧的属性选择器以显示当前域名。点击添加属性以添加这些域名。

如果您的域名未立即通过验证,请使用推荐的方法完成验证。

通过将虚拟机的 IP 地址添加到 DNS 配置进行验证

  1. 如果您的虚拟机尚不存在,请预留区域静态外部 IP 地址,并稍后在虚拟机创建期间使用该地址。
  2. 将具有虚拟机外部 IP 地址的 A 记录添加到网域的 DNS 配置。

创建具有 PTR 记录的虚拟机实例

您可以在创建新实例时指定 PTR 记录。如需为现有实例添加 PTR 记录,请参阅添加 PTR 记录

控制台

  1. 在 Google Cloud 控制台中,转到创建实例页面。

    转到“创建实例”

  2. 指定虚拟机详情。

  3. 展开高级选项部分,然后执行以下操作:

    1. 展开网络部分。
    2. 创建一个或多个用于此虚拟机的网络接口。 或者,您也可以使用默认网络接口。
    3. 网络接口部分中,展开第一个网络接口,即主要网络接口。
    4. 公共 DNS PTR 记录部分中,选择要添加的每种 PTR 记录类型。
    5. PTR 域名字段中,为要添加的每种 PTR 记录输入域名。
    6. 外部 IPv4 地址外部 IPv6 地址字段中,选择您之前预留的 IP 地址。如果您已通过 DNS 配置验证虚拟机的 IP 地址,则必须指定该地址。
    7. 要确认网络接口设置,请点击完成
  4. 为新虚拟机配置其余属性。

  5. 点击页面底部的创建

在虚拟机启动后,您可以对虚拟机的外部 IP 地址运行反向 DNS 查找,以确认 PTR 记录是否按预期工作。

gcloud

  • 如需创建具有关联 IPv4 PTR 记录的新实例,请使用 gcloud instances create 命令

    gcloud compute instances create INSTANCE_NAME \
        --image-family IMAGE_FAMILY \
        --image-project IMAGE_PROJECT \
        --public-ptr \
        --public-ptr-domain DOMAIN_NAME \
        --address=IP_ADDRESS
    

    请替换以下内容:

    • INSTANCE_NAME:新虚拟机实例的名称。
    • IMAGE_FAMILY可用映像系列之一。
    • IMAGE_PROJECT:作为所有映像和映像系列引用的解析依据的 Google Cloud 项目。如果您未提供项目名称,则使用当前默认项目。
    • DOMAIN_NAME:要添加到此实例的域名。
    • IP_ADDRESS:您之前预留的 IP 地址。如果您已通过 DNS 配置验证虚拟机的 IP 地址,则必须指定该地址。
  • 如需创建具有关联 IPv6 PTR 记录的新实例,请执行以下操作:

    1. 创建双栈虚拟机
    2. 添加 IPv6 PTR 记录

REST

  • 如需创建具有 IPv4 PTR 记录的新实例,请向 instances.insert 方法发出 POST 请求。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances
    {
      "machineType": "zones/ZONE/machineTypes/MACHINE_TYPE",
      "name": "INSTANCE_NAME",
      "disks": [
        {
          "initializeParams": {
            "sourceImage": "projects/debian-cloud/global/images/family/debian-10"
          },
          "boot": true
        }
      ],
      "networkInterfaces": [
        {
          "network": "NETWORK",
          "accessConfigs": [
            {
              "type": "ONE_TO_ONE_NAT",
              "name": "External NAT",
              "natIP": "IP_ADDRESS",
              "publicPtrDomainName": "DOMAIN_NAME",
              "setPublicPtr": true
            }
          ]
        }
      ]
    }
    

    请替换以下内容:

    • PROJECT_ID:您的项目的 ID。
    • ZONE:您的实例所在的区域。
    • MACHINE_TYPE:机器类型。
    • INSTANCE_NAME:实例的名称。
    • NETWORK:网络的网址。
    • IP_ADDRESS:您之前预留的 IP 地址。如果您已通过 DNS 配置验证虚拟机的 IP 地址,则必须指定该地址。
    • DOMAIN_NAME:要添加的域名。
  • 如需创建具有 IPv6 PTR 记录的新实例,请执行以下操作:

    1. 创建双栈虚拟机
    2. 添加 IPv6 PTR 记录

添加 PTR 记录

您可以通过更新虚拟机实例的主要网络接口 nic0 上的访问权限配置来配置 PTR 记录。

控制台

  1. 在 Google Cloud 控制台中,转到虚拟机实例页面。

    转到虚拟机实例

  2. 点击您要修改的实例。

  3. 点击修改

  4. 网络接口部分中,点击主要网络接口。

  5. 公共 DNS PTR 记录部分中,选择要添加的每种 PTR 记录类型。

  6. PTR 域名字段中,为要添加的每种 PTR 记录输入域名。

  7. 点击完成,然后点击保存

gcloud

  1. 如果您的虚拟机没有访问权限配置,请使用 gcloud compute instances add-access-config 命令添加一个访问权限配置。

    gcloud compute instances add-access-config INSTANCE_NAME
    

    INSTANCE_NAME 替换为您的实例名称。

  2. 使用 gcloud compute instances update-access-config 命令更新访问配置以添加 PTR 记录。如需同时添加 IPv4 和 IPv6 PTR 记录,请使用以下命令。

    • 对于 IPv4:

      gcloud compute instances update-access-config INSTANCE_NAME \
          --public-ptr \
          --public-ptr-domain DOMAIN_NAME
      
    • 对于 IPv6:

      gcloud compute instances update-access-config INSTANCE_NAME \
          --ipv6-public-ptr-domain=DOMAIN_NAME
      

    请替换以下内容:

    • INSTANCE_NAME:要更新的实例的名称。
    • DOMAIN_NAME:要添加的域名。

REST

  1. 如果您的虚拟机没有访问权限配置,请通过向 instances.addAccessConfig 方法发出 POST 请求来添加一个访问权限配置。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME/addAccessConfig?networkInterface="nic0"
    
  2. instances.updateAccessConfig 方法发出 POST 请求,更新访问权限配置以添加 PTR 记录。如需同时添加 IPv4 和 IPv6 PTR 记录,请单独发出以下请求。

    • 对于 IPv4:

      POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME/updateAccessConfig?networkInterface=nic0
      {
        "setPublicPtr": true,
        "publicPtrDomainName": "DOMAIN_NAME",
        "type": "ONE_TO_ONE_NAT"
      }
      
    • 对于 IPv6:

      POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME/updateAccessConfig?networkInterface=nic0
      {
        "publicPtrDomainName": "DOMAIN_NAME",
        "type": "DIRECT_IPV6"
      }
      

    请替换以下内容:

    • PROJECT_ID:项目 ID。
    • ZONE:实例的可用区。
    • INSTANCE_NAME:实例名称。
    • DOMAIN_NAME:要添加的域名。

移除 PTR 记录

如需移除 PTR 记录,请更新虚拟机实例的主要网络接口 nic0 上的访问权限配置。移除 PTR 记录后,Google Cloud 会使用默认的完全限定的域名 googleusercontent.com 响应 DNS 反向查找。

控制台

  1. 在 Google Cloud 控制台中,转到虚拟机实例页面。

    转到虚拟机实例

  2. 点击您要修改的实例。

  3. 点击修改

  4. 网络接口部分中,点击主要网络接口。

  5. 公共 DNS PTR 记录部分中,取消选中要移除的每种 PTR 记录对应的复选框。

  6. 点击完成,然后点击保存

gcloud

如需移除 PTR 记录,请使用 gcloud compute instances update-access-config 命令。如需同时移除 IPv4 和 IPv6 PTR 记录,请单独使用以下命令。

  • 对于 IPv4:

    gcloud compute instances update-access-config INSTANCE_NAME \
        --no-public-ptr
    
  • 对于 IPv6:

    gcloud compute instances update-access-config INSTANCE_NAME \
        --no-ipv6-public-ptr
    

INSTANCE_NAME 替换为要更新的实例的名称。

REST

如需移除 PTR 记录,请向 instances.updateAccessConfig 方法发出 POST 请求。如需同时移除 IPv4 和 IPv6 PTR 记录,请分别发出以下请求。

  • 对于 IPv4:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME/updateAccessConfig?networkInterface=nic0
    {
      "setPublicPtr": false,
      "type": "ONE_TO_ONE_NAT"
    }
    
  • 对于 IPv6:

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/INSTANCE_NAME/updateAccessConfig?networkInterface=nic0
    {
      "publicPtrDomainName": "",
      "type": "DIRECT_IPV6"
    }
    

请替换以下内容:

  • PROJECT_ID:项目 ID。
  • ZONE:实例的可用区。
  • INSTANCE_NAME:实例名称。

限制

  • 当虚拟机在维护事件期间的实时迁移过程中迁移到另一个主机时,PTR 记录逻辑无法正确处理某些边缘情况,并且将 DNS PTR 记录还原为 googleusercontent.com 完全限定域名 (FQDN)。如需恢复功能,请再次应用 PTR 记录。

  • 当您停止具有 IPv6 PTR 记录的虚拟机时,IPv6 PTR 记录会暂时取消注册,并且在虚拟机上不可见。重启虚拟机时,系统会自动重新添加记录。

后续步骤