本文档介绍如何配置和测试仅支持内部 IPv6 流量的内部直通式网络负载平衡器。在此配置示例中,您将在仅限内部 IPv6 的后端虚拟机 (VM) 实例上安装 Apache Web 服务器,以提供内容来响应通过负载均衡器的虚拟 IP (VIP) 收到的流量。
如以下架构图所示,负载平衡器的后端虚拟机配置了仅限内部 IPv6 的地址。在此示例配置中,这些后端虚拟机需要下载 Apache 来安装 Web 服务器,这需要访问公共互联网。不过,由于这些后端虚拟机没有外部 IP 地址,因此无法直接访问互联网。
为了实现互联网访问,此示例使用了一个单独的虚拟机实例,该实例配置了外部 IPv6 地址,可充当 NAT 网关。此虚拟机在 Linux 内核级别执行地址转换。具体而言,NAT 表中的 POSTROUTING
链用于伪装出站数据包的来源地址,即将每个后端虚拟机的内部 IPv6 地址替换为 NAT 网关虚拟机在指定网络接口上的外部 IPv6 地址。
以下信息将引导您完成不同组件的配置,这些组件用于设置具有仅限内部 IPv6 的后端的内部直通式网络负载平衡器。
权限
要按照本指南进行操作,您需要在项目中创建实例并修改网络。您应该具有项目的 Owner 或 Editor 角色,或者必须具有以下所有 Compute Engine IAM 角色:
任务 | 所需角色 |
---|---|
创建网络、子网和负载均衡器组件 | Compute Network Admin ( roles/compute.networkAdmin )
|
添加和移除防火墙规则 | Compute Security Admin ( roles/compute.securityAdmin )
|
创建实例 | Compute Instance Admin ( roles/compute.instanceAdmin )
|
如需了解详情,请参阅以下指南:
配置具有内部 IPv6 地址的网络和仅限 IPv6 的子网
本页面介绍的内部直通式网络负载均衡器示例是在一个名为 lb-network-ipv6-only
的自定义模式 VPC 网络中创建的。
如需配置具有内部 IPv6 范围的子网,请启用 VPC 网络 ULA 内部 IPv6 范围。内部 IPv6 子网范围是从此范围分配的。
控制台
在 Google Cloud 控制台中,前往 VPC 网络页面。
点击创建 VPC 网络。
对于名称,输入
lb-network-ipv6-only
。如果您要在此网络中的子网上配置内部 IPv6 地址范围,请完成以下步骤:
- 对于专用 IPv6 地址设置,选择为此 VPC 网络配置 ULA 内部 IPv6 范围。
- 对于分配内部 IPv6 范围,选择自动或手动。
如果您选择手动,请输入
fd20::/20
范围内的/48
范围。如果此范围已在使用,系统会提示您提供其他范围。
对于子网创建模式,选择自定义。
在新子网部分,为子网指定以下配置参数:
- 名称:
lb-subnet-ipv6-only
- 区域:
us-west1
- IP 栈类型:IPv6(单栈)
- IPv6 访问权限类型:内部
- 名称:
点击完成。
点击创建。
gcloud
如需创建新的自定义模式 VPC 网络,请运行
gcloud compute networks create
命令。如需在此网络的任何子网上配置内部 IPv6 范围,请使用
--enable-ula-internal-ipv6
标志。gcloud compute networks create lb-network-ipv6-only \ --subnet-mode=custom \ --enable-ula-internal-ipv6 \ --bgp-routing-mode=regional
配置
ipv6-access-type
设置为INTERNAL
的子网。这表示相应子网中的虚拟机只能具有内部 IPv6 地址。在此示例中,子网名为lb-subnet-ipv6-only-internal
。如需创建子网,请运行
gcloud compute networks subnets create
命令。gcloud compute networks subnets create lb-subnet-ipv6-only-internal \ --network=lb-network-ipv6-only \ --region=us-west1 \ --stack-type=IPV6_ONLY \ --ipv6-access-type=INTERNAL
配置仅限 IPv6 的子网(使用外部 IPv6 地址)
具有外部 IPv6 地址的仅限 IPv6 的子网用于创建充当 NAT 网关的虚拟机实例。
控制台
在 Google Cloud 控制台中,前往 VPC 网络页面。
如需查看 VPC 网络详情页面,请点击您创建的 VPC 网络的名称。
在子网标签页中,点击
添加子网。在显示的面板中,为子网指定以下配置参数:- 名称:
lb-subnet-ipv6-only-external
- 区域:
us-west1
- IP 栈类型:IPv6(单栈)
- IPv6 访问类型:外部
- 名称:
点击添加。
gcloud
配置 ipv6-access-type
设置为 EXTERNAL
的子网。这表示相应子网中的虚拟机可以具有外部 IPv6 地址。在此示例中,子网名为 lb-subnet-ipv6-only-external
。
如需创建子网,请运行 gcloud compute networks subnets create
命令。
gcloud compute networks subnets create lb-subnet-ipv6-only-external \ --network=lb-network-ipv6-only \ --region=us-west1 \ --stack-type=IPV6_ONLY \ --ipv6-access-type=EXTERNAL
在 VPC 网络中配置防火墙规则
此示例使用以下防火墙规则:
fw-allow-lb-access-ipv6-only
:入站流量规则,它适用于 VPC 网络中的所有目标,允许来自所有 IPv6 来源的流量。fw-allow-ssh
:一种入站流量规则,允许从任何地址到 TCP 端口22
的传入 SSH 连接。您可以为此规则选择限制性更高的来源 IP 地址范围;例如,您可以仅指定要从中启动 SSH 会话的系统的 IP 地址范围。此示例使用目标标记allow-ssh
来标识必须应用该规则的虚拟机。fw-allow-health-check-ipv6-only
:入站流量规则,它适用于正在进行负载均衡的实例,允许来自 Google Cloud 健康检查系统 (2600:2d00:1:b029::/64
) 的流量。此示例使用目标标记allow-health-check-ipv6
来标识必须遵循该规则的实例。
如果不使用上述防火墙规则,则默认拒绝入站规则会阻止传入后端实例的流量。
控制台
在 Google Cloud 控制台中,前往防火墙政策页面。
如需允许 IPv6 子网流量,请再次点击创建防火墙规则,然后输入以下信息:
- 名称:
fw-allow-lb-access-ipv6-only
- 网络:
lb-network-ipv6-only
- 优先级:
1000
- 流量方向:入站
- 对匹配项执行的操作:允许
- 目标:All instances in the network
- 来源过滤条件:IPv6 范围
- 来源 IPv6 范围:
::/0
- 协议和端口:允许全部
- 名称:
点击创建。
如需允许传入 SSH 连接,请再次点击创建防火墙规则,然后输入以下信息:
- 名称:
fw-allow-ssh
- 网络:
lb-network-ipv6-only
- 优先级:
1000
- 流量方向:入站
- 对匹配项执行的操作:允许
- 目标:指定的目标标记
- 目标标记:
allow-ssh
- 来源过滤条件:IPv6 范围
- 来源 IPv6 范围:
::/0
- 协议和端口:选择指定的协议和端口,选中 TCP 复选框,然后在端口中输入
22
。
- 名称:
点击创建。
如需允许 Google Cloud IPv6 健康检查,请再次点击创建防火墙规则,然后输入以下信息:
- 名称:
fw-allow-health-check-ipv6-only
- 网络:
lb-network-ipv6-only
- 优先级:
1000
- 流量方向:入站
- 对匹配项执行的操作:允许
- 目标:指定的目标标记
- 目标标记:
allow-health-check-ipv6
- 来源过滤条件:IPv6 范围
- 来源 IPv6 范围:
2600:2d00:1:b029::/64
- 协议和端口:允许全部
- 名称:
点击创建。
gcloud
创建
fw-allow-lb-access-ipv6-only
防火墙规则,以允许所有入站 IPv6 流量进入 VPC 网络中的所有虚拟机实例:gcloud compute firewall-rules create fw-allow-lb-access-ipv6-only \ --network=lb-network-ipv6-only \ --action=allow \ --direction=ingress \ --source-ranges=::/0 \ --rules=all
创建
fw-allow-ssh
防火墙规则,允许通过 SSH 连接到网络标记为allow-ssh
的虚拟机。如果省略source-ranges
,则Google Cloud 会将规则解读为表示任何来源。gcloud compute firewall-rules create fw-allow-ssh \ --network=lb-network-ipv6-only \ --action=allow \ --direction=ingress \ --target-tags=allow-ssh \ --source-ranges=::/0 \ --rules=tcp:22
创建
fw-allow-health-check-ipv6
规则以允许Google Cloud IPv6 健康检查。gcloud compute firewall-rules create fw-allow-health-check-ipv6-only \ --network=lb-network-ipv6-only \ --action=allow \ --direction=ingress \ --target-tags=allow-health-check-ipv6 \ --source-ranges=2600:2d00:1:b029::/64 \ --rules=tcp,udp
创建充当 NAT 网关的虚拟机实例
在此示例中,我们使用 Bash 脚本创建了一个 NAT 网关,用于在 Linux 内核级别修改 IPv6 数据包。
该 Bash 脚本会修改 POSTROUTING
链中所有出站 IPv6 数据包的源地址,将其替换为虚拟机接口的外部 IPv6 地址。
该 Bash 脚本会修改 iptables
中的 POSTROUTING
链,以伪装所有出站数据包的源 IPv6 地址,并将其替换为虚拟机网络接口的外部 IPv6 地址。
您还需要为此实例启用 IP 转发。
如需创建用作 NAT 网关的虚拟机实例,请执行以下操作:
控制台
在 Google Cloud 控制台中,前往虚拟机实例页面。
点击创建实例。
对于名称,输入
nat-gateway-instance
。对于区域,选择
us-west1
;对于可用区,选择us-west1-a
。在启动磁盘部分中,确保为启动磁盘选项选择了 Debian GNU/Linux 12 (bookworm)。如有必要,请点击更改以更改映像。
点击网络并配置以下字段:
- 对于网络标记,请输入
allow-ssh
。 - 对于 IP 转发,请选中启用复选框。
- 对于网络接口,请选择以下内容:
- 网络:
lb-network-ipv6-only
- 子网:
lb-subnet-ipv6-only-external
- IP 栈类型:IPv6(单栈)
- 外部 IPv6 地址:自动分配
- 网络:
- 对于网络标记,请输入
点击高级,然后在启动脚本字段中输入以下脚本:
#!/bin/bash set -e echo "Starting GCE startup script..." # --- IPv6 NAT table configuration --- echo "Modifying the source IPv6 address using the NAT table" # Enable IPv6 forwarding sysctl -w net.ipv6.conf.all.forwarding=1 # Determine the primary network interface (assuming it's the last one listed) IFACE=$(ip -brief link | tail -1 | awk '{print $1}') echo "Using interface: $IFACE for IPv6 NAT" # Flush existing IPv6 NAT rules ip6tables -F -t nat ip6tables -X -t nat # Masquerade all outgoing IPv6 traffic on the determined interface ip6tables -t nat -A POSTROUTING -o "$IFACE" -j MASQUERADE echo "IPv6 masquerading configured successfully." echo "GCE startup script finished."
点击创建。
gcloud
创建启动脚本。
nano startup.sh
添加以下脚本并保存文件。
#!/bin/bash set -e echo "Starting GCE startup script..." # --- IPv6 NAT table configuration --- echo "Modifying the source IPv6 address using the NAT table" # Enable IPv6 forwarding sysctl -w net.ipv6.conf.all.forwarding=1 # Determine the primary network interface (assuming it's the last one listed) IFACE=$(ip -brief link | tail -1 | awk '{print $1}') echo "Using interface: $IFACE for IPv6 NAT" # Flush existing IPv6 NAT rules ip6tables -F -t nat ip6tables -X -t nat # Masquerade all outgoing IPv6 traffic on the determined interface ip6tables -t nat -A POSTROUTING -o "$IFACE" -j MASQUERADE echo "IPv6 masquerading configured successfully." echo "GCE startup script finished."
创建虚拟机实例,并将元数据文件添加到该虚拟机实例。 如需将此虚拟机用作路由的下一个跃点,请使用
--can-ip-forward
标志为此实例启用 IP 转发。gcloud compute instances create nat-gateway-instance \ --zone=us-west1-a \ --tags=allow-ssh \ --image-family=debian-12 \ --image-project=debian-cloud \ --subnet=lb-subnet-ipv6-only-external \ --stack-type=IPV6_ONLY \ --can-ip-forward \ --metadata-from-file=startup-script=startup.sh
在 VPC 网络中创建新的静态路由
在此示例中,系统会创建一个自定义路由,该路由会将带有 nat-gw-tag
标记的虚拟机的所有 IPv6 出站互联网流量 (::/0
) 导向充当 NAT 网关的 nat-gateway-instance
虚拟机实例。
如需创建路线,请执行以下操作:
控制台
在 Google Cloud 控制台中,前往路由页面。
点击路由管理标签页。
点击创建路由。
指定该路由的名称和说明。
在网络列表中,选择 VPC 网络
lb-network-ipv6-only
。在 IP 版本列表中,选择 IPv6。
指定目标 IPv6 范围。支持的最宽泛目标是
::/0
(IPv6)。如需使该路由仅适用于具有匹配网络标记的部分实例,请在实例标记字段中指定标记。如果将此字段留空,则该路由将适用于网络中的所有实例。在此示例中,请输入
nat-gw-tag
。对于下一个跃点,选择指定实例。
选择您创建的用作 NAT 网关的实例的名称。在此示例中,选择
nat-gateway-instance
。点击创建。
gcloud
使用 gcloud compute routes create
命令创建新路由。
数据包会根据路由的 --next-hop-instance
转发到 nat-gateway-instance
虚拟机实例。
gcloud compute routes create route-1 \ --network=lb-network-ipv6-only \ --priority=1000 \ --tags=nat-gw-tag \ --destination-range=::/0 \ --next-hop-instance=nat-gateway-instance \ --next-hop-instance-zone=us-west1-a
创建后端虚拟机和实例组
此示例使用了两个非托管实例组,每个实例组都有两个后端虚拟机。为了展示内部直通式网络负载均衡器的区域级性质,我们将这两个实例组分别置于 us-west1-a
和 us-west1-c
这两个独立的可用区。
- 实例组
ig-a
包含以下两个虚拟机:vm-a1
vm-a2
- 实例组
ig-c
包含以下两个虚拟机:vm-c1
vm-c2
传入所有四个后端虚拟机的流量都经过负载均衡。
在此示例中,之前步骤中创建的静态路由使用网络标记 nat-gw-tag
将范围限定为特定虚拟机实例。
控制台
创建后端虚拟机
在 Google Cloud 控制台中,前往虚拟机实例页面。
使用以下名称和可用区组合对每个虚拟机重复执行这些步骤。
- 名称:
vm-a1
,可用区:us-west1-a
- 名称:
vm-a2
,可用区:us-west1-a
- 名称:
vm-c1
,可用区:us-west1-c
- 名称:
vm-c2
,可用区:us-west1-c
- 名称:
点击创建实例。
按照第 2 步中的说明设置名称。
对于区域,选择
us-west1
,然后按照第 2 步中的说明选择一个可用区。在启动磁盘部分中,确保为启动磁盘选项选择了 Debian GNU/Linux 12 (bookworm)。如有必要,请点击更改以更改映像。
点击高级选项。
点击网络并配置以下字段:
- 在网络标记字段中,输入
allow-ssh
、allow-health-check-ipv6
和nat-gw-tag
。 - 对于网络接口,请选择以下内容:
- 网络:
lb-network-ipv6-only
- 子网:
lb-subnet-ipv6-only-internal
- IP 栈类型:IPv6(单栈)
- 主要内部 IPv6 地址:临时(自动)
- 网络:
- 在网络标记字段中,输入
点击高级,然后在启动脚本字段中输入以下脚本。所有四个虚拟机的脚本内容均相同。
#! /bin/bash apt-get update apt-get install apache2 -y a2ensite default-ssl a2enmod ssl vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://metadata.google.internal/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html systemctl restart apache2
点击创建。
创建实例组
在 Google Cloud 控制台中,前往实例群组页面。
使用以下组合重复执行下述步骤,以创建两个非代管式实例组,每个组包含两个虚拟机。
- 实例组名称:
ig-a
,可用区:us-west1-a
,虚拟机:vm-a1
和vm-a2
- 实例组名称:
ig-c
,可用区:us-west1-c
,虚拟机:vm-c1
和vm-c2
- 实例组名称:
点击创建实例组。
点击新建非代管式实例组。
按照第 2 步中的说明设置名称。
在位置部分,为区域选择
us-west1
,然后按照第 2 步中的说明选择一个可用区。对于网络,请选择
lb-network-ipv6-only
。对于子网,选择
lb-subnet-ipv6-only-internal
。在虚拟机实例部分中,添加第 2 步中说明的虚拟机。
点击创建。
gcloud
如需创建四个虚拟机,请使用
[VM-NAME]
和[ZONE]
的下列四种组合运行四次gcloud compute instances create
命令。VM-NAME
:vm-a1
,ZONE
:us-west1-a
VM-NAME
:vm-a2
,ZONE
:us-west1-a
VM-NAME
:vm-c1
,ZONE
:us-west1-c
VM-NAME
:vm-c2
,ZONE
:us-west1-c
gcloud compute instances create VM-NAME \ --zone=ZONE \ --image-family=debian-12 \ --image-project=debian-cloud \ --tags=allow-ssh,allow-health-check-ipv6,nat-gw-tag \ --subnet=lb-subnet-ipv6-only-internal \ --stack-type=IPV6_ONLY \ --metadata=startup-script='#! /bin/bash apt-get update apt-get install apache2 -y a2ensite default-ssl a2enmod ssl vm_hostname="$(curl -H "Metadata-Flavor:Google" \ http://metadata.google.internal/computeMetadata/v1/instance/name)" echo "Page served from: $vm_hostname" | \ tee /var/www/html/index.html systemctl restart apache2'
在每个可用区中创建两个非代管实例组:
gcloud compute instance-groups unmanaged create ig-a \ --zone=us-west1-a gcloud compute instance-groups unmanaged create ig-c \ --zone=us-west1-c
将虚拟机添加到相应的实例组中:
gcloud compute instance-groups unmanaged add-instances ig-a \ --zone=us-west1-a \ --instances=vm-a1,vm-a2 gcloud compute instance-groups unmanaged add-instances ig-c \ --zone=us-west1-c \ --instances=vm-c1,vm-c2
配置负载均衡器组件
以下步骤会配置内部直通式网络负载平衡器的各个组件,先配置健康检查和后端服务,然后再配置前端。
控制台
开始配置
在 Google Cloud 控制台中,前往负载均衡页面。
- 点击创建负载均衡器。
- 对于负载均衡器的类型,选择网络负载均衡器 (TCP/UDP/SSL),然后点击下一步。
- 对于代理或直通,选择直通式负载均衡器,然后点击下一步。
- 点击配置。
基本配置
在创建内部直通网络负载均衡器页面上,输入以下信息:
- 负载均衡器名称:
ilb-ipv6-only
- 区域:
us-west1
- 网络:
lb-network-ipv6-only
后端配置
- 点击后端配置。
- 在后端的新建后端部分,选择 IP 栈类型作为 IPv6(单栈)。
- 在实例组中,选择
ig-a
实例组,然后点击完成。 - 点击添加后端,然后重复此步骤来添加
ig-c
。 - 从健康检查列表中,选择创建健康检查,输入以下信息,然后点击保存:
- 名称:
hc-http-80
。 - 范围:区域。
- 协议:
HTTP
。 - 端口:
80
。 - 代理协议:
NONE
。 - 请求路径:
/
。
- 名称:
- 验证后端配置旁边是否显示了蓝色对勾标记。
前端配置
- 点击前端配置。在新建前端 IP 和端口部分,执行以下操作:
- 对于名称,输入
fr-ilb-ipv6-only
。 - 如需处理 IPv6 流量,请执行以下操作:
- 对于 IP 版本,请选择 IPv6。您将在下一部分中创建的 IPv6 TCP 服务器会绑定到转发规则的 VIP。
- 对于子网,选择
lb-subnet-ipv6-only-internal
。 转发规则中的 IPv6 地址范围始终具有临时性。 - 对于端口,选择多个,然后在端口号字段中输入
80
。 - 点击完成。
- 请先确认前端配置旁边是否有蓝色对勾标记,然后再继续操作。
- 对于名称,输入
检查配置
- 点击检查并最终确定。检查所有设置。
- 如果设置正确,请点击创建。创建内部直通式网络负载均衡器需要几分钟时间。
gcloud
创建一个新的区域性 HTTP 健康检查,以测试端口 80 上的虚拟机的 HTTP 连接。
gcloud compute health-checks create http hc-http-80 \ --region=us-west1 \ --port=80
创建后端服务:
gcloud compute backend-services create ilb-ipv6-only \ --load-balancing-scheme=INTERNAL \ --protocol=tcp \ --region=us-west1 \ --health-checks=hc-http-80 \ --health-checks-region=us-west1
将两个实例组添加到后端服务:
gcloud compute backend-services add-backend ilb-ipv6-only \ --region=us-west1 \ --instance-group=ig-a \ --instance-group-zone=us-west1-a
gcloud compute backend-services add-backend ilb-ipv6-only \ --region=us-west1 \ --instance-group=ig-c \ --instance-group-zone=us-west1-c
创建使用临时 IPv6 地址的 IPv6 转发规则。
gcloud compute forwarding-rules create fr-ilb-ipv6-only \ --region=us-west1 \ --load-balancing-scheme=INTERNAL \ --subnet=lb-subnet-ipv6-only-internal \ --ip-protocol=TCP \ --ports=80 \ --backend-service=ilb-ipv6-only \ --backend-service-region=us-west1 \ --ip-version=IPV6
测试负载均衡器
如需测试负载均衡器,请在负载均衡器所在的区域中创建客户端虚拟机,然后将流量从客户端发送到负载均衡器。
创建客户端虚拟机
此示例在后端(服务器)虚拟机所在的同一区域创建一个客户端虚拟机 (vm-client
)。
控制台
在 Google Cloud 控制台中,前往虚拟机实例页面。
点击创建实例。
对于名称,输入
vm-client
。对于区域,请选择
us-west1
。对于可用区,请选择
us-west1-a
。点击高级选项。
点击网络并配置以下字段:
- 对于网络标记,请输入
allow-ssh
。 - 对于网络接口,请选择以下内容:
- 网络:
lb-network-ipv6-only
- 子网:
lb-subnet-ipv6-only-internal
- IP 栈类型:IPv6(单栈)
- 网络:
- 点击完成。
- 对于网络标记,请输入
点击创建。
gcloud
客户端虚拟机可以位于负载均衡器所在区域的任何可用区中。在此示例中,客户端位于 us-west1-a
可用区,并使用与后端虚拟机相同的子网。
gcloud compute instances create vm-client \ --zone=us-west1-a \ --image-family=debian-12 \ --image-project=debian-cloud \ --stack-type=IPV6_ONLY \ --tags=allow-ssh \ --subnet=lb-subnet-ipv6-only-internal
测试连接
此测试通过单独的客户端虚拟机连接负载均衡器;也就是说,并非使用负载均衡器的后端虚拟机。预期行为是流量分布在四个后端虚拟机中。
使用 SSH 连接到客户端虚拟机实例。
gcloud compute ssh vm-client --zone=us-west1-a
描述 IPv6 转发规则
fr-ilb-ipv6-only
。请注意说明中的IPV6_ADDRESS
。gcloud compute forwarding-rules describe fr-ilb-ipv6-only \ --region=us-west1
从具有 IPv6 连接的客户端,运行以下命令:
curl http://IPV6_ADDRESS:80
例如,如果分配的 IPv6 地址为
[fd20:307:120c:2000:0:1:0:0/96]:80
,则该命令应如下所示:curl http://[fd20:307:120c:2000:0:1:0:0]:80
回答可能如下所示:
Page returned from: vm-a2