协议转发使用区域级转发规则将特定协议的数据包传送到单个虚拟机 (VM) 实例。转发规则可以具有内部或外部 IP 地址。协议转发会传递数据包,同时保留转发规则的目标 IP 地址。转发规则引用名为目标实例的对象,而该对象又引用单个虚拟机实例。
您可以使用协议转发执行以下操作:
- 提供 IP 地址,通过更改目标实例对象引用的虚拟机或更改转发规则引用的目标实例,将 IP 地址从一个实例移动到另一个实例。
- 根据协议和端口将数据包转发到不同的虚拟机。两条转发规则可以共享同一 IP 地址,只要其端口和协议信息是唯一的即可。
- (仅限外部协议转发)为给定网络接口定义其他外部 IP 地址。与外部 IPv4 地址采用 1:1 NAT 配置的网络接口不同,协议转发会保留转发规则的目的地 IP 地址。
- 发送其来源 IP 地址与转发规则的 IP 地址匹配的数据包。
协议转发与直通式负载均衡器的不同之处体现在:
- 无负载均衡。目标实例仅向单个虚拟机分发数据包。
- 不进行健康检查。与后端服务不同,目标实例不支持健康检查。您必须通过其他方式来确保目标软件在目标实例引用的虚拟机上运行和运维。
架构
协议转发使用区域级外部或区域级内部转发规则和可用区级目标实例对象。目标实例及其引用的虚拟机必须位于转发规则所在区域的可用区中。
外部协议转发。您可以将多条转发规则设置为指向单个目标实例,这样您就可以在一个虚拟机实例中使用多个外部 IP 地址。如果您希望只使用一个虚拟机实例但通过不同的外部 IP 地址或不同的协议和端口来处理数据,则可使用此功能。这对于设置 SSL 虚拟托管特别有用。外部协议转发可以处理来自 IPv6 客户端的连接。
外部协议转发支持以下协议:AH、ESP、GRE、ICMP、ICMPv6、SCTP、TCP 和 UDP
下图展示了外部协议转发架构的示例。如需了解如何进行此项设置,请参阅设置外部协议转发。
内部协议转发。内部协议转发使用区域级内部 IPv4 地址(来自子网的主要 IPv4 地址范围)或区域级内部 IPv6 地址(来自 IPv6 子网的地址范围)。
内部协议转发支持 TCP 和 UDP 协议。
下图展示了内部协议转发架构的示例。如需了解如何进行此项设置,请参阅设置内部协议转发。
通过内部协议转发,您可以更改转发规则的目标,以便在直通式负载均衡器的目标实例与后端服务之间切换。如需了解详情,请参阅在目标实例和后端服务之间切换。
转发规则
每个转发规则都会匹配 IP 地址、协议和可选的端口信息(如果指定,并且协议支持端口)。当转发规则引用目标实例时,Google Cloud 会将与转发规则的地址、协议和端口指定匹配的数据包路由到目标实例引用的虚拟机。
内部协议转发:
IPv4 地址支持:子网主要 IPv4 范围内的区域内部 IPv4 地址(预留的静态地址或临时地址)。
支持 IPv6 地址:转发规则引用子网
/64
内部 IPv6 地址范围中的/96
IP 地址范围。该子网必须是ipv6-access-type
设置为INTERNAL
的双栈子网。内部 IPv6 地址仅在高级层级中提供。只有实例支持预留区域内部 IPv6 地址,因此您必须为转发规则使用临时 IPv6 地址。协议选项:
TCP
(默认)和UDP
。端口指定选项:最多包含五个连续或非连续端口或所有端口的列表。
外部协议转发:
支持 IPv4 地址:转发规则引用单个区域级外部 IPv4 地址。区域级外部 IPv4 地址来自每个 Google Cloud 区域独有的池。该 IP 地址可以是预留的静态地址,也可以是临时地址。
支持 IPv6 地址:转发规则引用子网
/64
外部 IPv6 地址范围中的/96
IP 地址范围。该子网必须是ipv6-access-type
设置为EXTERNAL
的双栈子网。 外部 IPv6 地址仅在高级层级中提供。IPv6 地址范围可以是预留的静态地址,也可以是临时地址。协议选项:
AH
、ESP
、ICMP
、SCTP
、TCP
(默认)、UDP
和L3_DEFAULT
:L3_DEFAULT
转发规则协议设置可用于处理所有 IP 协议流量。- IPv6 转发规则不支持
ICMP
协议设置,因为 ICMP 协议仅支持 IPv4 地址。如需处理 ICMPv6 和 GRE 流量,请将转发规则协议设置为L3_DEFAULT
。
端口指定选项:连续的端口范围或所有端口。
使用转发规则时,请注意以下几点:
对于协议转发,转发规则只能引用单个目标实例。
对于内部直通式网络负载均衡器和基于后端服务的外部直通式网络负载均衡器,转发规则只能引用单个后端服务。
您可以在内部协议转发和内部直通式网络负载均衡器之间切换,而无需删除并重新创建转发规则。若要在外部协议转发和基于后端服务的外部直通式网络负载均衡器之间切换,必须删除并重新创建转发规则。如需了解详情,请参阅在目标实例和后端服务之间切换。
只能为具有端口概念的协议指定端口信息:
TCP
、UDP
或SCTP
。L3_DEFAULT
协议选项会转发所有 AH、ESP、GRE、ICMP、ICMPv6、SCTP、TCP 和 UDP 协议。对于 TCP、UDP 和 SCTP 协议,L3_DEFAULT
会转发所有端口。如果您预期会对 UDP 数据包进行分段,请执行以下操作之一,以确保所有分段(包括没有端口信息的分段)都传递到实例:
- 使用单个
L3_DEFAULT
转发规则,或者 - 使用配置为转发所有端口的单个
UDP
转发规则。
- 使用单个
目标实例
目标实例是引用同一可用区中一个虚拟机实例的可用区资源。引用目标实例的转发规则必须位于包含目标实例的可用区的区域。由于目标实例未应用 Cloud NAT 政策,因此它可用于无法遍历 NAT 的 IPsec 流量。
多 NIC 支持
目标实例支持指定其引用的虚拟机实例的网络接口 (NIC)。使用 --network
标志可以指定引用的虚拟机在其中具有 NIC 的 VPC 网络的名称:
- 如果省略
--network
标志,则目标实例会将数据包传送到其引用的虚拟机的nic0
接口。 - 如果使用
--network
标志,则目标实例引用的虚拟机必须在该 VPC 网络中具有 NIC。 - 对于内部协议转发,转发规则使用的子网必须位于目标实例的网络接口所使用的 VPC 网络中。
IPv6 支持
如果您希望外部协议转发部署支持 IPv6 流量,则必须在与 IPv6 位于同一区域的双栈子网中配置虚拟机实例转发规则。您可以为虚拟机实例使用 ipv6-access-type
设置为 EXTERNAL
或 INTERNAL
的子网。若要使用 ipv6-access-type
设置为 INTERNAL
的子网,您需要使用针对外部转发规则将 ipv6-access-type
设置为 EXTERNAL
的单独双栈子网。如需了解相关说明,请参阅添加双栈子网。
此外,虚拟机实例本身必须是双栈实例。将虚拟机的 stack-type
设置为 IPv4_IPv6
。虚拟机会从子网继承 ipv6-access-type
设置(EXTERNAL
或 INTERNAL
)。如需了解相关说明,请参阅创建虚拟机并启用 IPv6。如果要使用现有虚拟机,请使用 gcloud compute instances network-interfaces
update
命令将虚拟机更新为双栈。
请求和返回数据包的 IP 地址
当目标实例从客户端接收数据包时,请求数据包的来源和目的地 IP 地址如下表所示。
协议转发类型 | 来源 IP 地址 | 目标 IP 地址 |
---|---|---|
外部协议转发 | 与 Google Cloud 虚拟机或互联网上客户端的外部 IP 地址关联的外部 IP 地址。 | 转发规则的 IP 地址。 |
内部协议转发 | 客户端的内部 IP 地址;对于 Google Cloud 客户端,则为主要内部 IPv4 地址或 IPv6 地址,或者虚拟机网络接口的别名 IP 范围内的 IPv4 地址。 | 转发规则的 IP 地址。 |
在目标实例虚拟机上运行的软件应配置为执行以下操作:
- 侦听(绑定到)转发规则 IP 地址或任何 IP 地址 (
0.0.0.0
或::
)。 - 如果转发规则的协议支持端口,则侦听(绑定到)转发规则中包含的端口。
返回数据包直接从目标实例发送到客户端。响应数据包的来源 IP 地址和目的地 IP 地址取决于协议:
- TCP 是面向连接的。目标实例必须使用来源 IP 地址与转发规则的 IP 地址匹配的数据包进行回复。这可确保客户端可以将响应数据包与相应的 TCP 连接关联。
- AH、ESP、GRE、ICMP、ICMPv6 和 UDP 是无连接的。如果响应数据包来源 IP 地址与转发规则的 IP 地址相匹配,或者与分配给转发规则所在 VPC 网络中虚拟机 NIC 的任何 IP 地址相匹配,则目标实例可以发送这些响应数据包。实际上,大多数客户端都期望响应来自作为其数据包发送目的地的同一 IP 地址。
下表总结了返回数据包的来源和目标:
流量类型 | 来源 IP 地址 | 目标 IP 地址 |
---|---|---|
TCP | 转发规则的 IP 地址。 | 请求数据包的来源 IP 地址。 |
AH、ESP、GRE、ICMP、ICMPv6 和 UDP* | 对于大多数用例,则为转发规则的 IP 地址。† | 请求数据包的来源 IP 地址。 |
* 只有外部协议转发支持 AH、ESP、GRE、ICMP 和 ICMPv6。
† 使用内部协议转发时,可以将响应数据包的来源设置为虚拟机 NIC 的主要内部 IPv4 地址、IPv6 地址或者别名 IP 地址范围。如果虚拟机启用了 IP 转发,则还可以使用任意 IP 地址来源。不使用转发规则的 IP 地址作为来源属于一种高级方案,因为客户端从内部 IP 地址接收到响应数据包,而该内部 IP 地址与发送请求数据包的 IP 地址不匹配。
从目标实例发起的出站互联网连接
目标实例引用的虚拟机实例可以使用关联转发规则的 IP 地址作为出站连接的来源 IP 地址,从而发起与互联网的连接。
通常,虚拟机实例始终使用自己的外部 IP 地址或 Cloud NAT 来发起连接。只有在特殊场景下(例如需要虚拟机实例通过同一外部 IP 地址发起和接收连接时),您才需要使用转发规则 IP 地址从目标实例发起连接。
从目标实例虚拟机直接发送到互联网的出站数据包对流量协议和端口没有任何限制。即使出站数据包使用转发规则的 IP 地址作为来源,数据包的协议和来源端口也不必与转发规则的协议和端口指定相匹配。但是,入站响应数据包必须与转发规则的转发规则 IP 地址、协议和目标端口相匹配。如需了解详情,请参阅外部直通式网络负载均衡器和外部协议转发的路径。
根据 Google Cloud 的隐式防火墙规则,这种从目标实例虚拟机到互联网的连接路径是默认的预期行为。不过,如果您担心使此路径保持开放状态会带来安全问题,可以使用有针对性的出站防火墙规则来阻止未经请求就发送到互联网的出站流量。
限制
- 转发规则不能指向多个目标实例。
- 目标实例不支持健康检查。您必须确保必要的软件正在目标实例引用的虚拟机上运行且功能正常。
- IPv6 流量的内部协议转发具有以下限制:
- 不支持
L3_DEFAULT
协议。请使用TCP
或UDP
。 - 不支持多 NIC。
- 不支持
API 和 gcloud 参考
对于转发规则,请参阅以下内容:
对于目标实例,请参阅以下内容:
价格
协议转发与负载均衡的费率相同。转发规则,以及目标实例处理的入站数据都会产生费用。
如需了解所有价格信息,请参阅价格。
配额和限制
如需了解协议转发的转发规则配额,请参阅配额和限制:转发规则。