1. はじめに
静的カスタムルートは、VPC のデフォルトのルーティング動作に影響します。IPv6 カスタムルートで、新しいネクストホップ属性(next-hop-gateway、next-hop-instance、next-hop-address)がサポートされるようになりました。この Codelab では、マルチ NIC VM インスタンスで接続された 2 つの VPC を使用して、これらの新しいネクストホップ オプションで IPv6 カスタムルートを使用する方法について説明します。また、ULA アドレスと GUA アドレスを混在させ、新しいカスタム ルート機能を使用して ULA VPC から公共のインターネットへのネットワーク到達性を提供する方法も説明します。
学習内容
- ILB の名前を指定してネクストホップ ILB ネクストホップを含む IPv6 カスタムルートを作成する方法
- ILB の IPv6 アドレスを指定して、ネクストホップ ILB ネクストホップで IPv6 カスタムルートを作成する方法
必要なもの
- Google Cloud プロジェクト
2. 始める前に
Codelabs をサポートするようにプロジェクトを更新する
この Codelab では、$変数を使用して、Cloud Shell での gcloud 構成の実装を支援します。
Cloud Shell で、次の操作を行います。
gcloud config list project
gcloud config set project [YOUR-PROJECT-NAME]
export projectname=$(gcloud config list --format="value(core.project)")
ラボの全体的なアーキテクチャ

両方のタイプのカスタムルートのネクストホップを示すために、ULA アドレス指定を使用するクライアント VPC とサーバー VPC の 2 つの VPC を作成します。
クライアント VPC がサーバーにアクセスするには、2 つの ILB の間に挟まれたマルチ NIC ゲートウェイ インスタンスのグループの前面にある ILB(ILB の名前を使用)を指す next-hop-ilb を使用してカスタムルートを利用します。(デフォルトの ::/0 ルートを削除した後で)クライアント インスタンスへのルーティングを提供するには、ネクストホップ ilb(ILB のアドレスを使用)が ILB を指すカスタムルートを使用します。
3. クライアント VPC の設定
クライアント VPC を作成する
Cloud Shell で、次の操作を行います。
gcloud compute networks create client-vpc \
--project=$projectname \
--subnet-mode=custom --mtu=1500 \
--bgp-routing-mode=regional \
--enable-ula-internal-ipv6
クライアント サブネットを作成する
Cloud Shell で、次の操作を行います。
gcloud compute networks subnets create client-subnet \
--network=client-vpc \
--project=$projectname \
--range=192.168.1.0/24 \
--stack-type=IPV4_IPV6 \
--ipv6-access-type=internal \
--region=us-central1
このコマンドを使用して、割り当てられた IPv6 サブネットを環境変数に記録します。
export client_subnet=$(gcloud compute networks subnets \
describe client-subnet \
--project $projectname \
--format="value(internalIpv6Prefix)" \
--region us-central1)
クライアント インスタンスを起動する
Cloud Shell で、次の操作を行います。
gcloud compute instances create client-instance \
--subnet client-subnet \
--stack-type IPV4_IPV6 \
--zone us-central1-a \
--project=$projectname
クライアント VPC トラフィック用のファイアウォール ルールを追加する
Cloud Shell で、次の操作を行います。
gcloud compute firewall-rules create allow-gateway-client \
--direction=INGRESS --priority=1000 \
--network=client-vpc --action=ALLOW \
--rules=tcp --source-ranges=$client_subnet \
--project=$projectname
クライアント インスタンスで IAP を許可するファイアウォール ルールを追加する
Cloud Shell で、次の操作を行います。
gcloud compute firewall-rules create allow-iap-client \
--direction=INGRESS --priority=1000 \
--network=client-vpc --action=ALLOW \
--rules=tcp:22 --source-ranges=35.235.240.0/20 \
--project=$projectname
クライアント インスタンスへの SSH アクセスを確認する
Cloud Shell 内で、client-instance にログインします。
gcloud compute ssh client-instance \
--project=$projectname \
--zone=us-central1-a \
--tunnel-through-iap
成功すると、クライアント インスタンスのターミナル ウィンドウが表示されます。SSH セッションを終了して、Codelab を続行します。
4. サーバー VPC の設定
サーバー VPC を作成する
Cloud Shell で、次の操作を行います。
gcloud compute networks create server-vpc \
--project=$projectname \
--subnet-mode=custom --mtu=1500 \
--bgp-routing-mode=regional \
--enable-ula-internal-ipv6
サーバー サブネットを作成する
Cloud Shell で、次の操作を行います。
gcloud compute networks subnets create server-subnet \
--network=server-vpc \
--project=$projectname \
--range=192.168.0.0/24 \
--stack-type=IPV4_IPV6 \
--ipv6-access-type=internal \
--region=us-central1
次のコマンドを使用して、割り当てられたサブネットを環境変数に記録します。
export server_subnet=$(gcloud compute networks subnets \
describe server-subnet \
--project $projectname \
--format="value(internalIpv6Prefix)" \
--region us-central1)
サーバー VM を起動する
Cloud Shell で、次の操作を行います。
gcloud compute instances create server-instance \
--subnet server-subnet \
--stack-type IPV4_IPV6 \
--zone us-central1-a \
--project=$projectname
クライアントからサーバーへのアクセスを許可するファイアウォール ルールを追加する
Cloud Shell で、次の操作を行います。
gcloud compute firewall-rules create allow-client-server \
--direction=INGRESS --priority=1000 \
--network=server-vpc --action=ALLOW \
--rules=tcp --source-ranges=$client_subnet \
--project=$projectname
IAP を許可するファイアウォール ルールを追加する
Cloud Shell で、次の操作を行います。
gcloud compute firewall-rules create allow-iap-server \
--direction=INGRESS --priority=1000 \
--network=server-vpc --action=ALLOW \
--rules=tcp:22 \
--source-ranges=35.235.240.0/20 \
--project=$projectname
ULA サーバー インスタンスに Apache をインストールする
Cloud Shell 内で、client-instance にログインします。
gcloud compute ssh server-instance \
--project=$projectname \
--zone=us-central1-a \
--tunnel-through-iap
サーバー VM シェル内で、次のコマンドを実行します。
sudo apt update && sudo apt -y install apache2
Apache が実行されていることを確認する
sudo systemctl status apache2
デフォルトのウェブページを上書きする
echo '<!doctype html><html><body><h1>Hello World! From Server Instance!</h1></body></html>' | sudo tee /var/www/html/index.html
SSH セッションを終了して、Codelab を続行します。
5. Gateway インスタンスを作成する
マルチ NIC ゲートウェイ インスタンス テンプレートを作成する
Cloud Shell で、次の操作を行います。
gcloud compute instance-templates create gateway-instance-template \
--project=$projectname \
--instance-template-region=us-central1 \
--region=us-central1 \
--network-interface=stack-type=IPV4_IPV6,subnet=client-subnet,no-address \
--network-interface=stack-type=IPV4_IPV6,subnet=server-subnet,no-address \
--can-ip-forward \
--metadata=startup-script='#! /bin/bash
sudo sysctl -w net.ipv6.conf.ens4.accept_ra=2
sudo sysctl -w net.ipv6.conf.ens5.accept_ra=2
sudo sysctl -w net.ipv6.conf.ens4.accept_ra_defrtr=1
sudo sysctl -w net.ipv6.conf.all.forwarding=1'
マルチ NIC ゲートウェイ インスタンス グループを作成する
Cloud Shell で、次の操作を行います。
gcloud compute instance-groups managed create gateway-instance-group \
--project=$projectname \
--base-instance-name=gateway-instance \
--template=projects/$projectname/regions/us-central1/instanceTemplates/gateway-instance-template \
--size=2 \
--zone=us-central1-a
ゲートウェイ インスタンスを確認する
起動スクリプトが正しく渡され、v6 ルーティング テーブルが正しいことを確認します。ゲートウェイ インスタンスのいずれかに SSH で接続する
Cloud Shell で、次のコマンドを実行してゲートウェイ インスタンスを一覧表示します。
gcloud compute instances list \
--project=$projectname \
--zones=us-central1-a \
--filter name~gateway \
--format 'csv(name)'
インスタンス名の 1 つをメモし、次のコマンドで使用してインスタンスに SSH 接続します。
Cloud Shell 内で、ゲートウェイ インスタンスのいずれかにログインします。
gcloud compute ssh gateway-instance-<suffix> \
--project=$projectname \
--zone=us-central1-a \
--tunnel-through-iap
ゲートウェイ VM シェル内で次のコマンドを実行して、IPv6 転送を確認します。
sudo sysctl net.ipv6.conf.all.forwarding
このコマンドは、IPv6 転送が有効であることを示す値「1」を返します。
インスタンスの IPv6 ルーティング テーブルを確認する
ip -6 route show
ULA サブネット ルートと GUA サブネット ルートの両方を示す出力例。デフォルト ルートは GUA インターフェースを指しています。
::1 dev lo proto kernel metric 256 pref medium
2600:1900:4000:7a7f:0:1:: dev ens4 proto kernel metric 256 expires 83903sec pref medium
2600:1900:4000:7a7f::/65 via fe80::4001:c0ff:fea8:101 dev ens4 proto ra metric 1024 expires 88sec pref medium
fd20:3df:8d5c::1:0:0 dev ens5 proto kernel metric 256 expires 83904sec pref medium
fd20:3df:8d5c::/64 via fe80::4001:c0ff:fea8:1 dev ens5 proto ra metric 1024 expires 84sec pref medium
fe80::/64 dev ens5 proto kernel metric 256 pref medium
fe80::/64 dev ens4 proto kernel metric 256 pref medium
default via fe80::4001:c0ff:fea8:101 dev ens4 proto ra metric 1024 expires 88sec pref medium
SSH セッションを終了して、Codelab を続行します。
6. ロードバランサ コンポーネントを作成する
両方の VPC にルートを作成する前に、トラフィックを転送するために、ゲートウェイ インスタンスの両側に内部パススルー ロードバランサを作成する必要があります。
この Codelab で作成するロードバランサは、次の要素で構成されます。
- ヘルスチェック: この Codelab では、ポート 22 をターゲットとするシンプルなヘルスチェックを作成します。ヘルスチェックはデプロイされた状態では機能しません(ヘルスチェックを許可するファイアウォール ルールを追加し、ゲートウェイ インスタンスに特別なルートを作成する必要があります)。この Codelab は IPv6 転送に焦点を当てているため、すべてのバックエンドが正常でない場合のデフォルトの内部パススルー ロードバランサのトラフィック分配動作(最後の手段としてすべてのバックエンドに転送する)に依存します。
- バックエンド サービス: バックエンド サービスにはプロトコル TCP を使用します。ただし、ロードバランサはルーティング目的で作成されるため、バックエンド サービス プロトコルに関係なく、すべてのプロトコルが転送されます。
- 転送ルール: VPC ごとに転送ルールを作成します。
- 内部 IPv6 アドレス: この Codelab では、転送ルールでサブネットから IPv6 アドレスを自動的に割り振ります。
ヘルスチェックを作成する
Cloud Shell で、次の操作を行います。
gcloud compute health-checks create tcp tcp-hc-22 \
--project=$projectname \
--region=us-central1 \
--port=22
バックエンド サービスを作成する
Cloud Shell で、次の操作を行います。
gcloud compute backend-services create bes-ilb-clientvpc \
--project=$projectname \
--load-balancing-scheme=internal \
--protocol=tcp \
--network=client-vpc \
--region=us-central1 \
--health-checks=tcp-hc-22 \
--health-checks-region=us-central1
gcloud compute backend-services create bes-ilb-servervpc \
--project=$projectname \
--load-balancing-scheme=internal \
--protocol=tcp \
--network=server-vpc \
--region=us-central1 \
--health-checks=tcp-hc-22 \
--health-checks-region=us-central1
バックエンド サービスにインスタンス グループを追加する
Cloud Shell で、次の操作を行います。
gcloud compute backend-services add-backend bes-ilb-clientvpc \
--project=$projectname \
--region=us-central1 \
--instance-group=gateway-instance-group \
--instance-group-zone=us-central1-a
gcloud compute backend-services add-backend bes-ilb-servervpc \
--project=$projectname \
--region=us-central1 \
--instance-group=gateway-instance-group \
--instance-group-zone=us-central1-a
転送ルールを作成する
Cloud Shell で、次の操作を行います。
gcloud compute forwarding-rules create fr-ilb-clientvpc \
--project=$projectname \
--region=us-central1 \
--load-balancing-scheme=internal \
--network=client-vpc \
--subnet=client-subnet \
--ip-protocol=TCP \
--ip-version=IPV6 \
--ports=ALL \
--backend-service=bes-ilb-clientvpc \
--backend-service-region=us-central1
gcloud compute forwarding-rules create fr-ilb-servervpc \
--project=$projectname \
--region=us-central1 \
--load-balancing-scheme=internal \
--network=server-vpc \
--subnet=server-subnet \
--ip-protocol=TCP \
--ip-version=IPV6 \
--ports=ALL \
--backend-service=bes-ilb-servervpc \
--backend-service-region=us-central1
Cloudshell で次のコマンドを発行して、両方の転送ルールの IPv6 アドレスを記録します。
export fraddress_client=$(gcloud compute forwarding-rules \
describe fr-ilb-clientvpc \
--project $projectname \
--format="value(IPAddress)" \
--region us-central1)
export fraddress_server=$(gcloud compute forwarding-rules \
describe fr-ilb-servervpc \
--project $projectname \
--format="value(IPAddress)" \
--region us-central1)
7. ロードバランサへのルートを作成してテストする(ロードバランサのアドレスを使用)
このセクションでは、ロードバランサの IPv6 アドレスをネクストホップとして使用して、クライアントとサーバーの両方の VPC にルートを追加します。
サーバー アドレスをメモする
Cloud Shell で、次の操作を行います。
gcloud compute instances list \
--project $projectname \
--zones us-central1-a \
--filter="name~server-instance" \
--format='value[separator=","](name,networkInterfaces[0].ipv6Address)'
これにより、サーバー インスタンス名とその IPv6 プレフィックスの両方が出力されます。出力例
server-instance,fd20:3df:8d5c:0:0:0:0:0
サーバー アドレスは、後でクライアント インスタンスの curl コマンドで使用するため、メモしておきます。残念ながら、環境変数は SSH セッションで転送されないため、これらの情報を保存するために簡単に使用することはできません。
クライアントから ULA サーバー インスタンスに curl コマンドを実行する
新しいルートを追加する前の動作を確認します。クライアント インスタンスから server-instance1 に対して curl コマンドを実行します。
Cloud Shell 内で、client-instance にログインします。
gcloud compute ssh client-instance \
--project=$projectname \
--zone=us-central1-a \
--tunnel-through-iap
クライアント インスタンス内で、server1 インスタンスの ULA IPV6 アドレスを使用して curl を実行します(コマンドは、curl が長時間待機しないように 5 秒の短いタイムアウトを設定します)。
curl -m 5.0 -g -6 'http://[ULA-ipv6-address-of-server1]:80/'
この curl コマンドは、クライアント VPC にサーバー VPC へのルートがまだないため、タイムアウトします。
この問題を解決してみましょう。ここでは SSH セッションを終了します。
クライアント VPC にカスタムルートを追加する
クライアント VPC に ULA プレフィックスへのルートがないためです。アドレスでクライアントサイド ILB を指すルートを作成して、追加しましょう。
注: IPv6 内部パススルー ロードバランサには /96 アドレスが割り当てられます。次のコマンドに渡す前に、アドレスから /96 マスクを削除する必要があります。(以下では bash のインプレース置換を使用しています)
Cloud Shell で、次の操作を行います。
gcloud compute routes create client-to-server-route \
--project=$projectname \
--destination-range=$server_subnet \
--network=client-vpc \
--next-hop-ilb=${fraddress_client//\/96}
クライアント インスタンスに SSH で戻ります。
gcloud compute ssh client-instance \
--project=$projectname \
--zone=us-central1-a \
--tunnel-through-iap
クライアント インスタンス内で、サーバー インスタンスへの curl をもう一度試します。(このコマンドは、curl が長時間待機しないように、5 秒の短いタイムアウトを設定します)。
curl -m 5.0 -g -6 'http://[ULA-ipv6-address-of-server1]:80/'
この curl コマンドは、サーバー VPC にゲートウェイ インスタンス経由でクライアント VPC に戻るルートがまだないため、引き続きタイムアウトします。
SSH セッションを終了して、Codelab を続行します。
サーバー VPC にカスタムルートを追加する
Cloud Shell で、次の操作を行います。
gcloud compute routes create server-to-client-route \
--project=$projectname \
--destination-range=$client_subnet \
--network=server-vpc \
--next-hop-ilb=${fraddress_server//\/96}
クライアント インスタンスに SSH で戻ります。
gcloud compute ssh client-instance \
--project=$projectname \
--zone=us-central1-a \
--tunnel-through-iap
クライアント インスタンス内で、サーバー インスタンスへの curl をもう一度試します。
curl -m 5.0 -g -6 'http://[ULA-ipv6-address-of-server1]:80/'
この curl コマンドは成功し、クライアント インスタンスから ULA サーバー インスタンスへのエンドツーエンドのネットワーク到達可能性が示されます。この接続は、ネクストホップとして next-hop-ilb を使用する IPv6 カスタムルートを使用する場合にのみ可能です。
出力例:
<user id>@client-instance:~$ curl -m 5.0 -g -6 'http://[fd20:3df:8d5c:0:0:0:0:0]:80/'
<!doctype html><html><body><h1>Hello World! From Server Instance!</h1></body></html>
SSH セッションを終了して、Codelab を続行します。
8. ロードバランサへのルートを作成してテストする(ロードバランサ名を使用)
また、next-hop-ilb は、IPv6 アドレスではなくロードバランサの名前を参照することもできます。このセクションでは、その手順と、クライアントとサーバー間の接続がまだ確立されていることをテストする手順について説明します。
以前のルートを削除する
インスタンス名を使用するカスタムルートを削除して、カスタムルートを追加する前の状態に環境を復元しましょう。
Cloud Shell で、次の操作を行います。
gcloud compute routes delete client-to-server-route --quiet --project=$projectname
gcloud compute routes delete server-to-client-route --quiet --project=$projectname
クライアントから ULA サーバー インスタンスに curl コマンドを実行する
以前のルートが正常に削除されたことを確認するには、クライアント インスタンスから server-instance1 に対して curl コマンドを実行します。
Cloud Shell 内で、client-instance にログインします。
gcloud compute ssh client-instance \
--project=$projectname \
--zone=us-central1-a \
--tunnel-through-iap
クライアント インスタンス内で、server1 インスタンスの ULA IPV6 アドレスを使用して curl を実行します(コマンドは、curl が長時間待機しないように 5 秒の短いタイムアウトを設定します)。
curl -m 5.0 -g -6 'http://[ULA-ipv6-address-of-server1]:80/'
この curl コマンドは、クライアント VPC にサーバー VPC へのルートがなくなったため、タイムアウトします。
クライアント VPC とサーバー VPC にカスタムルートを追加する
クライアントとサーバーの両方の VPC にカスタムルートを再度追加しますが、ILB のアドレスを使用する代わりに、コマンドで ILB の名前とリージョンを使用します。
Cloud Shell で、次の操作を行います。
gcloud compute routes create client-to-server-route \
--project=$projectname \
--destination-range=$server_subnet \
--network=client-vpc \
--next-hop-ilb=fr-ilb-clientvpc \
--next-hop-ilb-region=us-central1
gcloud compute routes create server-to-client-route \
--project=$projectname \
--destination-range=$client_subnet \
--network=server-vpc \
--next-hop-ilb=fr-ilb-servervpc \
--next-hop-ilb-region=us-central1
クライアント インスタンスに SSH で戻ります。
gcloud compute ssh client-instance \
--project=$projectname \
--zone=us-central1-a \
--tunnel-through-iap
クライアント インスタンス内で、サーバー インスタンスへの curl をもう一度試します。(このコマンドは、curl が長時間待機しないように、5 秒の短いタイムアウトを設定します)。
curl -m 5.0 -g -6 'http://[ULA-ipv6-address-of-server1]:80/'
この curl コマンドは成功し、クライアント インスタンスから ULA サーバー インスタンスへのエンドツーエンドのネットワーク到達可能性が示されます。
9. クリーンアップ
カスタムルートをクリーンアップする
Cloud Shell で、次の操作を行います。
gcloud compute routes delete client-to-server-route --quiet --project=$projectname
gcloud compute routes delete server-to-client-route --quiet --project=$projectname
LB コンポーネントをクリーンアップする
Cloud Shell で、次の操作を行います。
gcloud compute forwarding-rules delete fr-ilb-clientvpc --region us-central1 --quiet --project=$projectname
gcloud compute forwarding-rules delete fr-ilb-servervpc --region us-central1 --quiet --project=$projectname
gcloud compute backend-services delete bes-ilb-clientvpc --region us-central1 --quiet --project=$projectname
gcloud compute backend-services delete bes-ilb-servervpc --region us-central1 --quiet --project=$projectname
gcloud compute health-checks delete tcp-hc-22 --region us-central1 --quiet --project=$projectname
インスタンスとインスタンス テンプレートをクリーンアップする
Cloud Shell で、次の操作を行います。
gcloud compute instances delete client-instance --zone us-central1-a --quiet --project=$projectname
gcloud compute instances delete server-instance --zone us-central1-a --quiet --project=$projectname
gcloud compute instance-groups managed delete gateway-instance-group --zone us-central1-a --quiet --project=$projectname
gcloud compute instance-templates delete gateway-instance-template --region us-central1 --quiet --project=$projectname
サブネットをクリーンアップする
Cloud Shell で、次の操作を行います。
gcloud compute networks subnets delete client-subnet --region=us-central1 --quiet --project=$projectname
gcloud compute networks subnets delete server-subnet --region=us-central1 --quiet --project=$projectname
ファイアウォール ルールをクリーンアップする
Cloud Shell で、次の操作を行います。
gcloud compute firewall-rules delete allow-iap-client --quiet --project=$projectname
gcloud compute firewall-rules delete allow-iap-server --quiet --project=$projectname
gcloud compute firewall-rules delete allow-gateway-client --quiet --project=$projectname
gcloud compute firewall-rules delete allow-client-server --quiet --project=$projectname
VPC をクリーンアップする
Cloud Shell で、次の操作を行います。
gcloud compute networks delete client-vpc --quiet --project=$projectname
gcloud compute networks delete server-vpc --quiet --project=$projectname
10. 完了
ネクストホップが next-hop-ilb に設定された静的カスタム IPv6 ルートが正常に使用されました。また、これらのルートを使用してエンドツーエンドの IPv6 通信を検証しました。
次のステップ
以下の Codelab をご覧ください。
- IPv6 アドレスを使用してオンプレミス ホストから Google API にアクセスする
- IP アドレッシング オプション(IPv4 と IPv6)
- IPv6 静的ルートのネクストホップ インスタンス、ネクストホップ アドレス、ネクストホップ ゲートウェイを使用する