使用协议转发

Compute Engine 支持协议转发,使您能够创建可向非 NAT 目标实例发送数据包的转发规则对象。每个目标实例均包含一个虚拟机 (VM) 实例,该虚拟机实例可接收并处理来自相应转发规则的流量。

协议转发适用于很多种情况,具体如下:

  • 通过 IP 地址进行虚拟托管

    您可以将多条转发规则设置为指向单个目标实例,这样您就可以在一个虚拟机实例中使用多个外部 IP 地址。如果您希望只使用一个虚拟机实例但通过不同的外部 IP 地址来传送数据,便可使用此功能。这对于设置 SSL 虚拟托管特别有用。

  • 虚拟专用网 (VPN)

    请参阅:

  • 专用 VIP

    协议转发可用于专用区域转发规则(这些转发规则具有专用 (RFC 1918) 地址)。 您可以利用此功能配置专用转发规则,将 TCP 或 UDP 流量发送到同一区域中的目标实例。还可将专用区域转发规则从使用目标实例切换到后端服务,或从后端服务切换到使用目标实例。

  • 负载平衡

    如需了解如何将流量转发到负载平衡器,请参阅转发规则概念

对于通过 IP 地址进行虚拟托管、虚拟专用网 (VPN) 和负载平衡,Compute Engine 支持以下协议的协议转发:

对于专用 VIP,仅支持 TCP 和 UDP:

协议转发与负载平衡服务的费率相同。 如需了解详情,请参阅价格页面。

准备工作

  • 确保您拥有正确的权限来创建转发规则

  • 请确保 Cloud IAM Conditions 并没有仅允许成员创建内部转发规则的成员资格授予条件限制。如果存在此类情况,则创建转发规则会因权限错误而失败。

如需了解详情,请参阅访问权限控制概览

快速入门

本快速入门假设您熟悉 bash

如需创建一条将流量发送到单个实例的转发规则,您必须执行以下操作:

  1. 创建目标实例

    您的目标实例是单个虚拟机实例,但此实例可以在您创建目标实例时存在,也可以在之后创建。

  2. 创建转发规则

    在您创建转发规则前,目标实例必须已经存在。如果传入的数据包与转发规则所处理的 IP 地址、协议和(如果适用)端口范围相匹配,则转发规则会将该流量定向到您的目标实例。

本快速入门的其余部分通过以下方式详细演示了上述步骤:

  1. 在虚拟机实例上设置 Apache 服务器。
  2. 创建目标实例和相应的转发规则
  3. 将流量发送到单个目标实例

在本快速入门结束时,您应该就会了解如何设置从多条转发规则到单个目标实例的协议转发。

设置虚拟机实例并安装 Apache

如需创建一个安装了 Apache 的虚拟机实例,请执行以下操作:

  1. 为您的新实例创建一些启动脚本

    您的启动脚本内容可能会有所不同,具体取决于您的操作系统。

    • 如果您打算在您的实例上使用 Debian 映像,请运行以下命令:

          me@local:~$ echo "sudo apt-get update && sudo apt-get -y install apache2 && mkdir -p /var/www1 &&
          mkdir -p /var/www2 && mkdir -p /var/www3 && hostname > /var/www/html/index.html &&
          echo w1 > /var/www1/index.html && echo w2 > /var/www2/index.html && echo w3 > /var/www3/index.html" > 
      $HOME/pf_startup.sh

    • 如果您打算在您的实例上使用 CentOS 映像,请运行以下命令:

          me@local:~$ echo "sudo yum -y install httpd && sudo service httpd restart && mkdir -p /var/www1 &&
          mkdir -p /var/www2 && mkdir /var/www3 && hostname > /var/www/html/index.html &&
          echo w1 > /var/www1/index.html && echo w2 > /var/www2/index.html && echo w3 > /var/www3/index.html" > 
      $HOME/pf_startup.sh

  2. 为将来的虚拟机创建一个标记,以便今后对其应用防火墙

        me@local:~$ TAG="www-tag"
        
  3. 创建一个虚拟机实例来为转发规则处理流量:

    gcloud compute instances create pf-instance \
            --image-project debian-cloud --image-family debian-9 --tags $TAG \
            --metadata-from-file startup-script=$HOME/pf_startup.sh
        
  4. 创建一条防火墙规则以允许外部流量进入此虚拟机实例:

    gcloud compute firewall-rules create www-firewall --target-tags $TAG --allow tcp
        

您已成功设置虚拟机实例。现在就可以开始设置您的协议转发配置了。

创建目标实例和相应的转发规则

  1. 创建目标实例

    目标实例包含单个虚拟机实例,可接收并处理来自转发规则的流量。目标实例没有 NAT 政策,因此您可直接通过 IPsec 协议用它们设置专用的 VPN 连接。

    您必须先创建目标实例,然后才能创建转发规则对象,因为转发规则必须引用现有的目标资源。 您无法创建将流量导向不存在的目标资源的转发规则。在本示例中,请按如下方式创建一个目标实例:

    gcloud compute target-instances create pf-target-instance --instance pf-instance
        
  2. 创建转发规则对象

    转发规则对象会将与 IP 协议和端口匹配的流量导向指定的目标实例。如需了解详情,请参阅转发规则文档。

    在本示例中,以下命令将创建三条转发规则,每条规则都有一个临时 IP 地址,用于将 TCP 流量转发给目标实例。或者,如果您有一些静态外部 IP 地址,则可以将这些 IP 地址与这些转发规则一起使用,只需指定 --address IP-ADDRESS 标志即可。

    gcloud compute forwarding-rules create pf-rule1 --ip-protocol TCP \
            --ports 80 --target-instance pf-target-instance
        
    gcloud compute forwarding-rules create pf-rule2 --ip-protocol TCP \
            --ports 80 --target-instance pf-target-instance
        
    gcloud compute forwarding-rules create pf-rule3 --ip-protocol TCP \
            --ports 80 --target-instance pf-target-instance
        

您可以开始向目标实例发送流量。

将流量发送到您的实例

  1. 获取新转发规则的外部 IP 地址

    运行 gcloud compute forwarding-rules list 可获取转发规则的外部 IP 地址。例如,下表列出了为先前创建的转发规则分配的临时 IP 地址。

    如果您已选择使用预留的 IP 地址,那么此处会列出这些预留地址,而非临时 IP 地址。

    gcloud compute forwarding-rules list
        
        NAME     REGION      IP_ADDRESS     IP_PROTOCOL TARGET
        pf-rule1 us-central1 [ADDRESS_1]    TCP         us-central1-a/targetInstances/pf-target-instance
        pf-rule2 us-central1 [ADDRESS_2]    TCP         us-central1-a/targetInstances/pf-target-instance
        pf-rule3 us-central1 [ADDRESS_3]    TCP         us-central1-a/targetInstances/pf-target-instance

    记下这些 IP 地址,以供下一步操作使用。

  2. 根据目标网址配置虚拟机实例的 Apache 虚拟主机,以处理不同的信息

    首先,连接到您的实例:

    gcloud compute ssh pf-instance
        

    然后,修改 /etc/apache2/sites-enabled/000-default.conf 文件并添加以下行。对于 VirtualHost 行,请使用您在执行上一步时看到的 IP 地址。

    <VirtualHost [ADDRESS_1]>
         DocumentRoot /var/www1
         <Directory /var/www1>
          Require all granted
         </Directory>
        </VirtualHost>
        <VirtualHost [ADDRESS_2]>
         DocumentRoot /var/www2
         <Directory /var/www2>
          Require all granted
         </Directory>
        </VirtualHost>
        <VirtualHost [ADDRESS_3]>
         DocumentRoot /var/www3
         <Directory /var/www3>
          Require all granted
         </Directory>
        </VirtualHost>
        

    最后,重启 Apache:

        user@myinst:~$ sudo /etc/init.d/apache2 restart
        
  3. 尝试将一些流量发送到您的实例

    在您的本地机器上,向由您创建的转发规则所处理的外部 IP 地址发出请求。

    使用 curl 将流量发送到这些 IP 地址。响应会返回 w1w2w3,具体取决于 IP 地址。

        me@local:~$curl [ADDRESS_1]
        w1
        
        me@local:~$ curl [ADDRESS_2]
        w2
        
        me@local:~$ curl [ADDRESS_3]
        w3
        

    您的协议转发配置已准备就绪。

转发规则

转发规则与目标池和目标实例配合支持负载平衡和协议转发功能。如需使用负载平衡和协议转发,您必须创建一条将流量导向特定的目标池(用于负载平衡)或目标实例(用于协议转发)的转发规则。如果没有转发规则,这些功能均无法使用。

转发规则资源位于转发规则集合中。每条转发规则都会将特定的 IP 地址、协议和(可选)端口范围与单个目标池或目标实例相匹配。当流量被发送到由某条转发规则处理的外部 IP 地址时,该转发规则会将这些流量导向相应的目标池或目标实例。每个项目最多可以创建 50 个转发规则对象。

处理转发规则时,请注意以下事项:

  • 转发规则的名称在此项目中必须是唯一的,长度为 1-63 个字符,并且符合 [a-z]([-a-z0-9]*[a-z0-9])? 正则表达式。这意味着第一个字符必须是小写字母,后面所有字符必须是短划线、小写字母或数字,但最后一个字符不能是短划线。

  • 如果您未指定转发规则协议,则系统会使用默认的 TCP。 另请注意,某些协议只能用于目标池或目标实例:

    • 如果您使用 ESPAHSCTPICMP,则必须指定一个目标实例。在使用这些协议时,您无法指定目标池。
    • 如果您使用 TCPUDP,则可以指定目标池目标实例
  • 只能为 TCPUDPSCTP 协议指定端口范围。

添加转发规则

如需添加新的转发规则,您可以使用 gcloud compute forwarding-rules create 命令或创建向转发规则集合发送的 HTTP POST 请求。 以下示例显示了如何使用 gcloud 命令行工具创建一条指向目标实例的转发规则:

gcloud compute forwarding-rules create [FORWARDING_RULE] \
        --load-balancing-scheme internal | external \
        --region [REGION] \
        [--target-instance-zone [ZONE]] \
        --ip-protocol TCP --ports 80 \
        --target-instance [TARGET_INSTANCE]
    

如果您省略 --target-instance-zone 标志,则 gcloud 命令行工具会提示您选择一个地区(如果您未通过 gcloud config set compute/zone 设置 compute/zone 属性)。如需了解详情,请参阅设置默认地区或区域

对于内部负载平衡方案,gcloud compute forwarding-rules create 命令支持将目标实例设置为目标。

以下示例演示了如何创建指向目标池的转发规则:

gcloud compute forwarding-rules create [FORWARDING_RULE] \
        --target-pool [TARGET_POOL] \
        [--region [REGION]]
    

如果您省略 --region 标志,则 gcloud 命令行工具会提示您选择一个区域(如果您未通过 gcloud config set compute/region 设置 compute/region 属性)。如需了解详情,请参阅设置默认地区或区域

如需查看可用标志的完整说明,请参阅转发规则 create 命令,或输入 gcloud compute forwarding-rules create --help

如需通过 API 添加转发规则,请向以下 URI 发出 HTTP POST 请求:

https://compute.googleapis.com/compute/v1/projects/myproject/regions/us-central1/forwardingRules
    

您的请求正文应该包含以下字段:

{
     "name": "example-forwarding-rule",
     "IPAddress": "`10.1.1.1",
     "IPProtocol": "TCP",
     "portRange": "80",
     "target": "zones/us-central1-f/targetInstances/example-target-instances"
    }
    

如需了解如何列出转发规则、获取特定转发规则的相关信息和删除转发规则,请参阅 gcloud SDK 和 API 参考文档页面:

目标实例

目标实例资源包含一个虚拟机实例,该实例可处理来自一条或多条转发规则的流量,且非常适合转发应由单个来源(例如 ESPAH)管理的某些类型的协议流量,但您也可以将目标实例用于 TCPUDP 协议。 目标实例没有应用 NAT 政策,因此可将其用于虚拟专用网 (VPN) 中需要非 NAT IPsec 流量的流量。

目标实例必须与转发规则位于同一区域,还必须与虚拟机实例位于同一地区。例如,如果您的转发规则位于 us-central1,而您要使用的实例位于 us-central1-a,则目标实例必须位于 us-central1-a。如果您要使用的实例位于 us-central1-b,则目标实例也必须位于 us-central1-b

添加目标实例

如需添加新的目标实例,您可以使用 gcloud compute target-instances 命令或创建向目标实例集合发送的 HTTP POST 请求。无法使用 Cloud Console 创建目标实例资源。以下示例展示了如何使用 gcloud 命令行工具创建目标实例:

gcloud compute target-instances create [TARGET_INSTANCE] --instance INSTANCE
    

如果您省略 --zone 标志,则 gcloud 命令行工具会提示您选择一个地区(如果您未通过 gcloud config set compute/zone 设置 compute/zone 属性)。如需了解详情,请参阅设置默认地区或区域

如需查看可用标志的完整说明,请参阅 create 命令,或输入 gcloud compute target-instances create --help

在 API 中,向以下 URI 发出 HTTP POST 请求:

https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-f/targetInstances
    

采用以下请求正文:

body = {
      "name": "example-target-instance",
      "instance": "zones/us-central1-f/instances/example-instance"
    }
    

如需了解如何列出目标实例、获取特定目标实例的相关信息和删除目标实例,请参阅 gcloud SDK 和 API 参考文档页面:

用于专用 VIP 的协议转发

协议转发可用于具有专用 (RFC 1918) 地址的专用区域转发规则。 您可以利用此功能配置专用转发规则,将 TCP 或 UDP 流量发送到同一区域中的目标实例。还可轻松将专用区域转发规则从使用目标实例切换到后端服务,或从后端服务切换到使用目标实例。

目标实例包含一个后端实例,该实例处理来自一条或多条转发规则的流量。您只能配置指向每个目标实例的一条专用转发规则。

具有目标实例的专用转发规则(点击放大)。
具有目标实例的专用转发规则(点击放大)

在以下情况下,可将协议转发用于专用转发规则。

  • 您要为自己的服务部署单个后端实例,且希望自行管理运行状况检查和其他方面。
  • 您希望保留转发规则专用 IP 地址,并且要更改转发规则指向的目标实例。
  • 您希望在不改变专用转发规则 IP 地址的情况下,从单个实例(目标实例)轻松移到多个后端实例(后端服务),从而使部署保持稳定状态。

目标实例与后端服务之间的转换

您可以更新专用转发规则,即从将流量导向具有单个虚拟机实例的目标实例,更新为将流量导向某个后端服务(反之亦然)。您以这种方式更新专用转发规则时,系统将保留转发规则 IP 地址。在此转换期间,现有连接可能中断,因为此更改会启用或停用后端服务实例的负载平衡。

从后端服务转换到目标实例(点击放大)。
从后端服务转换到目标实例(点击放大)

您只能通过专用转发规则在目标实例和后端服务之间转换,而无法通过使用外部转发规则的协议转发来执行此操作。

更新专用转发规则的目标

如果您的转发规则是专用转发规则,您可从指向目标实例更改为指向后端服务:

    gcloud compute forwarding-rules set-target my-forwarding-rule
            --backend-service my-backend-service
    

然后,您可以转换回目标实例:

    gcloud compute forwarding-rules set-target my-forwarding-rule
            --target-instance my-target-instance
    

对专用转发规则的协议转发进行问题排查

区域限制

专用转发规则的协议转发是一种区域性产品。 所有客户端和目标实例虚拟机必须位于同一区域中。

错误消息:“An internal target instance can only be the target of one forwarding rule”(一个内部目标实例只能是一条转发规则的目标)

如果您看到错误消息“An internal target instance can only be the target of one forwarding rule”,则说明您可能正试图将两条转发规则配置为指向同一目标实例。您不能将多条转发规则指向同一目标实例。

限制

  • 当您通过专用转发规则使用目标实例时,唯一支持的协议是 TCP 和 UDP。

限制

  • 您可以配置 100 条专用转发规则来指向每个网络的目标实例。

  • 您可以为每条专用转发规则配置 5 个端口。