设置协议转发

本文档介绍了如何为内部和外部协议转发配置协议转发。在配置协议转发之前,请先阅读协议转发概览

设置外部协议转发

本部分介绍如何通过使用转发规则将 TCP 流量转发到单个目标实例来设置外部协议转发。仅限 IPv4 流量、双栈流量和仅限 IPv6 流量有单独的说明。

如需设置外部协议转发,请创建一个包含单个虚拟机实例的目标实例。然后创建外部区域转发规则,以将流量转发到目标实例。

仅限 IPv4

为简单起见,此示例使用默认网络和子网。

  1. 创建一条防火墙规则,以允许外部流量到达目标实例。

    gcloud compute firewall-rules create ALLOW_IPV4_FIREWALL_RULE_NAME \
        --target-tags=allow-ipv4-ext \
        --allow=tcp:80 \
        --source-ranges=0.0.0.0/0
    
  2. 创建一个虚拟机。在本示例中,您将在虚拟机上设置 Apache 服务器。

    gcloud compute instances create VM_INSTANCE_NAME \
        --zone=ZONE \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --tags=allow-ipv4-ext \
        --metadata=startup-script='#! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo a2ensite default-ssl
        sudo a2enmod ssl
        vm_hostname="$(curl -H "Metadata-Flavor:Google" \
        http://169.254.169.254/computeMetadata/v1/instance/name)"
        echo "Page served from: $vm_hostname" | \
        tee /var/www/html/index.html
        sudo systemctl restart apache2'
    
  3. 创建一个目标实例,其中包含上一步中创建的虚拟机。您必须先创建目标实例,然后才能创建转发规则对象,因为转发规则必须引用现有的目标资源。

    gcloud compute target-instances create TARGET_INSTANCE_NAME \
        --instance=VM_INSTANCE_NAME \
        --zone=ZONE
    
  4. 预留静态外部 IPv4 地址

    gcloud compute addresses create IPV4_ADDRESS \
        --region=REGION
    
  5. 创建用于将 TCP 流量转发到目标实例的转发规则。必须在创建目标实例的同一区域中创建转发规则。

    gcloud compute forwarding-rules create IPV4_FORWARDING_RULE_NAME \
        --load-balancing-scheme=EXTERNAL \
        --region=REGION \
        --ip-protocol=TCP \
        --address=IPV4_ADDRESS \
        --ports=80 \
        --target-instance=TARGET_INSTANCE_NAME \
        --target-instance-zone=ZONE
    
  6. 测试您的设置。

    1. 获取转发规则的 IP 地址:

      gcloud compute forwarding-rules describe IPV4_FORWARDING_RULE_NAME \
          --region=REGION
      
    2. 使用 curl 连接负载均衡器的 IP 地址,以此向负载均衡器发送 Web 请求。将 IP_ADDRESS 替换为上一步中的 IP 地址。

      while true; do curl -m1 IP_ADDRESS; done
      

      输出类似于以下内容,其中显示了生成响应的后端虚拟机的名称。

      Page served from: VM_INSTANCE_NAME.
      

双栈

同时处理 IPv4 和 IPv6 流量需要双栈子网及用于目标实例后端的双栈虚拟机实例。

  1. 创建一个自定义模式 VPC 网络。

    gcloud compute networks create VPC_NAME \
        --subnet-mode=custom
    
  2. 在 VPC 网络中,创建双栈子网。

    gcloud compute networks subnets create SUBNET_NAME \
        --network=VPC_NAME \
        --range=IPV4_ADDRESS_RANGE \
        --stack-type=IPV4_IPV6 \
        --ipv6-access-type=EXTERNAL \
        --region=REGION
    

    对于 IPV4_ADDRESS_RANGE,您可以采用 CIDR 表示法输入新子网的任何主要 IPv4 范围。例如 192.168.11.0/24。如需了解详情,请参阅 IPv4 子网范围

  3. 创建一条防火墙规则,以允许外部流量到达目标实例。

    gcloud compute firewall-rules create ALLOW_IPV6_FIREWALL_RULE_NAME \
        --network=VPC_NAME \
        --target-tags=allow-ipv6-ext \
        --allow=tcp:80 \
        --source-ranges=::/0
    
  4. 创建双栈虚拟机。

    gcloud compute instances create VM_INSTANCE_NAME \
        --subnet=SUBNET_NAME \
        --stack-type=IPV4_IPV6 \
        --zone=ZONE \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --tags=allow-ipv6-ext \
        --metadata=startup-script='#! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo a2ensite default-ssl
        sudo 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
        sudo systemctl restart apache2'
    
  5. 创建一个目标实例,其中包含上一步中创建的虚拟机。

    gcloud compute target-instances create TARGET_INSTANCE_NAME \
        --instance=VM_INSTANCE_NAME \
        --network=VPC_NAME \
        --zone=ZONE
    
  6. 预留静态外部 IPv4 地址

    gcloud compute addresses create IPV4_ADDRESS \
       --region=REGION
    
  7. 创建用于将 TCP 流量转发到目标实例的 IPv4 转发规则。必须在创建目标实例的同一区域中创建转发规则。

    gcloud compute forwarding-rules create IPV4_FORWARDING_RULE_NAME \
        --load-balancing-scheme=EXTERNAL \
        --region=REGION \
        --ip-protocol=TCP \
        --address=IPV4_ADDRESS \
        --ports=80 \
        --target-instance=TARGET_INSTANCE_NAME \
        --target-instance-zone=ZONE
    
  8. 预留静态外部 IPv6 地址范围

    gcloud compute addresses create IPV6_ADDRESS \
        --region=REGION \
        --subnet=SUBNET_NAME \
        --ip-version=IPV6 \
        --endpoint-type=NETLB
    
  9. 创建用于将 TCP 流量转发到目标实例的 IPv6 转发规则。必须在创建目标实例的同一区域中创建转发规则。

    gcloud compute forwarding-rules create IPV6_FORWARDING_RULE_NAME \
        --load-balancing-scheme=EXTERNAL \
        --subnet=SUBNET_NAME \
        --ip-version=IPV6 \
        --region=REGION \
        --address=IPV6_ADDRESS \
        --network-tier=PREMIUM \
        --target-instance=TARGET_INSTANCE_NAME \
        --target-instance-zone=ZONE \
        --ip-protocol=TCP \
        --ports=80
    
  10. 测试您的设置。

    1. 获取转发规则的 IP 地址。

      gcloud compute forwarding-rules describe IPV4_FORWARDING_RULE_NAME \
        --region=REGION
      
      gcloud compute forwarding-rules describe IPV6_FORWARDING_RULE_NAME \
        --region=REGION
      
    2. 使用 curl 连接负载均衡器的 IP 地址,以此向负载均衡器发送 Web 请求。将 IP_ADDRESS 替换为上一步中的 IP 地址。

      对于 IPv4 流量:

      while true; do curl -m1 IP_ADDRESS; done
      

      对于 IPv6 流量:

      curl -6 'http://[IP_ADDRESS]:80'
      

      输出类似于以下内容,其中显示了生成响应的后端虚拟机的名称。

      Page served from: VM_INSTANCE_NAME.
      

仅限 IPv6

仅处理 IPv6 流量需要仅限 IPv6 的子网及用于目标实例后端的仅限 IPv6 虚拟机实例。

  1. 创建一个自定义模式 VPC 网络。

    gcloud beta compute networks create VPC_NAME \
        --subnet-mode=custom
    
  2. 在 VPC 网络中,创建一个仅限 IPv6 的子网。

    gcloud beta compute networks subnets create SUBNET_NAME \
        --network=VPC_NAME \
        --stack-type=IPV6_ONLY \
        --ipv6-access-type=EXTERNAL \
        --region=REGION
     
  3. 创建一条防火墙规则,以允许外部流量到达目标实例。

    gcloud beta compute firewall-rules create ALLOW_IPV6_FIREWALL_RULE_NAME \
        --network=VPC_NAME \
        --target-tags=allow-ipv6-ext \
        --allow=tcp:80 \
        --source-ranges=::/0
    
  4. 创建一个仅限 IPv6 的虚拟机。

    gcloud beta compute instances create VM_INSTANCE_NAME \
        --subnet=SUBNET_NAME \
        --stack-type=IPV6_ONLY \
        --zone=ZONE \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --tags=allow-ipv6-ext \
        --metadata=startup-script='#! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo a2ensite default-ssl
        sudo 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
        sudo systemctl restart apache2'
    
  5. 创建一个目标实例,其中包含上一步中创建的虚拟机。

    gcloud beta compute target-instances create TARGET_INSTANCE_NAME \
        --instance=VM_INSTANCE_NAME \
        --network=VPC_NAME \
        --zone=ZONE
    
  6. 预留静态外部 IPv6 地址范围

    gcloud beta compute addresses create IPV6_ADDRESS \
        --region=REGION \
        --subnet=SUBNET_NAME \
        --ip-version=IPV6 \
        --endpoint-type=NETLB
    
  7. 创建用于将 TCP 流量转发到目标实例的 IPv6 转发规则。必须在创建目标实例的同一区域中创建转发规则。

    gcloud beta compute forwarding-rules create IPV6_FORWARDING_RULE_NAME \
        --load-balancing-scheme=EXTERNAL \
        --subnet=SUBNET_NAME \
        --ip-version=IPV6 \
        --region=REGION \
        --address=IPV6_ADDRESS \
        --network-tier=PREMIUM \
        --target-instance=TARGET_INSTANCE_NAME \
        --target-instance-zone=ZONE \
        --ip-protocol=TCP \
        --ports=80
    
  8. 测试您的设置。

    1. 获取转发规则的 IP 地址。

      gcloud beta compute forwarding-rules describe IPV6_FORWARDING_RULE_NAME \
          --region=REGION
      
    2. 使用 curl 连接负载均衡器的 IP 地址,以此向负载均衡器发送 Web 请求。将 IPV6_ADDRESS 替换为上一步中的 IP 地址。

      curl -6 'http://[IPV6_ADDRESS]:80'
      

      输出类似于以下内容,其中显示了生成响应的后端虚拟机的名称。

      Page served from: VM_INSTANCE_NAME.
      

设置内部协议转发

本部分介绍如何通过使用转发规则将 TCP 流量转发到单个目标实例来设置内部协议转发。仅限 IPv4 流量、双栈流量和仅限 IPv6 流量有单独的说明。

对于本示例,您将创建一个目标实例,其中包含一个安装了 Apache 服务器的虚拟机实例。然后创建内部区域转发规则,以将流量转发到目标实例。

仅限 IPv4

为简单起见,此示例使用默认网络和子网来设置内部协议转发。

  1. 创建一条防火墙规则,以允许内部流量到达目标实例。

    gcloud compute firewall-rules create ALLOW_IPV4_FIREWALL_RULE_NAME \
        --target-tags=allow-ipv4-int \
        --allow=tcp \
        --source-ranges=0.0.0.0/0
    
  2. 创建防火墙规则,允许通过 SSH 连接到网络标记为 allow-ssh 的虚拟机。 这用于建立与客户端虚拟机的 SSH 连接。

    gcloud compute firewall-rules create ALLOW_SSH_FIREWALL_RULE_NAME \
        --target-tags=allow-ssh \
        --allow=tcp:22 \
        --source-ranges=0.0.0.0/0
    
  3. 创建一个虚拟机。

    gcloud compute instances create VM_INSTANCE_NAME \
        --zone=ZONE \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --tags=allow-ipv4-int \
        --metadata=startup-script='#! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo a2ensite default-ssl
        sudo a2enmod ssl
        vm_hostname="$(curl -H "Metadata-Flavor:Google" \
        http://169.254.169.254/computeMetadata/v1/instance/name)"
        echo "Page served from: $vm_hostname" | \
        tee /var/www/html/index.html
        sudo systemctl restart apache2'
    
  4. 创建一个目标实例,其中包含上一步中创建的虚拟机。您必须先创建目标实例,然后才能创建转发规则对象,因为转发规则必须引用现有的目标资源。

    gcloud compute target-instances create TARGET_INSTANCE_NAME \
        --instance=VM_INSTANCE_NAME \
        --zone=ZONE
    
  5. 创建用于将 TCP 流量转发到目标实例的转发规则。必须在创建目标实例的同一区域中创建转发规则。

    gcloud compute forwarding-rules create IPV4_FORWARDING_RULE_NAME \
        --load-balancing-scheme=INTERNAL \
        --network-tier=PREMIUM \
        --region=REGION \
        --ip-protocol=TCP \
        --ports=80 \
        --target-instance=TARGET_INSTANCE_NAME \
        --target-instance-zone=ZONE
    
  6. 创建测试客户端虚拟机。

    gcloud compute instances create CLIENT_VM_NAME \
        --zone=ZONE \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --tags=allow-ssh
    

    现在,您可以将流量从此客户端虚拟机发送到转发规则 IP 地址,测试协议转发配置。

  7. 测试您的设置。

    1. 获取转发规则的 IP 地址:

      gcloud compute forwarding-rules describe IPV4_FORWARDING_RULE_NAME \
          --region=REGION
      
    2. 建立与客户端虚拟机的 SSH 连接。

      gcloud compute ssh CLIENT_VM_NAME \
          --zone=ZONE
      
    3. 使用 curl 连接负载均衡器的 IP 地址,以此向负载均衡器发送请求。

      while true; do curl -m1 IP_ADDRESS; done
      

      输出类似于以下内容,其中显示了生成响应的后端虚拟机的名称。

      Page served from: VM_INSTANCE_NAME.
      

双栈

同时处理 IPv4 和 IPv6 流量需要双栈子网及用于目标实例后端的双栈虚拟机实例。

  1. 使用 --enable-ula-internal-ipv6 标志创建自定义模式 VPC 网络,以在此网络中的任何子网上配置内部 IPv6 范围。

    gcloud compute networks create VPC_NAME \
        --subnet-mode=custom \
        --enable-ula-internal-ipv6
    
  2. 在 VPC 网络中,创建双栈子网。

    gcloud compute networks subnets create SUBNET_NAME \
        --network=VPC_NAME \
        --range=IPV4_ADDRESS_RANGE \
        --region=REGION \
        --stack-type=IPV4_IPV6 \
        --ipv6-access-type=INTERNAL
    

    对于 IPV4_ADDRESS_RANGE,您可以采用 CIDR 表示法输入新子网的任何主要 IPv4 范围。例如 192.168.11.0/24。如需了解详情,请参阅 IPv4 子网范围

  3. 创建一条防火墙规则,以允许内部流量到达目标实例。

    gcloud compute firewall-rules create ALLOW_IPV6_FIREWALL_RULE_NAME \
        --network=VPC_NAME \
        --target-tags=allow-ipv6-int \
        --allow=tcp \
        --source-ranges=::/0
    
  4. 创建防火墙规则,以允许使用网络标记 allow-ssh 通过 SSH 连接到虚拟机。

    gcloud compute firewall-rules create ALLOW_SSH_FIREWALL_RULE_NAME \
        --network=VPC_NAME \
        --target-tags=allow-ssh \
        --allow=tcp:22 \
        --source-ranges=0.0.0.0/0
    

    此防火墙规则应用于客户端虚拟机(在以下任一步骤中创建),您将使用 SSH 连接到该客户端虚拟机,以将 HTTP 流量发送到转发规则的 IP 地址。

  5. 创建双栈虚拟机。

    gcloud compute instances create VM_INSTANCE_NAME \
        --subnet=SUBNET_NAME \
        --stack-type=IPV4_IPV6 \
        --zone=ZONE \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --tags=allow-ipv6-int \
        --metadata=startup-script='#! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo a2ensite default-ssl
        sudo 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
        sudo systemctl restart apache2'
    
  6. 创建一个目标实例,其中包含上一步中创建的虚拟机。

    gcloud compute target-instances create TARGET_INSTANCE_NAME \
        --instance=VM_INSTANCE_NAME \
        --network=VPC_NAME \
        --zone=ZONE
    
  7. 创建用于将 TCP 流量转发到目标实例的 IPv4 转发规则。必须在创建目标实例的同一区域中创建转发规则。

    gcloud compute forwarding-rules create IPV4_FORWARDING_RULE_NAME \
        --load-balancing-scheme=INTERNAL \
        --network-tier=PREMIUM \
        --region=REGION \
        --ip-protocol=TCP \
        --ports=80 \
        --target-instance=TARGET_INSTANCE_NAME \
        --target-instance-zone=ZONE
    
  8. 创建用于将 TCP 流量转发到目标实例的 IPv6 转发规则。必须在创建目标实例的同一区域中创建转发规则。

    gcloud compute forwarding-rules create IPV6_FORWARDING_RULE_NAME \
        --load-balancing-scheme=INTERNAL \
        --network-tier=PREMIUM \
        --network=VPC_NAME \
        --subnet=SUBNET_NAME \
        --region=REGION \
        --ip-protocol=TCP \
        --ports=80 \
        --target-instance=TARGET_INSTANCE_NAME \
        --target-instance-zone=ZONE \
        --ip-version=IPV6
    
  9. 创建客户端虚拟机。

    gcloud compute instances create CLIENT_VM_NAME \
        --subnet=SUBNET_NAME \
        --stack-type=IPV4_IPV6 \
        --zone=ZONE \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --tags=allow-ssh
    
  10. 测试您的设置。

    1. 获取转发规则的 IP 地址。

      gcloud compute forwarding-rules describe IPV4_FORWARDING_RULE_NAME \
          --region=REGION
      
      gcloud compute forwarding-rules describe IPV6_FORWARDING_RULE_NAME \
          --region=REGION
      
    2. 建立与客户端虚拟机的 SSH 连接。

      gcloud compute ssh CLIENT_VM_NAME \
          --zone=ZONE
      
    3. 使用 curl 向转发规则的 IP 地址发出 HTTP 请求。

      对于 IPv4 流量:

      while true; do curl -m1 IP_ADDRESS; done
      

      对于 IPv6 流量:

      curl -6 'http://[FORWARDING_RULE_IP_ADDRESS]:80'
      

      输出类似于以下内容,其中生成响应的后端虚拟机的名称显示在该文本中。

      Page served from: VM_INSTANCE_NAME.
      

仅限 IPv6

仅处理 IPv6 流量需要仅限 IPv6 的子网及用于目标实例后端的仅限 IPv6 虚拟机实例。

  1. 使用 --enable-ula-internal-ipv6 标志创建自定义模式 VPC 网络,以在此网络中的任何子网上配置内部 IPv6 范围。

    gcloud beta compute networks create VPC_NAME \
        --subnet-mode=custom \
        --enable-ula-internal-ipv6
    
  2. 在 VPC 网络中,创建一个仅限 IPv6 的子网。

    gcloud beta compute networks subnets create SUBNET_NAME \
        --network=VPC_NAME \
        --region=REGION \
        --stack-type=IPV6_ONLY \
        --ipv6-access-type=INTERNAL
    
  3. 创建一条防火墙规则,以允许内部流量到达目标实例。

    gcloud beta compute firewall-rules create ALLOW_IPV6_FIREWALL_RULE_NAME \
        --network=VPC_NAME \
        --target-tags=allow-ipv6-int \
        --allow=tcp \
        --source-ranges=::/0
    
  4. 创建防火墙规则,以允许使用网络标记 allow-ssh 通过 SSH 连接到虚拟机。

    gcloud beta compute firewall-rules create ALLOW_SSH_FIREWALL_RULE_NAME \
        --network=VPC_NAME \
        --target-tags=allow-ssh \
        --allow=tcp:22 \
        --source-ranges=0.0.0.0/0
    

    此防火墙规则应用于客户端虚拟机(在以下任一步骤中创建),您将使用 SSH 连接到该客户端虚拟机,以将 HTTP 流量发送到转发规则的 IP 地址。

  5. 创建一个仅限 IPv6 的虚拟机。

    gcloud beta compute instances create VM_INSTANCE_NAME \
        --subnet=SUBNET_NAME \
        --stack-type=IPV6_ONLY \
        --zone=ZONE \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --tags=allow-ipv6-int \
        --metadata=startup-script='#! /bin/bash
        sudo apt-get update
        sudo apt-get install apache2 -y
        sudo a2ensite default-ssl
        sudo 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
        sudo systemctl restart apache2'
    
  6. 创建一个目标实例,其中包含上一步中创建的虚拟机。

    gcloud beta compute target-instances create TARGET_INSTANCE_NAME \
        --instance=VM_INSTANCE_NAME \
        --network=VPC_NAME \
       --zone=ZONE
    
  7. 创建用于将 TCP 流量转发到目标实例的 IPv6 转发规则。必须在创建目标实例的同一区域中创建转发规则。

    gcloud beta compute forwarding-rules create IPV6_FORWARDING_RULE_NAME \
        --load-balancing-scheme=INTERNAL \
        --network-tier=PREMIUM \
        --network=VPC_NAME \
        --subnet=SUBNET_NAME \
        --region=REGION \
        --ip-protocol=TCP \
        --ports=80 \
        --target-instance=TARGET_INSTANCE_NAME \
        --target-instance-zone=ZONE \
        --ip-version=IPV6
    
  8. 创建客户端虚拟机。

    gcloud beta compute instances create CLIENT_VM_NAME \
        --subnet=SUBNET_NAME \
        --stack-type=IPV6_ONLY \
        --zone=ZONE \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --tags=allow-ssh
    
  9. 测试您的设置。

    1. 获取转发规则的 IP 地址。

      gcloud beta compute forwarding-rules describe IPV6_FORWARDING_RULE_NAME \
          --region=REGION
      
    2. 建立与客户端虚拟机的 SSH 连接。

      gcloud beta compute ssh CLIENT_VM_NAME \
          --zone=ZONE
      
    3. 使用 curl 向转发规则的 IP 地址发出 HTTP 请求。

      curl -6 'http://[FORWARDING_RULE_IP_ADDRESS]:80'
      

      输出类似于以下内容,其中生成响应的后端虚拟机的名称显示在该文本中。

      Page served from: VM_INSTANCE_NAME.
      

后续步骤