複数の IP プロトコルにグローバル外部パススルー ネットワーク ロードバランサを設定する

このドキュメントでは、TCP、UDP、ESP、GRE、ICMP、ICMPv6 のトラフィックのバランスを取るグローバル外部パススルー ネットワーク ロードバランサを作成する方法について説明します。

このような構成を使用すると、次のことができます。

  • TCP または UDP 以外の IP プロトコルを使用するトラフィックをロード バランシングする。

  • 1 つのロードバランサで複数のプロトコルを処理します。たとえば、IPsec サービスは通常、ESP と UDP ベースの IKE、NAT-T のトラフィックの組み合わせを処理します。

始める前に

設定が次の前提条件を満たしていることを確認します。

Google Cloud CLI をインストールする

このガイドの手順では、Google Cloud CLI を使用してグローバル外部パススルー ネットワーク ロードバランサを構成します。インストールするには、gcloud CLI をインストールするをご覧ください。

必要なロール

プロジェクト作成者にはオーナーロールroles/owner)が付与されます。デフォルトでは、オーナーロール(roles/owner)または編集者ロール(roles/editor)には、このドキュメントの手順に沿って操作するために必要な権限が含まれています。

プロジェクト作成者でない場合は、プロジェクトで必要な権限を適切なプリンシパルに付与する必要があります。プリンシパルは、Google アカウント(エンドユーザーの場合)やサービス アカウントになることもあります。

VM インスタンス グループ バックエンドを使用してグローバル外部パススルー ネットワーク ロードバランサを構成するために必要な権限を取得するには、プロジェクトに対する次の IAM ロールを付与するよう管理者に依頼してください。

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

Cloud Load Balancing のロールと権限の詳細については、ロールと権限をご覧ください。転送ルールの条件付き付与で IAM ポリシーを定義する方法については、転送ルールの IAM 条件をご覧ください。

設定の概要

次の図は、同じ IP アドレス ペアに対して 2 つのグローバル外部パススルー ネットワーク ロードバランサを示しています。各ロードバランサは、異なる IP プロトコルとポートのセットを処理します。グローバル外部パススルー ネットワーク ロードバランサの仕組みについては、概要ガイドのアーキテクチャ セクションをご覧ください。

  1. ポート 80 の TCP ロードバランサ

    このロードバランサの転送ルールは、ポート 80 に到着する TCP トラフィックのみをキャプチャするように構成されています。

    • パケットが転送ルールの IP アドレスに到達すると、Google Cloud は、まず、それが TCP パケットであるかどうか、宛先ポートが 80 であるかどうかを確認します。
    • これらの条件が満たされると、このパケットは特定の TCP 転送ルールによってキャプチャされ、参照されたバックエンド サービスに基づいてバックエンドに転送されます。
  2. TCP:8080UDP のトラフィック用の L3_DEFAULT ロードバランサ

    このロードバランサの転送ルールは L3_DEFAULT プロトコルを使用し、すべてのポートでトラフィックを受け入れるように構成されています。この設定では、最初の転送ルールで処理されないトラフィック(UDP、ICMP、ポート 80 以外のすべての TCP トラフィックなど)を処理するキャッチオール ルールとして機能します。

    • ポート 80 に到達する特定の TCP トラフィック ルールと一致しないパケットが転送ルール IP アドレスに到達した場合(たとえば、UDP トラフィック、ICMP ping、ポート 8080 または 443 の TCP トラフィックの場合)、このパケットは L3_DEFAULT 転送ルールによってキャプチャされます。
    • TCP:8080 トラフィックと UDP トラフィックのみがバックエンド VM インスタンスに到達できるようにファイアウォール ルールを追加します。したがって、L3_DEFAULT 転送ルールはすべてのポートのすべての IP プロトコル トラフィックをキャプチャしますが、ファイアウォール ルールはロード バランシングされたトラフィックを TCP:8080 トラフィックと UDP トラフィックに制限します。
    • その後、パケットは参照されたバックエンド サービスに基づいてバックエンドに転送されます。

    Google Cloud は、残りのトラフィックが同じ IP アドレスの L3_DEFAULT ルールに流れる前に、ポート 80 のより具体的な TCP ルールを優先します。

2 つのグローバル外部パススルー ネットワーク ロードバランサが、`us-west1` リージョンと `europe-west2` リージョンにデプロイされた VM インスタンス グループのバックエンドにトラフィックを送信します。
同じ IP アドレス ペアの 2 つのグローバル外部パススルー ネットワーク ロードバランサ。それぞれが異なる IP プロトコルとポートのセットを処理する(クリックして拡大)。

ネットワークとサブネットを設定する

この例では、2 つの異なるリージョンにサブネットを持つ lb-network という名前のカスタムモード VPC ネットワークを使用します。

次の表に、ロードバランサのトラフィック タイプ、バックエンド VM ネットワーク インターフェース、VPC サブネット スタック タイプの互換性を示します。グローバル外部パススルー ネットワーク ロードバランサのアーキテクチャ ガイドに記載されている、バックエンド VM のネットワーク インターフェースと VPC サブネットの互換性要件を理解しておきます。

ロードバランサのトラフィック タイプ バックエンド VM ネットワーク インターフェースのスタックタイプ VPC サブネットのスタックタイプ
IPv4 トラフィックのみ IPV4_ONLY IPV4_ONLY または IPV4_IPV6
IPV4_IPV6 IPV4_IPV6
IPv6 トラフィックのみ IPV6_ONLY IPV6_ONLY または IPV4_IPV6
IPV4_IPV6 IPV4_IPV6
IPv4 トラフィックと IPv6 トラフィック IPV4_IPV6 IPV4_IPV6

この例で使用されているバックエンドは、次のリージョンとサブネットにあります。サブネットに構成する IPv4 アドレス範囲は選択できますが、 Google Cloud は /64 IPv6 アドレス範囲をサブネット全体に自動的に割り当てます。

  • リージョン: us-west1

    • サブネット: lb-subnet-us(プライマリ IPv4 アドレス範囲は 10.1.2.0/24)。
  • リージョン: europe-west2

    • サブネット: lb-subnet-eu(プライマリ IPv4 アドレス範囲は 10.1.3.0/24)。

gcloud

  1. VPC ネットワークを作成します。この例では、VPC ネットワークの名前は lb-network です。

    gcloud compute networks create lb-network --subnet-mode=custom
    
  2. VPC ネットワーク(lb-network)内に、2 つのリージョンにサブネットを作成します。

    us-west1 リージョンのバックエンド用に lb-subnet-us という名前のサブネットを作成します

    IPv4 専用のサブネットを作成するには、次のコマンドを使用します。

    gcloud compute networks subnets create lb-subnet-us \
        --stack-type=IPV4_ONLY \
        --network=lb-network \
        --range=10.1.2.0/24 \
        --region=us-west1
    

    デュアル スタック サブネットを作成するには、次のコマンドを使用します。

    gcloud compute networks subnets create lb-subnet-us \
        --stack-type=IPV4_IPV6 \
        --ipv6-access-type=EXTERNAL \
        --network=lb-network \
        --range=10.1.2.0/24 \
        --region=us-west1
    

    IPv6 専用サブネットを作成するには、次のコマンドを使用します。

    gcloud compute networks subnets create lb-subnet-us \
        --stack-type=IPV6_ONLY \
        --ipv6-access-type=EXTERNAL \
        --network=lb-network \
        --region=us-west1
    

    europe-west2 リージョンのバックエンド用に lb-subnet-eu という名前のサブネットを作成します

    IPv4 専用のサブネットを作成するには、次のコマンドを使用します。

    gcloud compute networks subnets create lb-subnet-eu \
        --stack-type=IPV4_ONLY \
        --network=lb-network \
        --range=10.1.3.0/24 \
        --region=europe-west2
    

    デュアルスタック サブネットを作成するには、次のコマンドを使用します。

    gcloud compute networks subnets create lb-subnet-eu \
        --stack-type=IPV4_IPV6 \
        --ipv6-access-type=EXTERNAL \
        --network=lb-network \
        --range=10.1.3.0/24 \
        --region=europe-west2
    

    IPv6 専用サブネットを作成するには、次のコマンドを使用します。

    gcloud compute networks subnets create lb-subnet-eu \
        --stack-type=IPV6_ONLY \
        --ipv6-access-type=EXTERNAL \
        --network=lb-network \
        --range=10.1.3.0/24 \
        --region=europe-west2
    

グローバル外部 IP アドレスを予約する

2 つのグローバル外部 IP アドレスを予約します(各可用性グループから 1 つずつ)。設定の概要に示すように、2 つのグローバル外部パススルー ネットワーク ロードバランサは同じ IP アドレスのペアを共有します。

グローバル外部パススルー ネットワーク ロードバランサの場合、転送ルールの IP アドレスは VPC サブネットから完全に切り離されます。IP アドレスは、Google 所有のグローバル外部 IP アドレス プールまたは BYOIP グローバル外部 IPv4 パブリック委任プレフィックスに属し、VPC サブネットに関連付けられていません。

IPv6 転送ルールを構成すると、転送ルール IP アドレスは /96 プレフィックスとして割り当てられます。

gcloud

IPv4 トラフィックの場合:

  1. 可用性グループ 0 で lb-ipv4-ag0 という最初のグローバル外部 IP アドレスを予約します。

    gcloud beta compute addresses create lb-ipv4-ag0 \
        --global \
        --purpose=PASSTHROUGH_LOAD_BALANCER_AVAILABILITY_GROUP0 \
        --ip-version=IPV4
    
  2. 可用性グループ 1 で 2 番目のグローバル外部 IP アドレス lb-ipv4-ag1 を予約します。

    gcloud beta compute addresses create lb-ipv4-ag1 \
        --global \
        --purpose=PASSTHROUGH_LOAD_BALANCER_AVAILABILITY_GROUP1 \
        --ip-version=IPV4
    

IPv6 トラフィックの場合:

  1. 可用性グループ 0 で lb-ipv6-ag0 という最初のグローバル外部 IP アドレスを予約します。

    gcloud beta compute addresses create lb-ipv6-ag0 \
        --global \
        --purpose=PASSTHROUGH_LOAD_BALANCER_AVAILABILITY_GROUP0 \
        --ip-version=IPV6
    
  2. 可用性グループ 1 で 2 番目のグローバル外部 IP アドレス lb-ipv6-ag1 を予約します。

    gcloud beta compute addresses create lb-ipv6-ag1 \
        --global \
        --purpose=PASSTHROUGH_LOAD_BALANCER_AVAILABILITY_GROUP1 \
        --ip-version=IPV6
    

ポート 80 の TCP トラフィック用にロードバランサを構成する

このセクションの手順に沿って、ポート 80 で TCP トラフィックをキャプチャするグローバル外部パススルー ネットワーク ロードバランサを構成します。

TCP:80 トラフィックのみを許可するファイアウォール ルールを作成する

本番環境を安全に構成するには、次の 2 つのファイアウォール ルールを個別に作成する必要があります。

  • ヘルスチェック ファイアウォール ルール。次の範囲からの上り(内向き)トラフィックを許可するように構成されています。

  • ユーザー トラフィック ファイアウォール ルール。上り(内向き)トラフィックを許可するように構成されています。

    • ロードバランサにアクセスする必要がある特定のクライアント ソース IP 範囲。
    • 転送ルールで構成されている IP プロトコルとポート

次の点にご注意ください。

  • アプリケーションが制限なしですべてのインターネット ユーザーにサービスを提供している場合は、IPv4 トラフィックに 0.0.0.0/0、IPv6 トラフィックに ::/0 のソース IP 範囲を構成します。

  • ロード バランシングの IP プロトコルとポートをプローブするようにヘルスチェックを構成した場合は、ヘルスチェックとユーザー トラフィックのファイアウォール ルールを統合して、単一のファイアウォール ルールを構成できます。

gcloud

すべての送信元範囲からの TCP トラフィックがポート 80 でバックエンド VM インスタンスに到達できるようにするファイアウォール ルールを作成します。このポートとプロトコルは、ロード バランシングとヘルスチェックの両方に使用されます。

  • すべての IPv4 トラフィックを許可するには、次のコマンドを実行します。

      gcloud compute firewall-rules create allow-traffic-tcp-80-ipv4 \
          --network=lb-network \
          --target-tags=allow-traffic-tcp-80 \
          --allow=tcp:80 \
          --source-ranges=0.0.0.0/0
    
  • すべての IPv6 トラフィックを許可するには、次のコマンドを実行します。

      gcloud compute firewall-rules create allow-traffic-tcp-80-ipv6 \
          --network=lb-network \
          --target-tags=allow-traffic-tcp-80 \
          --allow=tcp:80 \
          --source-ranges=::/0
    

バックエンド VM インスタンスを作成する

このロード バランシングの例では、us-west1-a ゾーンと europe-west2-a ゾーンにマネージド インスタンス グループを作成します。マネージド インスタンス グループは、ロードバランサのバックエンド サーバーをホストする VM インスタンスで構成されます。デモンストレーションのため、バックエンドはポート 80 で Apache サーバーを実行しています。クライアント リクエストに応じて、独自のホスト名を提供します。

インスタンス グループは、バックエンド VM の作成に使用されるインスタンス テンプレートを参照します。

次の表に、ロードバランサのトラフィック タイプ、バックエンド VM ネットワーク インターフェース、VPC サブネット スタック タイプの互換性を示します。グローバル外部パススルー ネットワーク ロードバランサのアーキテクチャ ガイドに記載されている、バックエンド VM のネットワーク インターフェースと VPC サブネットの互換性要件を理解しておきます。

ロードバランサのトラフィック タイプ バックエンド VM ネットワーク インターフェースのスタックタイプ VPC サブネットのスタックタイプ
IPv4 トラフィックのみ IPV4_ONLY IPV4_ONLY または IPV4_IPV6
IPV4_IPV6 IPV4_IPV6
IPv6 トラフィックのみ IPV6_ONLY IPV6_ONLY または IPV4_IPV6
IPV4_IPV6 IPV4_IPV6
IPv4 トラフィックと IPv6 トラフィック IPV4_IPV6 IPV4_IPV6

インスタンス テンプレートの作成

この例では、us-west1 リージョンと europe-west2 リージョンにリージョン インスタンス テンプレートを作成します。

gcloud

  1. us-west1 リージョンにインスタンス テンプレートを作成します

    IPv4 専用ネットワーク インターフェースを持つバックエンド VM を作成するには、次のコマンドを使用します。

    gcloud compute instance-templates create ig-template-us-tcp-80 \
        --region=us-west1 \
        --network=lb-network \
        --subnet=lb-subnet-us \
        --stack-type=IPV4_ONLY \
        --tags=allow-traffic-tcp-80 \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --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'
    

    デュアルスタック ネットワーク インターフェースを持つバックエンド VM を作成するには、次のコマンドを使用します。

    gcloud compute instance-templates create ig-template-us-tcp-80 \
        --region=us-west1 \
        --network=lb-network \
        --subnet=lb-subnet-us \
        --ipv6-network-tier=PREMIUM \
        --stack-type=IPV4_IPV6 \
        --tags=allow-traffic-tcp-80 \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --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'
    

    IPv6 専用ネットワーク インターフェースを持つバックエンド VM を作成するには、次のコマンドを使用します。

    gcloud compute instance-templates create ig-template-us-tcp-80 \
        --region=us-west1 \
        --network=lb-network \
        --subnet=lb-subnet-us \
        --ipv6-network-tier=PREMIUM \
        --stack-type=IPV6_ONLY \
        --tags=allow-traffic-tcp-80 \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --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'
    
  2. europe-west2 リージョンにインスタンス テンプレートを作成します

    IPv4 専用ネットワーク インターフェースを持つバックエンド VM を作成するには、次のコマンドを使用します。

    gcloud compute instance-templates create ig-template-eu-tcp-80 \
        --region=europe-west2 \
        --network=lb-network \
        --subnet=lb-subnet-eu \
        --stack-type=IPV4_ONLY \
        --tags=allow-traffic-tcp-80 \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --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'
    

    デュアルスタック ネットワーク インターフェースを持つバックエンド VM を作成するには、次のコマンドを使用します。

    gcloud compute instance-templates create ig-template-eu-tcp-80 \
        --region=europe-west2 \
        --network=lb-network \
        --subnet=lb-subnet-eu \
        --ipv6-network-tier=PREMIUM \
        --stack-type=IPV4_IPV6 \
        --tags=allow-traffic-tcp-80 \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --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'
    

    IPv6 専用ネットワーク インターフェースを持つバックエンド VM を作成するには、次のコマンドを使用します。

    gcloud compute instance-templates create ig-template-eu-tcp-80 \
        --region=europe-west2 \
        --network=lb-network \
        --subnet=lb-subnet-eu \
        --ipv6-network-tier=PREMIUM \
        --stack-type=IPV6_ONLY \
        --tags=allow-traffic-tcp-80 \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --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'
    

ゾーン マネージド インスタンス グループを作成する

この例では、2 つのゾーン マネージド インスタンス グループ(1 つは us-west1-a ゾーン、もう 1 つは europe-west2-a ゾーン)を作成します。

gcloud

  1. us-west1-a ゾーンにマネージド インスタンス グループを作成します。

    gcloud compute instance-groups managed create ig-us-tcp-80 \
      --template=ig-template-us-tcp-80 \
      --size=2 \
      --zone=us-west1-a
    
  2. europe-west2-a ゾーンにマネージド インスタンス グループを作成します。

    gcloud compute instance-groups managed create ig-eu-tcp-80 \
      --template=ig-template-eu-tcp-80 \
      --size=2 \
      --zone=europe-west2-a
    

Cloud Load Balancing コンポーネントを作成する

グローバル外部パススルー ネットワーク ロードバランサの Cloud Load Balancing コンポーネントを作成する手順は次のとおりです。

gcloud

  1. TCP:80 プローブを生成するように構成された TCP ヘルスチェックを作成します。

    gcloud compute health-checks create tcp hc-tcp-80 \
      --global \
      --port=80
    
  2. EXTERNAL_PASSTHROUGH ロード バランシング方式でグローバル バックエンド サービスを作成します。

    gcloud beta compute backend-services create lb-backend-service-tcp-80 \
      --load-balancing-scheme=EXTERNAL_PASSTHROUGH \
      --health-checks=hc-tcp-80 \
      --global
    
  3. インスタンス グループをバックエンドとしてバックエンド サービスに追加します。

    us-west1-a ゾーンのインスタンス グループをバックエンド サービスに追加します。

    gcloud beta compute backend-services add-backend lb-backend-service-tcp-80 \
        --instance-group=ig-us-tcp-80 \
        --instance-group-zone=us-west1-a \
        --balancing-mode=UTILIZATION \
        --max-utilization=0.7 \
        --global
    

    europe-west2-a ゾーンのインスタンス グループをバックエンド サービスに追加します。

    gcloud beta compute backend-services add-backend lb-backend-service-tcp-80 \
        --instance-group=ig-eu-tcp-80 \
        --instance-group-zone=europe-west2-a \
        --balancing-mode=UTILIZATION \
        --max-utilization=0.7 \
        --global
    
  4. TCP:80 トラフィックを処理するグローバル転送ルールを作成します。

    転送ルールの IP バージョンがバックエンド VM ネットワーク インターフェースのスタックタイプと一致していることを確認します。

    転送ルールは、各可用性グループの IP アドレスを参照します。

    IPv4 トラフィックの場合:

    gcloud beta compute forwarding-rules create lb-forwarding-rule-tcp-80-ipv4 \
      --load-balancing-scheme=EXTERNAL_PASSTHROUGH \
      --ip-protocol=TCP \
      --ports=80 \
      --backend-service=lb-backend-service-tcp-80 \
      --global \
      --ip-addresses=lb-ipv4-ag0,lb-ipv4-ag1
    

    IPv6 トラフィックの場合:

    gcloud beta compute forwarding-rules create lb-forwarding-rule-tcp-80-ipv6 \
      --load-balancing-scheme=EXTERNAL_PASSTHROUGH \
      --ip-protocol=TCP \
      --ports=80 \
      --backend-service=lb-backend-service-tcp-80 \
      --global \
      --ip-addresses=lb-ipv6-ag0,lb-ipv6-ag1
    

TCP:8080 トラフィックと UDP トラフィックのロードバランサを構成する

このセクションの手順に沿って、TCP:8080 トラフィックと UDP トラフィックを処理するようにグローバル外部パススルー ネットワーク ロードバランサを構成します。

TCP:8080 トラフィックと UDP トラフィックのみを許可するファイアウォール ルールを作成する

本番環境を安全に構成するには、次の 2 つのファイアウォール ルールを個別に作成する必要があります。

  • ヘルスチェック ファイアウォール ルール。次の範囲からの上り(内向き)トラフィックを許可するように構成されています。

  • ユーザー トラフィック ファイアウォール ルール。上り(内向き)トラフィックを許可するように構成されています。

    • ロードバランサにアクセスする必要がある特定のクライアント ソース IP 範囲。
    • 転送ルールで構成されている IP プロトコルとポート

次の点にご注意ください。

  • アプリケーションが制限なしですべてのインターネット ユーザーにサービスを提供している場合は、IPv4 トラフィックに 0.0.0.0/0、IPv6 トラフィックに ::/0 のソース IP 範囲を構成します。

  • ロード バランシングの IP プロトコルとポートをプローブするようにヘルスチェックを構成した場合は、ヘルスチェックとユーザー トラフィックのファイアウォール ルールを統合して、単一のファイアウォール ルールを構成できます。

gcloud

すべての送信元範囲からの TCP:8080 トラフィックと UDP トラフィックがバックエンド VM インスタンスに到達できるようにするファイアウォール ルールを作成します。これらのプロトコルはロード バランシングに使用され、TCP ポート 8080 はヘルスチェックにも使用されます。

  1. IPv4 トラフィックが ig-us-l3-default インスタンス グループと ig-eu-l3-default インスタンス グループのバックエンドに到達できるようにするには、次のファイアウォール ルールを作成します。

    gcloud compute firewall-rules create allow-traffic-l3-default-ipv4 \
        --network=lb-network \
        --target-tags=allow-traffic-l3-default \
        --allow=tcp:8080,udp \
        --source-ranges=0.0.0.0/0
    
  2. IPv6 トラフィックが ig-us-l3-default インスタンス グループと ig-eu-l3-default インスタンス グループのバックエンドに到達できるようにするには、次のファイアウォール ルールを作成します。

    gcloud compute firewall-rules create allow-traffic-l3-default-ipv6 \
        --network=lb-network \
        --target-tags=allow-traffic-l3-default \
        --allow=tcp:8080,udp \
        --source-ranges=::/0
    

バックエンド VM インスタンスを作成する

このロード バランシングの例では、us-west1-a ゾーンと europe-west2-a ゾーンにマネージド インスタンス グループを作成します。マネージド インスタンス グループは、ロードバランサのバックエンド サーバーをホストする VM インスタンスで構成されます。わかりやすく説明するために、バックエンド サーバーはそれぞれのホスト名をコンテンツとして提供します。この起動スクリプトは、Apache サーバーがポート 80 ではなく、ポート 8080 をリッスンするようにします。

インスタンス グループは、バックエンド VM の作成に使用されるインスタンス テンプレートを参照します。

次の表に、ロードバランサのトラフィック タイプ、バックエンド VM ネットワーク インターフェース、VPC サブネット スタック タイプの互換性を示します。グローバル外部パススルー ネットワーク ロードバランサのアーキテクチャ ガイドに記載されている、バックエンド VM のネットワーク インターフェースと VPC サブネットの互換性要件を理解しておきます。

ロードバランサのトラフィック タイプ バックエンド VM ネットワーク インターフェースのスタックタイプ VPC サブネットのスタックタイプ
IPv4 トラフィックのみ IPV4_ONLY IPV4_ONLY または IPV4_IPV6
IPV4_IPV6 IPV4_IPV6
IPv6 トラフィックのみ IPV6_ONLY IPV6_ONLY または IPV4_IPV6
IPV4_IPV6 IPV4_IPV6
IPv4 トラフィックと IPv6 トラフィック IPV4_IPV6 IPV4_IPV6

インスタンス テンプレートの作成

この例では、us-west1 リージョンと europe-west2 リージョンにリージョン インスタンス テンプレートを作成します。

gcloud

  1. us-west1 リージョンにインスタンス テンプレートを作成します

    IPv4 専用ネットワーク インターフェースを持つバックエンド VM を作成するには、次のコマンドを使用します。

    gcloud compute instance-templates create ig-template-us-l3-default \
        --region=us-west1 \
        --network=lb-network \
        --subnet=lb-subnet-us \
        --stack-type=IPV4_ONLY \
        --tags=allow-traffic-l3-default \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --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
        sed -ire "s/^Listen 80$/Listen 8080/g" /etc/apache2/ports.conf
        systemctl restart apache2'
    

    デュアルスタック ネットワーク インターフェースを持つバックエンド VM を作成するには、次のコマンドを使用します。

    gcloud compute instance-templates create ig-template-us-l3-default \
        --region=us-west1 \
        --network=lb-network \
        --subnet=lb-subnet-us \
        --ipv6-network-tier=PREMIUM \
        --stack-type=IPV4_IPV6 \
        --tags=allow-traffic-l3-default \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --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
        sed -ire "s/^Listen 80$/Listen 8080/g" /etc/apache2/ports.conf
        systemctl restart apache2'
    

    IPv6 専用ネットワーク インターフェースを持つバックエンド VM を作成するには、次のコマンドを使用します。

    gcloud compute instance-templates create ig-template-us-l3-default \
        --region=us-west1 \
        --network=lb-network \
        --subnet=lb-subnet-us \
        --ipv6-network-tier=PREMIUM \
        --stack-type=IPV6_ONLY \
        --tags=allow-traffic-l3-default \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --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
        sed -ire "s/^Listen 80$/Listen 8080/g" /etc/apache2/ports.conf
        systemctl restart apache2'
    
  2. europe-west2 リージョンにインスタンス テンプレートを作成します

    IPv4 専用ネットワーク インターフェースを持つバックエンド VM を作成するには、次のコマンドを使用します。

    gcloud compute instance-templates create ig-template-eu-l3-default \
        --region=europe-west2 \
        --network=lb-network \
        --subnet=lb-subnet-eu \
        --stack-type=IPV4_ONLY \
        --tags=allow-traffic-l3-default \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --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
        sed -ire "s/^Listen 80$/Listen 8080/g" /etc/apache2/ports.conf
        systemctl restart apache2'
    

    デュアルスタック ネットワーク インターフェースを持つバックエンド VM を作成するには、次のコマンドを使用します。

    gcloud compute instance-templates create ig-template-eu-l3-default \
        --region=europe-west2 \
        --network=lb-network \
        --subnet=lb-subnet-eu \
        --ipv6-network-tier=PREMIUM \
        --stack-type=IPV4_IPV6 \
        --tags=allow-traffic-l3-default \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --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
        sed -ire "s/^Listen 80$/Listen 8080/g" /etc/apache2/ports.conf
        systemctl restart apache2'
    

    IPv6 専用ネットワーク インターフェースを持つバックエンド VM を作成するには、次のコマンドを使用します。

    gcloud compute instance-templates create ig-template-eu-l3-default \
        --region=europe-west2 \
        --network=lb-network \
        --subnet=lb-subnet-eu \
        --ipv6-network-tier=PREMIUM \
        --stack-type=IPV6_ONLY \
        --tags=allow-traffic-l3-default \
        --image-family=debian-12 \
        --image-project=debian-cloud \
        --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
        sed -ire "s/^Listen 80$/Listen 8080/g" /etc/apache2/ports.conf
        systemctl restart apache2'
    

ゾーン マネージド インスタンス グループを作成する

この例では、2 つのゾーン マネージド インスタンス グループ(1 つは us-west1-a ゾーン、もう 1 つは europe-west2-a ゾーン)を作成します。

gcloud

  1. us-west1-a ゾーンにマネージド インスタンス グループを作成します。

    gcloud compute instance-groups managed create ig-us-l3-default \
      --template=ig-template-us-l3-default \
      --size=2 \
      --zone=us-west1-a
    
  2. europe-west2-a ゾーンにマネージド インスタンス グループを作成します。

    gcloud compute instance-groups managed create ig-eu-l3-default \
      --template=ig-template-eu-l3-default \
      --size=2 \
      --zone=europe-west2-a
    

Cloud Load Balancing コンポーネントを作成する

グローバル外部パススルー ネットワーク ロードバランサの Cloud Load Balancing コンポーネントを作成する手順は次のとおりです。

gcloud

  1. TCP:8080 プローブを生成するように構成された TCP ヘルスチェックを作成します。

    gcloud compute health-checks create tcp hc-tcp-8080 \
      --global \
      --port=8080
    
  2. EXTERNAL_PASSTHROUGH ロード バランシング方式でグローバル バックエンド サービスを作成します。

    gcloud beta compute backend-services create lb-backend-service-l3-default \
      --load-balancing-scheme=EXTERNAL_PASSTHROUGH \
      --health-checks=hc-tcp-8080 \
      --global
    
  3. インスタンス グループをバックエンドとしてバックエンド サービスに追加します。

    us-west1-a ゾーンのインスタンス グループをバックエンド サービスに追加します。

    gcloud beta compute backend-services add-backend lb-backend-service-l3-default \
        --instance-group=ig-us-l3-default \
        --instance-group-zone=us-west1-a \
        --balancing-mode=UTILIZATION \
        --max-utilization=0.7 \
        --global
    

    europe-west2-a ゾーンのインスタンス グループをバックエンド サービスに追加します。

    gcloud beta compute backend-services add-backend lb-backend-service-l3-default \
        --instance-group=ig-eu-l3-default \
        --instance-group-zone=europe-west2-a \
        --balancing-mode=UTILIZATION \
        --max-utilization=0.7 \
        --global
    
  4. ip-protocol フィールドを L3_DEFAULT に設定したグローバル転送ルールを作成して、すべての IP プロトコル トラフィック(ポート 80 以外の TCP トラフィック、UDP、ESP、ICMP)を処理します。IPv4 トラフィックと IPv6 トラフィックの両方を処理するには、2 つの転送ルールを作成する必要があります。

    転送ルールの IP バージョンがバックエンド VM ネットワーク インターフェースのスタックタイプと一致していることを確認します。

    転送ルールは、各可用性グループの IP アドレスを参照します。

    IPv4 トラフィックの場合:

    gcloud beta compute forwarding-rules create lb-forwarding-rule-l3-default-ipv4 \
      --load-balancing-scheme=EXTERNAL_PASSTHROUGH \
      --ip-protocol=L3_DEFAULT \
      --ports=all \
      --backend-service=lb-backend-service-l3-default \
      --global \
      --ip-addresses=lb-ipv4-ag0,lb-ipv4-ag1
    

    IPv6 トラフィックの場合:

    gcloud beta compute forwarding-rules create lb-forwarding-rule-l3-default-ipv6 \
      --load-balancing-scheme=EXTERNAL_PASSTHROUGH \
      --ip-protocol=L3_DEFAULT \
      --ports=all \
      --backend-service=lb-backend-service-l3-default \
      --global \
      --ip-addresses=lb-ipv6-ag0,lb-ipv6-ag1
    

ロードバランサをテストする

ロード バランシング サービスの構成が完了したので、ロードバランサの外部 IP アドレスにトラフィックの送信を開始できます。また、バックエンド インスタンスに分散されるトラフィックを監視できます。

ロードバランサの外部 IP アドレスを取得する

  1. 転送ルールにアタッチされている予約済み IP アドレスを取得します。両方のロードバランサの転送ルールで同じ IP アドレスのペアが使用されているため、lb-forwarding-rule-tcp-80-ipv4 または lb-forwarding-rule-l3-default-ipv4 のいずれかを使用して外部 IP アドレスを表示できます。

      gcloud compute forwarding-rules describe lb-forwarding-rule-tcp-80-ipv4 \
          --global
    

    これにより、可用性グループごとに 1 つずつ、2 つの IP アドレスが返されます。次の手順では、これらの IP アドレスを IP_ADDRESS_AVAILABILITY_GROUP_0IP_ADDRESS_AVAILABILITY_GROUP_1 として参照します。

ロードバランサにトラフィックを送信する

こちらのステップでは、ロードバランサに外部トラフィックを送信します。次のテストを行い、ポート 80 の TCP トラフィックが ig-us-tcp-80 または ig-eu-tcp-80 インスタンス グループによってロードバランスされ、その他すべてのトラフィック(TCP:8080UDP)が ig-us-l3-default または ig-eu-l3-default インスタンス グループによってロードバランスされていることを確認します。

ポート 80 の TCP リクエストの動作を確認する

  1. curl を使用して IP アドレスに接続し、ロードバランサにウェブ リクエストを送信します(ポート 80 の TCP 経由)。

    • IPv4 接続のクライアントから、次のコマンドを実行します。

      while true; do curl -m1 IP_ADDRESS_AVAILABILITY_GROUP_0; done
      

    curl コマンドによって返されたテキストを確認します。テキストには、レスポンスを生成するバックエンド VM の名前(Page served from: VM_NAME など)が表示されます。レスポンスは ig-us-tcp-80 または ig-eu-tcp-80 インスタンス グループのインスタンスからのみ返されます。

    これは、ポート 80 のロードバランサの IP アドレスに送信された TCP トラフィックが TCP 転送ルールによって処理されることを示しています。

ポート 8080 の TCP リクエストの動作を確認する

curl を使用してロードバランサへのウェブ リクエストを作成し(ポート 8080 の TCP 経由)、IP アドレスに接続します。

  • IPv4 接続のクライアントから、次のコマンドを実行します。

    while true; do curl -m1 IP_ADDRESS_AVAILABILITY_GROUP_0:8080; done
    

    curl コマンドによって返されたテキストを確認します。レスポンスは ig-us-l3-default または ig-eu-l3-default インスタンス グループのインスタンスからのみ返されます。

    これは、ポート 8080 のロードバランサの IP アドレスに送信された TCP トラフィックが L3_DEFAULT 転送ルールによって処理されていることを示しています。

ロードバランサの IP アドレスについてローカル ルーティング テーブルを確認する

バックエンド VM のローカル ルーティング テーブルには、グローバル外部パススルー ネットワーク ロードバランサの IP アドレスが含まれています。

バックエンド VM のローカルルートを確認するには、SSH を使用してバックエンド VM に接続し、次のコマンドを実行します。

  ip route list table local

出力は次のとおりです。

local 10.1.2.5 dev ens4 proto kernel scope host src 10.1.2.5
local 127.0.0.0/8 dev lo proto kernel scope host src 127.0.0.1
local 127.0.0.1 dev lo proto kernel scope host src 127.0.0.1
broadcast 127.255.255.255 dev lo proto kernel scope link src 127.0.0.1
local 136.124.69.214 dev ens4 proto 66 scope host
local 136.124.83.205 dev ens4 proto 66 scope host

上記の例では、136.124.69.214136.124.83.205 はロードバランサの転送ルールに割り当てられた IP アドレスです。VM のローカル ルーティング テーブルの local 136.124.69.214 dev ens4 proto 66 scope hostlocal 136.124.83.205 dev ens4 proto 66 scope host の行エントリにより、ロードバランサの IP アドレス宛てのパケットがバックエンドで受け入れられます。このエントリの追加は、 Google Cloud ゲスト環境が行います。

バックエンド VM のローカル ルーティング テーブル エントリは、ローカルホスト配信用のパケットを受け入れます。ネットワーク スタックは、このパケットをリッスン アプリケーションに配信します。その後、アプリケーションからのレスポンス パケットがクライアントに直接送信されます。

ロードバランサの IP アドレスは、実際には VM のネットワーク インターフェースで構成されていません。これを確認するには、次のコマンドを実行します。

  ip addr list

出力は次のとおりです。IP アドレス(136.124.69.214136.124.83.205)はローカル ルーティング テーブルに表示されますが、ネットワーク インターフェースには構成されていません。

1: lo:  mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute
       valid_lft forever preferred_lft forever
2: ens4:  mtu 1460 qdisc fq_codel state UP group default qlen 1000
    link/ether 42:01:0a:01:02:0d brd ff:ff:ff:ff:ff:ff
    altname enp0s4
    inet 10.1.2.13/32 metric 100 scope global dynamic ens4
       valid_lft 84283sec preferred_lft 84283sec
    inet6 fe80::4001:aff:fe01:20d/64 scope link
       valid_lft forever preferred_lft forever

次のステップ