Compute Engine はプロトコル転送機能をサポートしています。この機能を使用して、NAT 処理されないターゲット インスタンスにパケットを送信できる転送ルール オブジェクトを作成できます。各ターゲット インスタンスには、対応する転送ルールからトラフィックを受け取って処理する単一の仮想マシン(VM)インスタンスが含まれています。
プロトコルの転送は、次のようなさまざまな状況で使用できます。
IP ごとの仮想ホスティング
1 つのターゲット インスタンスをポイントする複数の転送ルールを設定すると、1 つの VM インスタンスが設定された複数の外部 IP アドレスを使用できます。これは、1 つの VM インスタンスから複数の外部 IP アドレス経由でデータを供給する場合に使用できます。SSL 仮想ホスティングを設定する場合に特に便利です。
仮想プライベート ネットワーク(VPN)
詳しくは、次をご覧ください。
プライベート VIP
VPC サブネットの範囲を使用するプライベート リージョン転送ルールのプロトコル転送を使用できます。この機能を使用して、TCP または UDP トラフィックを同じリージョン内のターゲット インスタンスに送信するプライベート転送ルールを構成します。プライベート リージョン転送ルールを、ターゲット インスタンスを使用したバックエンド サービスからバックエンド サービスに、またはその逆に切り替えることもできます。
負荷分散
ロードバランサへのトラフィックの転送については、転送ルールのコンセプトをご覧ください。
IP、仮想プライベート ネットワーク(VPN)、負荷分散による仮想ホスティングの場合、Compute Engine は次のプロトコルのプロトコル転送をサポートしています。
AH
: IP 認証ヘッダー プロトコルを指定します。ESP
: IP カプセル化セキュリティ ペイロード プロトコルを指定します。ICMP
: インターネット制御メッセージ プロトコルを指定します。SCTP
: ストリーム制御伝送プロトコルを指定します。TCP
: 伝送制御プロトコルを指定します。UDP
: User Datagram Protocol を指定します。
プライベート VIP の場合は、TCP と UDP のみがサポートされます。
TCP
: 伝送制御プロトコルを指定します。UDP
: User Datagram Protocol を指定します。
プロトコル転送は、負荷分散サービスと同じレートで課金されます。 詳細については、料金のページをご覧ください。
始める前に
転送ルールを作成するために必要な権限があることを確認します。
Identity and Access Management(IAM)条件が、メンバーに内部転送ルールの作成のみを許可する条件を付与しないようにします。このような条件が存在する場合、転送ルールの作成に失敗し、権限エラーが発生します。
詳細については、アクセス制御の概要をご覧ください。
クイックスタート
このクイックスタートは、bash
を十分に理解していることを前提としています。
1 つのインスタンスにトラフィックを送信する転送ルールを作成するには、次のようにする必要があります。
ターゲット インスタンスを作成します。
作成するターゲット インスタンスは単一の VM インスタンスです。このインスタンスは、ターゲット インスタンスを作成する前に用意しておいても、後で作成してもかまいません。
転送ルールを作成します。
ターゲット インスタンスは、転送ルールを作成する前に用意しておく必要があります。着信パケットが、転送ルールによって処理される IP、プロトコル、および(該当する場合は)ポート範囲と一致する場合、転送ルールはそのトラフィックをターゲット インスタンスに送信します。
このクイックスタートの残りの部分では、上記の手順を以下の順で詳しく説明します。
このクイックスタートを完了すると、複数の転送ルールから 1 つのターゲット インスタンスに転送するプロトコルを設定する方法がわかります。
VM インスタンスの設定と Apache のインストール
Apache をインストールして単一の VM インスタンスを作成するには:
新しいインスタンス用のスタートアップ スクリプトをいくつか作成します。
オペレーティング システムによって、スタートアップ スクリプトに含まれる内容が以下のように異なる場合があります。
インスタンスで 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
将来的に使用する VM 用にタグを作成し、後でそれにファイアウォールを適用できるようにします。
me@local:~$ TAG="www-tag"
転送ルールに応じてトラフィックを処理する、新しい 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
こうした VM インスタンスへの外部トラフィックを許可するファイアウォール ルールの作成します。
gcloud compute firewall-rules create www-firewall --target-tags $TAG --allow tcp
これで、VM インスタンスが正常に設定されました。ここで、プロトコルの転送構成の設定を開始できます。
ターゲット インスタンスと、対応する転送ルールの作成
ターゲット インスタンスを作成します。
ターゲット インスタンスには、転送ルールからトラフィックを受け取り、処理する単一の VM インスタンスが含まれています。ターゲット インスタンスには NAT ポリシーがないため、それらのインスタンスを使用して、IPsec プロトコルを直接使用する独自の VPN 接続を設定できます。
転送ルールは既存のターゲット リソースを参照する必要があるため、転送ルールを作成する前にターゲット インスタンスを作成しておく必要があります。存在しないターゲット リソースにトラフィックを送信する転送ルールを作成することはできません。この例では、次のようにしてターゲット インスタンスを作成します。
gcloud compute target-instances create pf-target-instance --instance pf-instance
転送ルール オブジェクトを作成します。
転送ルール オブジェクトは、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
ターゲット インスタンスへのトラフィックの送信を開始できるようになりました。
インスタンスへのトラフィックの送信
新しい転送ルールの外部 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 アドレスをメモしておきます。
宛先 URL に基づいて異なる情報を提供するように、VM インスタンスの Apache 仮想ホストを構成します。
まず、インスタンスに接続します。
gcloud compute ssh pf-instance
次に、
/etc/apache2/sites-enabled/000-default.conf
ファイルを編集して次の行を追加します。VirtualHost
cd .. 行には、前の手順で確認した 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
いくつかのトラフィックをインスタンスに送信してみます。
ローカルマシンで、作成した転送ルールによって処理される外部 IP アドレスへのリクエストを作成します。
次に、
curl
を使用して IP アドレスにトラフィックを送信します。IP アドレスに応じて、w1
、w2
、または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
ESP
、AH
、SCTP
、ICMP
です。ポート範囲は、
TCP
、UDP
、SCTP
プロトコルでのみ使用できます。断片化された UDP パケットを想定している場合は、ターゲットごとに 1 つの UDP 転送ルールのみを使用し、
0-65535
のすべてのポートでトラフィックを受け入れるように転送ルールを構成します。これにより、同じ宛先ポートがない場合でも、すべてのフラグメントが同じ転送ルールに到達するようになります。
転送ルールの追加
gcloud compute forwarding-rules create
コマンドを使用したり、転送ルール コレクションに対する HTTP POST
リクエストを作成したりして、新しい転送ルールを追加できます。gcloud
を使用してターゲット インスタンスへの転送ルールを作成する例を次に示します。
gcloud compute forwarding-rules create [FORWARDING_RULE] \
--load-balancing-scheme internal | external \
--region [REGION] \
[--target-instance-zone [ZONE]] \
--ip-protocol TCP --ports 80 \
--target-instance [TARGET_INSTANCE]
gcloud config set compute/zone
によって compute/zone
プロパティが設定されておらず、--target-instance-zone
フラグが省略された場合、gcloud
コマンドライン ツールはゾーンの選択を求めるプロンプトを表示します。詳細については、デフォルト プロパティの設定をご覧ください。
gcloud compute forwarding-rules create
コマンドでは、負荷分散スキームが内部である場合にターゲット インスタンスをターゲットとして設定することがサポートされます。
gcloud config set compute/region
によって compute/region
プロパティが設定されておらず、--region
フラグが省略された場合、gcloud
コマンドライン ツールはリージョンの選択を求めるプロンプトを表示します。詳細については、デフォルト プロパティの設定をご覧ください。
使用可能なフラグの詳細については、転送ルールの create
コマンドを参照するか、「gcloud compute forwarding-rules create --help
」と入力します。
API を使用して転送ルールを追加するには、次の URI に対して HTTP POST
リクエストを実行します。
https://compute.googleapis.com/compute/v1/projects/myproject/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 つの仮想マシン インスタンスが含まれており、単一のソース(ESP
や AH
など)によって管理される必要のある特定のタイプのプロトコル トラフィックを転送するのに理想的ですが、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 からプロトコル転送の組織のポリシーを設定するには、次の手順を実施します。
- Google Cloud Console で、[組織のポリシー] ページに移動します。
- [フィルタ] フィールドに「
protocol
」と入力し、[constraints/compute.restrictProtocolForwardingCreationForTypes] を選択します。 - [IP アドレスの種類に基づいてプロトコル転送を制限する] をクリックします。
- [編集] をクリックして、既存のプロトコル転送ポリシーの制約を編集します。
- カスタム ポリシーを作成するには、[カスタマイズ] を選択します。
- 変更を加えたら、[保存] をクリックして制約の設定を適用します。
gcloud
プロトコル転送の組織のポリシーを設定するには、gcloud resource-manager org-policies
enable-enforce
コマンドを使用します。
自分の組織 ID を確認します。
gcloud organizations list
次の例に示すように、ポリシー ファイルを作成します。
拒否する値を一覧表示する
{ "constraint": "constraints/compute.restrictProtocolForwardingCreationForTypes", "listPolicy": { "deniedValues": [ "INTERNAL", "EXTERNAL" ] } }
内部転送ルールを許可する
{ "constraint": "constraints/compute.restrictProtocolForwardingCreationForTypes", "listPolicy": { "deniedValues": [ "EXTERNAL" ] } }
すべての転送ルールを拒否する
{ "constraint": "constraints/compute.restrictProtocolForwardingCreationForTypes", "listPolicy": { "allValues": "DENY" } }
組織で制約を設定します。ここで、
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 つのポートを使用できます。