管理目的地重叠

本页面介绍提供方网络管理员如何管理使用 Private Service Connect 接口的 Virtual Private Cloud (VPC) 网络中的目的地重叠。

Google Cloud 可确保分配给同一虚拟机 (VM) 实例上的网络接口的子网 IP 地址范围不能有重叠的 IP 地址范围。但是,使用方和提供方 VPC 网络中的子网可能会重叠,如图 1 所示。如果使用具有重叠目的地 IP 地址范围的 Private Service Connect 接口,则需要进行额外配置,以确保流量到达预期网络中的正确目的地。

本页面上描述的命令展示了如何临时更新使用 Debian 操作系统的虚拟机的路由。如需永久更新虚拟机,或配置具有其他操作系统的虚拟机,请参阅操作系统的公开文档。

Subnet-a 与使用方 VPC 网络中的 subnet-c 重叠,因为这两个子网使用相同的 IP 地址范围。提供方虚拟机需要能够访问这两个网络中的 10.0.1.5

您可以通过以下方式管理重叠的目的地 IP 地址范围,本页对此进行了详细介绍:

以下方法也可用于管理目的地重叠,但本页面未介绍这些方法:

  • 使用套接字库和 bind() 来控制路由。
  • 对提供方网络使用完全不重叠的 IP 地址空间。
  • 如果提供方端的重叠 IP 地址仅适用于第一方 API 端点,则可以为本地主机配置专用 Google 访问通道
  • 使用虚拟路由和转发 (VRF) 隔离重叠的 IP 地址空间。为每个 Private Service Connect 接口分配一个 VRF 实例。为每个 VRF 实例配置默认路由,以确保流量到达预期目的地。
  • 使用 eBPF 根据 IP 地址以外的条件自定义高级路由规则。如果之前的选项不可行,建议使用此方法。

使用网络命名空间管理目的地地址重叠

您可以使用网络命名空间来管理目的地地址重叠。当提供方虚拟机上的某些应用只需要访问使用方工作负载,而提供方虚拟机上的其他应用只需要访问提供方工作负载时,此方法非常适用。

如需使用网络命名空间管理目的地地址重叠,请执行以下操作:

  1. 运行以下命令:

    ip address
    

    在网络接口列表中,找到并记下您的 Private Service Connect 接口的客机操作系统名称,例如,ens5。此名称与您的 Private Service Connect 接口的 IP 地址相关联。

  2. 为使用方绑定的流量创建网络命名空间:

    sudo ip netns add consumer-ns
    
  3. 将 Private Service Connect 接口移动到使用方网络命名空间。分别运行以下命令:

    sudo ip link set OS_INTERFACE_NAME netns consumer-ns
    
    sudo ip netns exec consumer-ns ip link set OS_INTERFACE_NAME up
    

    OS_INTERFACE_NAME 替换为您在第 2 步找到的 Private Service Connect 接口的客机操作系统名称,例如 ens5

  4. 恢复 Private Service Connect 接口的 IP 地址:

    sudo ip netns exec consumer-ns ip addr add INTERFACE_IP/32 dev OS_INTERFACE_NAME
    

    INTERFACE_IP 替换为您的 Private Service Connect 接口的 IP 地址。

  5. 验证对 Private Service Connect 接口的更改:

    sudo ip netns exec consumer-ns ip a
    

    确保 Private Service Connect 接口的客机操作系统名称列在命令的输出中。确保该接口具有正确的 IP 地址。

  6. 向网关 IP 地址添加路由:

    sudo ip netns exec consumer-ns ip route add GATEWAY_IP dev OS_INTERFACE_NAME scope link
    

    GATEWAY_IP 替换为 Private Service Connect 接口子网的默认网关的 IP 地址

  7. 为 Private Service Connect 接口添加默认路由:

    sudo ip netns exec consumer-ns ip route add default via GATEWAY_IP dev OS_INTERFACE_NAME
    
  8. 验证 consumer-ns 命名空间的路由表:

    sudo ip netns exec consumer-ns ip route
    

    确保路由表具有以下形式的条目:

    default via GATEWAY_IP dev OS_INTERFACE_NAME
    
  9. 如需验证您的接口是否可以访问重叠 IP 地址范围各部分中的虚拟机,请执行以下操作:

    1. 确保防火墙规则配置为允许入站 ICMP 流量进入您的目标虚拟机

    2. 从接口的虚拟机向重叠的 IP 地址范围中的使用方虚拟机发送 ICMP ping。使用您的使用方命名空间:

      sudo ip netns exec consumer-ns ping CONSUMER_IP_ADDRESS
      

      CONSUMER_IP_ADDRESS 替换为重叠 IP 地址范围中使用方虚拟机的 IP 地址。

    3. 从接口的虚拟机向重叠 IP 地址范围中的提供方虚拟机发送 ICMP ping。使用默认命名空间:

      ping PRODUCER_IP_ADDRESS
      

      PRODUCER_IP_ADDRESS 替换为重叠 IP 地址范围中提供方虚拟机的 IP 地址。

使用基于政策的路由管理目的地地址重叠

您可以通过在接口虚拟机的操作系统上配置基于政策的路由来管理目的地地址重叠。当同一应用需要访问同时位于使用方和提供方 VPC 网络中的工作负载,但您必须对要访问的重叠 IP 范围中的每个不同端口重复此过程时,此方法非常适用。

设置基于政策的路由来管理目的地重叠时,您可以选择要用于使用方应用的目标端口。前往其中一个端口的流量经 Private Service Connect 接口流向使用方子网,而其他流量经默认接口流向提供方子网。

  1. 连接到 Private Service Connect 接口的虚拟机

  2. 如果 iproute2 命令不可用,请安装它。

  3. 确保您可以写入以下文件:/etc/iproute2/rt_tables

  4. 创建路由表。为 Private Service Connect 接口添加默认路由:

    echo "200 pscnet" >> /etc/iproute2/rt_tables \
    sudo ip route add default dev OS_INTERFACE_NAME table pscnet
    

    OS_INTERFACE_NAME 替换为 Private Service Connect 接口的客机操作系统名称,例如 ens5

  5. 通过默认网关向重叠的使用方子网范围添加路由:

    sudo ip route add CONSUMER_SUBNET_RANGE via GATEWAY_IP dev OS_INTERFACE_NAME table pscnet
    

    替换以下内容:

    • CONSUMER_SUBNET_RANGE:使用方子网的 IP 地址范围。
    • GATEWAY_IP:Private Service Connect 接口的子网的默认网关的 IP 地址
  6. 更新路由表,以便来自此虚拟机的出站流量数据包使用您的接口的 IP 地址作为其来源 IP 地址:

    sudo ip route add GATEWAY_IP src INTERFACE_IP dev OS_INTERFACE_NAME table pscnet
    

    INTERFACE_IP 替换为您的 Private Service Connect 接口的 IP 地址。

  7. 添加一条 IP 规则,该规则应用于发往使用方应用目标端口的所有流量:

    sudo ip rule add dport CONSUMER_PORT table pscnet
    

    CONSUMER_PORT 替换为您为流向使用方虚拟机的流量配置的端口。

  8. 如需验证数据包是否根据目标端口路由到正确的虚拟机,请执行以下操作:

    1. 在提供方网络和使用方网络中创建测试虚拟机,这两个网络均使用重叠范围内的同一 IP 地址。
    2. 在每个测试虚拟机上设置 HTTP 服务器。将使用方测试虚拟机配置为监听您为使用方应用设置的端口。 将提供方测试虚拟机配置为监听您为使用方应用设置的端口以外的端口。
    3. 确保将防火墙规则配置为允许 HTTP 流量进入测试虚拟机。
    4. 使用为使用方应用配置的端口向测试 IP 地址发出 GET 请求,然后验证是否已访问正确的实例:

      curl TEST_IP_ADDRESS:CONSUMER_PORT
      

      替换以下内容:

      • TEST_IP_ADDRESS:测试虚拟机的 IP 地址。
      • CONSUMER_PORT:使用方应用的端口。
    5. 使用您为生产测试虚拟机配置的端口向测试 IP 地址发出 GET 请求,然后验证您是否已访问正确的实例:

      curl IP_ADDRESS:PRODUCER_PORT
      

      替换以下内容:

      • IP_ADDRESS:测试虚拟机的 IP 地址。
      • PRODUCER_PORT:您为生产测试虚拟机配置的端口