プロトコル転送の使用

Compute Engine はプロトコル転送機能をサポートしています。この機能を使用して、NAT 処理されないターゲット インスタンスにパケットを送信できる転送ルール オブジェクトを作成できます。各ターゲット インスタンスには、対応する転送ルールからトラフィックを受け取って処理する単一の仮想マシン(VM)インスタンスが含まれています。

プロトコルの転送は、次のようなさまざまな状況で使用できます。

  • IP ごとの仮想ホスティング

    1 つのターゲット インスタンスをポイントする複数の転送ルールを設定すると、1 つの VM インスタンスが設定された複数の外部 IP アドレスを使用できます。これは、1 つの VM インスタンスから複数の外部 IP アドレス経由でデータを供給する場合に使用できます。SSL 仮想ホスティングを設定する場合に特に便利です。

  • 仮想プライベート ネットワーク(VPN)

    詳しくは、次をご覧ください。

  • プライベート VIP

    VPC サブネットの範囲を使用するプライベート リージョン転送ルールのプロトコル転送を使用できます。この機能を使用して、TCP または UDP トラフィックを同じリージョン内のターゲット インスタンスに送信するプライベート転送ルールを構成します。プライベート リージョン転送ルールを、ターゲット インスタンスを使用したバックエンド サービスからバックエンド サービスに、またはその逆に切り替えることもできます。

  • 負荷分散

    ロードバランサへのトラフィックの転送については、転送ルールのコンセプトをご覧ください。

IP、仮想プライベート ネットワーク(VPN)、負荷分散による仮想ホスティングの場合、Compute Engine は次のプロトコルのプロトコル転送をサポートしています。

プライベート VIP の場合は、TCP と UDP のみがサポートされます。

プロトコル転送は、負荷分散サービスと同じレートで課金されます。 詳細については、料金のページをご覧ください。

権限

外部転送ルールを作成できる Identity and Access Management(IAM)ロールがあることを確認してください。詳細については、転送ルールのドキュメントの権限のセクションをご覧ください。

クイックスタート

このクイックスタートは、bash を十分に理解していることを前提としています。

1 つのインスタンスにトラフィックを送信する転送ルールを作成するには、次のようにする必要があります。

  1. ターゲット インスタンスを作成します。

    作成するターゲット インスタンスは単一の VM インスタンスです。このインスタンスは、ターゲット インスタンスを作成する前に用意しておいても、後で作成してもかまいません。

  2. 転送ルールを作成します。

    ターゲット インスタンスは、転送ルールを作成する前に用意しておく必要があります。着信パケットが、転送ルールによって処理される IP、プロトコル、および(該当する場合は)ポート範囲と一致する場合、転送ルールはそのトラフィックをターゲット インスタンスに送信します。

このクイックスタートの残りの部分では、上記の手順を以下の順で詳しく説明します。

  1. VM インスタンスに Apache サーバーを設定します。
  2. ターゲット インスタンスと、対応する転送ルールを作成します。
  3. 1 つのターゲット インスタンスにトラフィックを送信します。

このクイックスタートを完了すると、複数の転送ルールから 1 つのターゲット インスタンスに転送するプロトコルを設定する方法がわかります。

VM インスタンスの設定と Apache のインストール

Apache をインストールして単一の VM インスタンスを作成するには:

  1. 新しいインスタンス用のスタートアップ スクリプトをいくつか作成します。

    オペレーティング システムによって、スタートアップ スクリプトに含まれる内容が以下のように異なる場合があります。

    • インスタンスで Debian イメージを使用する予定の場合、次のコマンドを実行します。

      me@local:~$ echo "sudo apt update && sudo apt -y install apache2 && mkdir -p /var/www1 &&
      mkdir -p /var/www2 && mkdir -p /var/www3 && hostname > /var/www/html/index.html &&
      echo w1 > /var/www1/index.html && echo w2 > /var/www2/index.html && echo w3 > /var/www3/index.html" > 
      $HOME/pf_startup.sh

    • インスタンスで CentOS イメージを使用する予定の場合、次のコマンドを実行します。

      me@local:~$ echo "sudo yum -y install httpd && sudo service httpd restart && mkdir -p /var/www1 &&
      mkdir -p /var/www2 && mkdir /var/www3 && hostname > /var/www/html/index.html &&
      echo w1 > /var/www1/index.html && echo w2 > /var/www2/index.html && echo w3 > /var/www3/index.html" > 
      $HOME/pf_startup.sh

  2. 将来的に使用する VM 用にタグを作成し、後でそれにファイアウォールを適用できるようにします。

    me@local:~$ TAG="www-tag"
    
  3. 転送ルールに応じてトラフィックを処理する、新しい VM インスタンスを作成します。

    gcloud compute instances create pf-instance \
        --image-project debian-cloud --image-family debian-9 --tags $TAG \
        --metadata-from-file startup-script=$HOME/pf_startup.sh
    
  4. こうした VM インスタンスへの外部トラフィックを許可するファイアウォール ルールの作成します。

    gcloud compute firewall-rules create www-firewall --target-tags $TAG --allow tcp
    

これで、VM インスタンスが正常に設定されました。ここで、プロトコルの転送構成の設定を開始できます。

ターゲット インスタンスと、対応する転送ルールの作成

  1. ターゲット インスタンスを作成します。

    ターゲット インスタンスには、転送ルールからトラフィックを受け取り、処理する単一の VM インスタンスが含まれています。ターゲット インスタンスには NAT ポリシーがないため、それらのインスタンスを使用して、IPsec プロトコルを直接使用する独自の VPN 接続を設定できます。

    転送ルールは既存のターゲット リソースを参照する必要があるため、転送ルールを作成する前にターゲット インスタンスを作成しておく必要があります。存在しないターゲット リソースにトラフィックを送信する転送ルールを作成することはできません。この例では、次のようにしてターゲット インスタンスを作成します。

    gcloud compute target-instances create pf-target-instance --instance pf-instance
    
  2. 転送ルール オブジェクトを作成します。

    転送ルール オブジェクトは、IP プロトコルとポートに一致するトラフィックを、指定したターゲット インスタンスに送信します。詳細については、転送ルールのドキュメントをご覧ください。

    この例では、次のコマンドによって 3 つの転送ルールが作成されます。それぞれに、TCP トラフィックをターゲット インスタンスに転送するエフェメラル IP アドレスがあります。複数の静的外部 IP アドレスがある場合は、必要に応じて --address IP-ADDRESS フラグを指定して、それらの IP アドレスを転送ルールで使用できます。

    gcloud compute forwarding-rules create pf-rule1 --ip-protocol TCP \
        --ports 80 --target-instance pf-target-instance
    
    gcloud compute forwarding-rules create pf-rule2 --ip-protocol TCP \
        --ports 80 --target-instance pf-target-instance
    
    gcloud compute forwarding-rules create pf-rule3 --ip-protocol TCP \
        --ports 80 --target-instance pf-target-instance
    

ターゲット インスタンスへのトラフィックの送信を開始できるようになりました。

インスタンスへのトラフィックの送信

  1. 新しい転送ルールの外部 IP アドレスを取得します。

    gcloud compute forwarding-rules list を実行して、転送ルールの外部 IP アドレスを取得します。たとえば、次の表には以前に作成した転送ルールに割り振られたエフェメラル IP アドレスのリストが示されています。

    予約された IP アドレスを使用するように選択すると、エフェメラル IP アドレスの代わりに、それらのアドレスがここに表示されます。

    gcloud compute forwarding-rules list
    
    NAME     REGION      IP_ADDRESS     IP_PROTOCOL TARGET
    pf-rule1 us-central1 [ADDRESS_1]    TCP         us-central1-a/targetInstances/pf-target-instance
    pf-rule2 us-central1 [ADDRESS_2]    TCP         us-central1-a/targetInstances/pf-target-instance
    pf-rule3 us-central1 [ADDRESS_3]    TCP         us-central1-a/targetInstances/pf-target-instance

    次の手順に備えて IP アドレスをメモしておきます。

  2. 宛先 URL に基づいて異なる情報を提供するように、VM インスタンスの Apache 仮想ホストを構成します。

    まず、インスタンスに接続します。

    gcloud compute ssh pf-instance
    

    次に、/etc/apache2/sites-enabled/000-default.conf ファイルを編集して次の行を追加します。VirtualHostcd .. 行には、前の手順で確認した IP アドレスを使用します。

    <VirtualHost [ADDRESS_1]>
     DocumentRoot /var/www1
     <Directory /var/www1>
      Require all granted
     </Directory>
    </VirtualHost>
    <VirtualHost [ADDRESS_2]>
     DocumentRoot /var/www2
     <Directory /var/www2>
      Require all granted
     </Directory>
    </VirtualHost>
    <VirtualHost [ADDRESS_3]>
     DocumentRoot /var/www3
     <Directory /var/www3>
      Require all granted
     </Directory>
    </VirtualHost>
    

    最後に、Apache を再始動します。

    user@myinst:~$ sudo /etc/init.d/apache2 restart
    
  3. いくつかのトラフィックをインスタンスに送信してみます。

    ローカルマシンで、作成した転送ルールによって処理される外部 IP アドレスへのリクエストを作成します。

    次に、curl を使用して IP アドレスにトラフィックを送信します。IP アドレスに応じて、w1w2、または w3 のレスポンスが返されます。

    me@local:~$curl ADDRESS_1
    w1
    
    me@local:~$ curl ADDRESS_2
    w2
    
    me@local:~$ curl ADDRESS_3
    w3
    

    プロトコル転送の構成が完了しました。

転送ルール

転送ルールは、ターゲット インスタンスと連携してプロトコル転送機能をサポートします。転送ルールは Cloud Load Balancing などの他のプロダクトでも使用されていますが、このセクションでは、個別の VM にプロトコル転送を行う際に転送ルールを使用する場合のみについて説明します。

転送ルールのリソースは転送ルールのコレクションに含まれています。各転送ルールでは、特定の IP アドレス、プロトコル、ポート範囲(オプション)が、単一のターゲット インスタンスと照合されます。トラフィックが転送ルールから提供される外部 IP アドレスに送信されると、転送ルールによってターゲット インスタンスにそのトラフィックが振り向けられます。

転送ルールを扱うときに注意する必要のある点を以下に示します。

  • 転送ルールの名前はこのプロジェクト内で固有であり、63 文字以内の長さで、正規表現 [a-z]([-a-z0-9]*[a-z0-9])? と一致している必要があります。この正規表現は、先頭文字に小文字を使用し、残りの文字には、ダッシュ、小文字、数字を使用する必要があることを示しています。ただし最後の文字にはダッシュを使用できません。

  • 転送ルールのプロトコルを指定しなかった場合は、デフォルトの TCP が使用されます。サポートされているその他のプロトコルは、UDP ESPAHSCTPICMPL3_DEFAULT(現在プレビュー版)です。

    L3_DEFAULT 転送ルール プロトコルは、バックエンド サービスベースのネットワーク ロードバランサで TCP、UDP、ESP、ICMP トラフィックの負荷分散に使用されます。L3_DEFAULT は、負荷分散方式が EXTERNAL の場合にのみサポートされます。

  • ポート範囲は、TCPUDPSCTP プロトコルでのみ使用できます。

  • 次の場合は、すべてのポートを構成する必要があります。

    • L3_DEFAULT 転送ルールを使用している。

    • 断片化された UDP パケットが想定される。ターゲットごとに UDP 転送ルールを 1 つだけ使用して、すべてのポートでトラフィックを受信するように転送ルールを構成します。これにより、同じ宛先ポートがない場合でも、すべてのフラグメントが同じ転送ルールに到達するようになります。

    すべてのポートを構成するには、gcloud を使用して --ports=ALL を設定するか、API を使用して allPortsTrue設定します。

転送ルールの追加

gcloud compute forwarding-rules create コマンドを使用したり、転送ルール コレクションに対する HTTP POST リクエストを作成したりして、新しい転送ルールを追加できます。

gcloud

gcloud を使用して新しい転送ルールを追加するには:

gcloud compute forwarding-rules create FORWARDING_RULE_NAME \
    --load-balancing-scheme SCHEME \
    --region REGION \
    --target-instance-zone ZONE \
    --ip-protocol PROTOCOL \
    --ports PORTS \
    --target-instance TARGET_INSTANCE_NAME

gcloud config set compute/zone によって compute/zone プロパティが設定されておらず、--target-instance-zone フラグが省略された場合、gcloud コマンドライン ツールはゾーンの選択を求めるプロンプトを表示します。詳細については、デフォルト プロパティの設定をご覧ください。

gcloud config set compute/region によって compute/region プロパティが設定されておらず、--region フラグが省略された場合、gcloud コマンドライン ツールはリージョンの選択を求めるプロンプトを表示します。詳細については、デフォルト プロパティの設定をご覧ください。

使用可能なフラグの詳細については、転送ルールの create コマンドを参照するか、「gcloud compute forwarding-rules create --help」と入力します。

API

API を使用して転送ルールを追加するには、次の URI に対して HTTP POST リクエストを実行します。

https://compute.googleapis.com/compute/v1/projects/[project ID]/regions/us-central1/forwardingRules

リクエスト ボディには、次のフィールドが含まれている必要があります。

{
 "name": "example-forwarding-rule",
 "IPAddress": "`10.1.1.1",
 "IPProtocol": "TCP",
 "portRange": "80",
 "target": "zones/us-central1-f/targetInstances/example-target-instances"
}

転送ルールの一覧表示、転送ルールの情報の取得、転送ルールの削除については、gcloud SDK と API のリファレンス ページをご覧ください。

ターゲット インスタンス

ターゲット インスタンス リソースには、1 つ以上の転送ルールからトラフィックを処理する 1 つの仮想マシン インスタンスが含まれており、単一のソース(ESPAH など)によって管理される必要のある特定のタイプのプロトコル トラフィックを転送するのに理想的ですが、TCP プロトコルと UDP プロトコルにはターゲット インスタンスを使用することもできます。ターゲット インスタンスには、それらに適用されている NAT ポリシーがないため、仮想プライベート ネットワーク(VPN)に対して NAT 処理されない IPsec トラフィックが必要なトラフィックに使用できます。

ターゲット インスタンスは、転送ルールと同じリージョンに存在する必要があります。また、ターゲット インスタンスは、VM インスタンスと同じゾーンに存在する必要もあります。たとえば、転送ルールが us-central1 に存在し、使用するインスタンスが us-central1-a に存在する場合、ターゲット インスタンスは us-central1-a に存在する必要があります。インスタンスが us-central1-b に存在する場合、ターゲット インスタンスも us-central1-b に存在する必要があります。

ターゲット インスタンスの追加

新しいターゲット インスタンスを追加するには、gcloud compute target-instances コマンドを使用するか、targetInstances コレクションに対する HTTP POST リクエストを作成します。Cloud Console を使用してターゲット インスタンス リソースを作成することはできません。次に、gcloud コマンドライン ツールを使用してターゲット インスタンスを作成する例を示します。

gcloud compute target-instances create [TARGET_INSTANCE] --instance INSTANCE

gcloud config set compute/zone によって compute/zone プロパティが設定されておらず、--zone フラグが省略された場合、gcloud コマンドライン ツールはゾーンの選択を求めるプロンプトを表示します。詳細については、デフォルト プロパティの設定をご覧ください。

使用可能なフラグの詳細については、create コマンドを参照するか、「gcloud compute target-instances create --help」と入力します。

API で、次の URI に HTTP POST リクエストを送ります。

https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-f/targetInstances

次のリクエスト ボディを使用します。

body = {
  "name": "example-target-instance",
  "instance": "zones/us-central1-f/instances/example-instance"
}

ターゲット インスタンスの一覧表示、ターゲット インスタンスの情報の取得、ターゲット インスタンスの削除については、gcloud SDK と API のリファレンス ページをご覧ください。

プライベート VIP のためのプロトコル転送

プロトコル転送は、プライベート リージョン転送ルールに使用できます。 この機能を使用して、TCP または UDP トラフィックを同じリージョン内のターゲット インスタンスに送信するプライベート転送ルールを構成します。プライベート リージョン転送ルールを、ターゲット インスタンスを使用したバックエンドサービスからバックエンド サービスに、またはその逆に、簡単に切り替えることもできます。

ターゲット インスタンスには、1 つ以上の転送ルールによってトラフィックを処理する 1 つのバックエンド インスタンスが含まれます。各ターゲット インスタンスを指定する 1 つのプライベート転送ルールのみを構成できます。

ターゲット インスタンスを含むプライベート転送ルール(クリックして拡大)。
ターゲット インスタンスを含むプライベート転送ルール(クリックして拡大)。

次の状況では、プライベート転送ルールとともにプロトコル転送を使用します。

  • サービス用に単一のバックエンド インスタンスをデプロイし、ヘルスチェックやその他の側面を自分で管理する場合。
  • 転送ルールのプライベート IP アドレスを保持しながら、転送ルールがポイントするターゲット インスタンスを変更する場合。
  • デプロイを安定させるために、転送ルールのプライベート IP アドレスを変更せずに単一のインスタンス(ターゲット インスタンス)から複数のバックエンド インスタンス(バックエン ドサービス)に簡単に移動できるようにする場合。

ターゲット インスタンスとバックエンド サービスの間の移行

1 つの VM インスタンスを使用してターゲット インスタンスにトラフィックを転送するプライベート転送ルールを、バックエンド サービスにトラフィックを転送するように更新できます。また、その逆方向に更新することもできます。このようにプライベート転送ルールを更新すると、転送ルールの IP アドレスが保持されます。変更によってバックエンド サービス インスタンスの負荷分散が有効または無効になるため、この移行中に既存の接続が中断される可能性があります。

バックエンド サービスからターゲット インスタンスへの移行(クリックして拡大)。
バックエンド サービスからターゲット インスタンスへの移行(クリックして拡大)。

ターゲット インスタンスとバックエンド サービスの間での移行には、プライベート転送ルールのみを使用できます。外部転送ルールを使用したプロトコル転送では、これを行うことができません。

プライベート転送ルールのターゲットの更新

転送ルールがプライベート転送ルールの場合、ターゲット インスタンスをポイントするのではなく、バックエンド サービスをポイントするように変更できます。

    gcloud compute forwarding-rules set-target my-forwarding-rule
        --backend-service my-backend-service

ターゲット インスタンスに戻すには次のようにします。

    gcloud compute forwarding-rules set-target my-forwarding-rule
        --target-instance my-target-instance

プロジェクト、フォルダ、組織全体でのプロトコル転送設定の適用

組織のポリシーを使用して、組織で作成できるプロトコル転送タイプを制限します。次の組織のポリシーの制約を設定します。

constraints/compute.restrictProtocolForwardingCreationForTypes

compute.restrictProtocolForwardingCreationForTypes 制約を設定するときに、許可されていないプロトコル転送タイプを指定します。使用可能なタイプのリストについては、プロトコル転送の作成の制限をご覧ください。

組織のポリシーの設定

Console

Console からプロトコル転送の組織のポリシーを設定するには、次の手順を実施します。

  1. Google Cloud Console で、[組織のポリシー] ページに移動します。

    [組織のポリシー] ページに移動

  2. [フィルタ] フィールドに「protocol」と入力し、[constraints/compute.restrictProtocolForwardingCreationForTypes] を選択します。
  3. [IP アドレスの種類に基づいてプロトコル転送を制限する] をクリックします。
  4. [編集] をクリックして、既存のプロトコル転送ポリシーの制約を編集します。
  5. カスタム ポリシーを作成するには、[カスタマイズ] を選択します。
  6. 変更を加えたら、[保存] をクリックして制約の設定を適用します。

gcloud

プロトコル転送の組織のポリシーを設定するには、gcloud resource-manager org-policies enable-enforce コマンドを使用します。

  1. 自分の組織 ID を確認します。

    gcloud organizations list
  2. 次の例に示すように、ポリシー ファイルを作成します。

    拒否する値を一覧表示する

    {
      "constraint": "constraints/compute.restrictProtocolForwardingCreationForTypes",
       "listPolicy": {
         "deniedValues": [
           "INTERNAL",
           "EXTERNAL"
         ]
       }
     }
     

    内部転送ルールを許可する

    {
      "constraint": "constraints/compute.restrictProtocolForwardingCreationForTypes",
       "listPolicy": {
         "deniedValues": [
           "EXTERNAL"
         ]
       }
     }
     

    すべての転送ルールを拒否する

    {
      "constraint": "constraints/compute.restrictProtocolForwardingCreationForTypes",
      "listPolicy": {
        "allValues": "DENY"
      }
    }
    
  3. 組織で制約を設定します。ここで、ORGANIZATION_ID は実際の組織 ID に置き換えます。

    gcloud resource-manager org-policies set-policy POLICY_FILE \
        --organization=ORGANIZATION_ID
    

    さらに、--folder フラグまたは --project フラグ、フォルダ ID、プロジェクト ID をそれぞれ使用して、フォルダやプロジェクトに対してプロトコル転送の組織のポリシーを適用することもできます。

    フォルダの場合は、次のコマンドを実行します。

    gcloud resource-manager org-policies set-policy POLICY_FILE \
        --folder=FOLDER_ID
    

    プロジェクトの場合は、次のコマンドを実行します。

    gcloud resource-manager org-policies set-policy POLICY_FILE \
        --project=PROJECT_ID
    

    以下のように置き換えます。

ポリシーを設定すると、それぞれの Google Cloud 転送ルールを追加するときにポリシーが適用されます。

この制約は、既存のプロトコル転送構成には適用されません。

制約に違反するタイプのプロトコル転送を作成しようとすると失敗し、エラー メッセージが生成されます。エラー メッセージの形式は次のとおりです。

Constraint constraints/compute.restrictProtocolForwardingCreationForTypes
violated for projects/PROJECT_NAME. Forwarding Rule projects/PROJECT_NAME/region/REGION/forwardingRules/FORWARDING_RULE_NAME
of type SCHEME is not allowed.

異なるリソースレベルで複数の restrictProtocolForwardingCreationForTypes 制約を設定し、inheritFromParent フィールドを true に設定すると、制約は階層的に適用されます。

使用可能なオプションの説明を含めて、組織のポリシーの設定の詳細については、組織のポリシーの作成と管理制約の使用をご覧ください。

制限事項

  • プライベート転送ルールでターゲット インスタンスを使用する場合、サポートされるプロトコルは TCP と UDP だけです。

制限

  • ネットワークごとに、ターゲット インスタンスをポイントする 100 個のプライベート転送ルールを構成できます。

  • プライベート転送ルールごとに 5 つのポートを使用できます。

次のステップ