亚马逊AWS官方博客

新功能:网关负载均衡器对 IPv6 的支持

Original URL:https://thinkwithwp.com/blogs/networking-and-content-delivery/new-gateway-load-balancer-support-for-ipv6/

2020 年,我们推出了网关负载均衡器(GWLB),可供您部署内联检查和数据包筛选功能。大量客户利用此服务,在集中位置实施防火墙、入侵检测和网络监控设备方案。使用安装在工作负载 VPC 中的多个 GWLB 端点,能够实现对这些集中式检查设备的分布式访问。

在发布时,GWLB 仅支持互联网协议版本 4(IPv4)流量。今天,我们推出了 GWLB 对互联网协议版本 6(IPv6)的支持。GWLB 向目标设备发送 IPv6 封装的数据包,采用与 IPv4 相同的 IPv4 通用网络虚拟化封装(GENEVE,Generic Network Virtualization Encapsulation),从而降低了启用 IPv6 支持的复杂性。通过添加 IPv6,您可以防止应用程序降级到 IPv4,避免 IPv4 地址稀缺情况,还可以通过减少 NAT 设备造成的延迟来提高应用程序的可用性。AWS 支持跨多个服务的 IPv6,Amazon VPC IPv6 页面介绍了更多详细信息、优势和应用场景。

在本博客中,我们将向您展示如何配置 GWLB 以处理 IPv4 和 IPv6 流量。之前的博客讲述了如何设置 GWLB,以下步骤则重点介绍支持 IPv6 所需进行的更改。在执行下列步骤之前,您需要准备好以下环境:

  • 已经创建安装 GWLB 的检查 VPC 和子网,并且支持双协议栈。
  • 已经创建安装 GWLB 端点的应用程序 VPC 和子网,并且支持双协议栈。
  • 您需要设置至少一个支持 GWLB 的设备并将其部署为目标,您可以使用 gwlbtun(已更新以支持 IPv6)或任何其他添加了 IPv6 支持的设备。虽然您的设备本身在操作系统级别上无需采用双协议栈,但这些设备确实需要能够处理从 GWLB 收到的 IPv4 和 IPv6 流量,根据应用场景,这可能会要求您的设备支持双协议栈。

您可以使用控制台或 CLI 创建新的 GWLB 或修改现有 GWLB。

要使用控制台创建新 GWLB,请执行以下操作:

创建双协议栈 GWLB 的过程与为 IPv4 创建 GWLB 的过程相同,但需要完成一些关键设置才能启用双协议栈模式:

  • 1.转到 EC2 控制台、Load Balancers(负载均衡器),单击顶部的 Create load balancer(创建负载均衡器),然后单击 Gateway Load Balancer(网关负载均衡器)下的 Create(创建)。在配置中,选择 Dualstack(双协议栈)作为 IP 地址类型:

创建 GWLB,突出显示了 Dualstack(双协议栈)选项

  • 2.通过下拉列表选择目标组,如果您还没有创建目标组,也可以在此处创建。请注意,对目标的访问通过 IPv4 进行,因此目标的实例和 IP 地址均可用。单击此页面底部的 Create Load Balancer(创建负载均衡器)以完成该步骤。

选择目标组

  • 3.接下来,转到 VPCEndpoint services(端点服务),然后单击 Create endpoint service(创建端点服务)。在配置中,在 Additional settings(其他设置)的 Supported IP address types(支持的 IP 地址类型)下选中 IPv4IPv6,然后单击 Create(创建):

端点服务配置,突出显示选中了 IPv4 和 IPv6 地址类型

  • 4.在您的应用程序 VPC 中创建端点,然后在 Subnets(子网)下选择 Dualstack(双协议栈)。请注意,子网必须已经采用双协议栈,并且您需要为每个子网创建一个端点:

端点创建,在 Subnets(子网)下选择了 Dualstack(双协议栈)

  • 5.如果您在端点服务上保持选中 Acceptance Required(需要接受),请返回该端点服务并接受来自端点的连接。

要使用 CLI 创建新 GWLB,请执行以下操作:

  1. 创建 GWLB,确保将其指定为双协议栈负载均衡器。将 subnet-abcdef01234567890 替换为您的检查 VPC 中双协议栈子网列表,以空格分隔。虽然对于要创建的 GWLB,子网必须是双协议栈,但您的设备(稍后介绍)则并不一定。
    aws elbv2 create-load-balancer --name Demo-IPv6-GWLB --subnets subnet-abcdef01234567890 --type gateway --ip-address-type dualstack
  2. 创建目标组。将 vpc-abcdef01234567890 替换为您的检查设备所在 VPC 的 ID:
    aws elbv2 create-target-group --name Appliances --protocol GENEVE --port 6081 --vpc-id vpc-abcdef01234567890
  3. 向目标组注册防火墙设备。将 arn:aws:elasticloadbalancing:us-west-2:111122223333:targetgroup/Appliances/abcdef01234567890 替换为步骤 2 中 create-target-group 返回的 TargetGroupArn 值,将 i-abcdef01234567890 替换为您的检查设备的一个或多个实例 ID:
    aws elbv2 register-targets --target-group-arn arn:aws:elasticloadbalancing:us-west-2:111122223333:targetgroup/Appliances/abcdef01234567890 --targets Id=i-abcdef01234567890
  4. 创建侦听器。将 arn:aws:elasticloadbalancing:us-west-2:111122223333:loadbalancer/gwy/Demo-IPv6-GWLB/abcdef01234567890 替换为步骤 1 中 create-load-balancer 返回的 LoadBalancerArn 值,将 arn:aws:elasticloadbalancing:us-west-2:111122223333:targetgroup/Appliances/abcdef01234567890 替换为步骤 2 中 create-target-group 返回的 TargetGroupArn 值:
    aws elbv2 create-listener --load-balancer-arn arn:aws:elasticloadbalancing:us-west-2:111122223333:loadbalancer/gwy/Demo-IPv6-GWLB/abcdef01234567890 --default-actions Type=forward,TargetGroupArn=arn:aws:elasticloadbalancing:us-west-2:111122223333:targetgroup/Appliances/abcdef01234567890
  5. 创建端点服务,确保 IPv4 和 IPv6 地址类型均已启用。将 arn:aws:elasticloadbalancing:us-west-2:111122223333:loadbalancer/gwy/Demo-IPv6-GWLB/abcdef01234567890 替换为步骤 1 中 create-load-balancer 返回的 LoadBalancerArn 值:
    aws ec2 create-vpc-endpoint-service-configuration --gateway-load-balancer-arns arn:aws:elasticloadbalancing:us-west-2:111122223333:loadbalancer/gwy/Demo-IPv6-GWLB/abcdef01234567890 --supported-ip-address-types ipv4 ipv6
  6. 在连接到刚刚创建的端点服务的应用程序 VPC 中创建端点,再次确保选择了 dualstack(双协议栈)IP 地址类型 。您需要使用单独的命令,为每个子网创建一个端点。将 vpc-abcdef01234567890 替换为您应用程序的 VPC ID,将 subnet-abcdef01234567890 替换为您应用程序的双协议栈子网 ID,将 amazonaws.vpce.us-west-2.vpce-svc-abcdef01234567890 替换为步骤 5 中 create-vpc-endpoint-service-configuration 返回的 ServiceName
    aws ec2 create-vpc-endpoint --vpc-id vpc-abcdef01234567890 --subnet-ids subnet-abcdef01234567890 --service-name com.amazonaws.vpce.us-west-2.vpce-svc-abcdef01234567890 --vpc-endpoint-type GatewayLoadBalancer --ip-address-type dualstack
  7. 最后,接受连接。将 vpce-svc-abcdef01234567890 替换为步骤 5 中 create-vpc-endpoint-service-configuration 返回的 ServiceId,将 vpce-abcdef01234567890 替换为步骤 6 中 create-vpc-endpoint 返回的 VpcEndpointId
    aws ec2 accept-vpc-endpoint-connections --service-id vpce-svc-abcdef01234567890 --vpc-endpoint-ids vpce-abcdef01234567890

    请注意,“accept-vpc-endpoint-connections”命令会返回失败的端点 ID 列表。如果所有命令成功,正常的响应是:

    {
        "Unsuccessful": []
    }

要使用控制台修改现有 GWLB,请执行以下操作:
在开始之前,请确保您的 VPC 以及检查 VPC 和应用程序 VPC 的子网均已添加 IPv6 地址块。

  • 1.转到 EC2Load Balancers(负载均衡器),选择您的负载均衡器,然后从 Actions(操作)菜单中选择 Edit IP address(编辑 IP 地址):

负载均衡器配置,突出显示了 Edit IP address(编辑 IP 地址)操作

  • 2.在 Edit IP address Type(编辑 IP 地址类型)屏幕中,选择 Basic configuration(基本配置)下的 Dualstack(双协议栈),然后单击底部的 Save changes(保存更改):

负载均衡器配置,突出显示了 Edit IP address(编辑 IP 地址)操作

  • 3.转到 VPCEndpoint services(端点服务),选择您的端点服务,然后在 Actions(操作)下选择 Modify supported IP address types(修改支持的 IP 地址类型):

VPC 端点服务屏幕,突出显示了 Actions(操作)下拉列表中的 Modify supported IP address types(修改支持的 IP 地址类型)

  • 4.在 Modify supported IP address types(修改支持的 IP 地址类型)屏幕中,确保在 Supported IP address types(支持的 IP 地址类型)下选中 IPv4IPv6,然后单击 Save changes(保存更改):

Modify supported IP address types(修改支持的 IP 地址类型),突出显示选中了 IPv4 和 IPv6

  • 5.对于已部署的每个端点,转到 VPCEndpoints(端点),选择端点,然后选择 Modify endpoint settings(修改端点设置)。请注意,此操作仅适用于已被端点服务接受的端点,否则该选项将不可用:

Endpoint(端点)屏幕,突出显示了 Actions(操作)下拉列表中的 Modify endpoint settings(修改端点设置)

  • 6.最后,在 Modify IP address type settings(修改 IP 地址类型设置)下,选择 Dualstack(双协议栈),然后单击 Save changes(保存更改):

Modify IP address type settings(修改 IP 地址类型设置),突出显示了 Dualstack(双协议栈)

要使用 CLI 修改现有 GWLB,请执行以下操作:

在开始之前,请确保您的 VPC 以及检查 VPC 和应用程序 VPC 的子网均已添加 IPv6 地址块。

  1. 将 GWLB 的地址类型更改为双协议栈。将 arn:aws:elasticloadbalancing:us-west-2:111122223333:loadbalancer/gwy/Demo-IPv6-GWLB/abcdef01234567890 替换为现有 GWLB 的 ARN:
    aws elbv2 set-ip-address-type --load-balancer-arn arn:aws:elasticloadbalancing:us-west-2:111122223333:loadbalancer/gwy/Demo-IPv6-GWLB/abcdef01234567890 --ip-address-type dualstack
  2. 修改端点服务,将 IPv6 添加为支持的 IP 地址类型。将 vpce-svc-abcdef01234567890 替换为 VPC 端点服务的服务 ID:
    aws ec2 modify-vpc-endpoint-service-configuration --service-id vpce-svc-abcdef01234567890 --add-supported-ip-address-types ipv6
  3. 更新引用您的端点服务的每个端点,为其启用双协议栈模式。将 vpce-abcdef01234567890 替换为 VPC 端点 ID:
    aws ec2 modify-vpc-endpoint --vpc-endpoint-id vpce-abcdef01234567890 --ip-address-type dualstack

使用控制台验证配置:

要使用控制台验证配置,请执行以下步骤:

  • 1.转到 EC2Load balancers(负载均衡器),选择您的 GWLB,并确保 IP address type(IP 地址类型)显示 Dualstack(双协议栈):

GWLB 配置,突出显示了 Dualstack(双协议栈)

  • 2.转到 VPCEndpoint services(端点服务),选择您的端点服务,并确保 Supported IP address type(支持的 IP 地址类型)显示 2 个条目,您可以将鼠标悬停在数字 2 上面,并且应看到列出的 ipv4 ipv6

端点服务配置,突出显示了 IPv4 和 IPv6

  • 3.转到 VPCEndpoints(端点),在 Subnets(子网)下,验证 IP address type(IP 地址类型)是否为 dualstack(双协议栈),并且 IPv4 地址和 IPv6 地址均已分配:

端点配置,显示双协议栈 IP 地址类型,其中突出显示了 IPv4 和 IPv6 地址

使用 CLI 验证配置:

要使用 CLI 验证配置,请执行以下步骤。

  1. 验证 GWLB 显示的 IpAddressType 是否为 dualstack。将 arn:aws:elasticloadbalancing:us-west-2:111122223333:loadbalancer/gwy/Demo-IPv6-GWLB/abcdef01234567890 替换为您的 GWLB 的 ARN:
    aws elbv2 describe-load-balancers --load-balancer-arn arn:aws:elasticloadbalancing:us-west-2:111122223333:loadbalancer/gwy/Demo-IPv6-GWLB/abcdef01234567890 --query 'LoadBalancers[*].IpAddressType'
    [
        "dualstack"
    ]
  2. 验证端点服务在 SupportedIpAddressTypes 下是否同时显示 ipv4ipv6。将 vpce-svc-abcdef01234567890 替换为您的端点服务 ID:
    aws ec2 describe-vpc-endpoint-service-configurations --service-id vpce-svc-abcdef01234567890 --query 'ServiceConfigurations[*].SupportedIpAddressTypes'
    [
        [
            "ipv4",
            "ipv6"
        ]
    ]
  3. 验证端点显示的 IpAddressType 是否为 dualstack。将 vpce-abcdef01234567890 替换为您的 VPC 端点 ID:
    aws ec2 describe-vpc-endpoints --vpc-endpoint-id vpce-abcdef01234567890 --query 'VpcEndpoints[*].IpAddressType'
    [
        "dualstack"
    ]

完成上述步骤后,更新应用程序子网路由表,根据您的要求同时将 IPv4 和 IPv6 流量发送到端点。单臂(有关单臂与双臂模式的描述,请参阅此博客)设备配置的示例如下所示:

单臂 GWLB 示意图示例,其中显示了路由表

注意事项

需要注意的一些关键事项:

  • 在单臂模式下,我们建议 IPv6 流量绕过 NAT 网关(这将执行 NAT64),直接进入互联网网关(IGW,Internet Gateway)
  • 在双臂模式下,您应该对 IPv6 流量执行与 IPv4 相同的操作。具体而言,您的设备需要对 IPv6 流量执行 NAT66(IPv6 到 IPv6),因为设备 VPC 的 IGW 仅接受来自本地子网范围的流量。
  • 如果在与端点服务不同的账户中创建端点,则端点服务需要将该账户添加到 Allow Principals(允许主体)中,否则控制台将不接受端点服务名称:

Endpoint Service(端点服务)的 Allow principals(允许主体)选项卡上突出显示了 Allow principals(允许主体)按钮

Allow principals(允许主体)屏幕,显示已填写了 ARN

设备创建者需知

如果您正在构建或更新自己的设备,则在更新设备以支持 IPv6 时,需要牢记以下几点:

  • 如前所述,GWLB 将负载封装在 GENEVE 中,使用 IPv4 作为外层,而无论内部的负载是 IPv4 还是 IPv6。因此,对于 IPv6 负载,本博客文章中关于如何处理流量并将其发送回 GWLB 的信息仍然有效。本博客文章的以下部分还讨论了 Flow Cookie。
  • 在 GENEVE 封装内部,IPv4 数据包继续使用 EtherType 0x0800,表示第 3 层 IPv4 数据包。IPv6 数据包使用相应的 EtherType 0x86dd。这样您就可以区分两种不同类型的传入流量。
  • GWLB 在 GENEVE 标头内的选项值中添加了“Flow Cookie”,应用程序将流量发送回 GWLB 时必须返回相同的标头(包括匹配的 Flow Cookie)。在 Flow Cookie 计算中,对于 IPv4 和 IPv6,“Flow”是指给定的源 IP/目标 IP 对,以及对应的源/目标端口对和协议。这意味着设备必须为每个流跟踪不同的 Flow Cookie,并且对于一个给定的流,其双向的 Flow Cookie 是相同的。

可用性和定价 – 现在,所有支持 GWLB 的区域都提供支持 IPv6 的网关负载均衡器。为负载均衡器启用 IPv6 支持无需额外付费,对于所有流量,无论是 IPv4 还是 IPv6,都将收取标准费用

通过为网关负载均衡器和设备启用 IPv6,您的设备可以使用与用于 IPv4 的相同技术来检查和监控通过网络的 IPv6 流量。互联网上的 IPv6 使用率不断增长,因此允许应用程序直接处理 IPv6 流量,再加上 GWLB 设备提供的安全和检查功能,可以避免使用 NAT 以及 IP 地址块重叠,同时消除 IPv6 与 IPv6 直接通信的障碍。现在就在您的测试环境中启用此功能吧。

本篇作者

Andrew Gray

Andrew 是 AWS 解决方案架构师,专注于网络领域。在加入 AWS 之前,Andrew 曾在有线网络 ISP 和规模较大的大学担任首席网络工程师。他非常享受解决技术难题的过程,特别是同时涉及网络架构、工程和编程的问题。