使用协议转发

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

协议转发可用于多种情况下,包括:

  • 通过 IP 进行虚拟托管

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

  • 虚拟专用网 (VPN)

    如需了解如何将转发规则用于 VPN,请参阅 VPN

  • **专用 VIP**

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

  • 负载平衡

    请参阅负载平衡,了解关于如何将流量转发到负载平衡器的说明。

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

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

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

快速入门

本快速入门假设您熟悉 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 虚拟主机,以提供不同的信息。

    首先,通过 SSH 登录您的实例:

    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 地址。响应将根据 IP 地址返回 w1w2w3

    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://www.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 命令行工具获取转发规则列表,请使用 list 命令:

gcloud compute forwarding-rules list

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

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

获取关于转发规则的信息

要了解使用 gcloud 命令行工具的单个转发规则的相关信息,请使用 describe 命令:

gcloud compute forwarding-rules describe [FORWARDING_RULE] [--region [REGION] | --global]

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

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

https://www.googleapis.com/compute/v1/project/myproject/regions/us-central1/forwardingRules/example-forwarding-rule

更新转发规则目标

如果您已创建了转发规则,但想要更改转发规则使用的目标池,则可以通过 gcloud 命令行工具使用 set-target 命令执行此操作:

gcloud compute forwarding-rules set-target [FORWARDING_RULE] --target-pool [TARGET_POOL] \
    [--region [REGION] | --global]

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

https://www.googleapis.com/compute/v1/projects/myproject/regions/us-central1/forwardingRules/example-forwarding-rule/setTarget

请求正文应包含指向目标实例的 URI 或您想设置的目标池。例如,对于目标池,URI 格式应该是:

{
  "target": "https://www.googleapis.com/compute/v1/projects/myproject/regions/us-central1/targetPools/example-target-pool"
}

删除多条转发规则

要通过 gcloud 命令行工具删除转发规则,请使用 delete 命令:

gcloud compute forwarding-rules delete [FORWARDING_RULE] [--region [REGION] | --global]

要从 API 中删除转发规则,请将 HTTP DELETE 请求发送到含有空请求正文的以下 URI:

https://www.googleapis.com/compute/v1/project/myproject/regions/us-central1/forwardingRules/example-forwarding-rule

目标实例数

目标实例资源包含一个虚拟机实例,该实例可处理来自一条或多条转发规则的流量,且非常适合转发应由单个来源(例如 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 请求。通过 GCP 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://www.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 命令行工具获取目标实例列表,请使用 list 命令:

gcloud compute target-instances list

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

https://www.googleapis.com/compute/v1/projects/myproject/aggregatedList/targetInstances

获取目标实例

要通过 gcloud 命令行工具获取有关单个目标实例的信息,请使用 describe 命令:

gcloud compute target-instances describe [TARGET_INSTANCE]

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

https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-f/targetInstances/<target-instance>

删除目标实例

要删除某个目标实例,您首先必须确保没有任何转发规则引用该实例。如果某个转发规则目前正在引用您要删除的目标实例,则必须删除转发规则以删除引用。

当您撤消任何转发规则对某个目标实例的引用后,可以通过 gcloud 命令行工具使用 delete 命令删除此实例:

gcloud compute target-instances delete [TARGET_INSTANCE]

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

https://www.googleapis.com/compute/v1/projects/myproject/zones/us-central1-f/targetInstances/<target-instance>

用于专用 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 个端口。

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页
Compute Engine 文档