1. はじめに
静的カスタムルートは、VPC のデフォルトのルーティング動作に影響します。IPv6 カスタムルートで、新しいネクストホップ属性(next-hop-gateway、next-hop-instance、next-hop-address)がサポートされるようになりました。この Codelab では、マルチ NIC VM インスタンスで接続された 2 つの VPC を使用して、これらの新しいネクストホップ オプションで IPv6 カスタムルートを使用する方法について説明します。また、ULA アドレスと GUA アドレスを混在させ、新しいカスタムルート機能を使用して ULA VPC から公共のインターネットへの到達可能性を提供する方法も説明します。
学習内容
- next-hop-instance ネクストホップを使用して IPv6 カスタムルートを作成する方法。
- ネクストホップ ゲートウェイのネクストホップを使用して IPv6 カスタムルートを作成する方法。
- next-hop-address ネクストホップを使用して IPv6 カスタムルートを作成する方法。
必要なもの
- Google Cloud プロジェクト
2. 始める前に
コードラボをサポートするようにプロジェクトを更新する
この Codelab では、$variables を使用して、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)")
ラボの全体的なアーキテクチャ

両方のタイプのカスタムルート ネクストホップを示すために、GUA アドレス指定を使用するクライアント VPC、ULA アドレス指定を使用するサーバー VPC、GUA アドレス指定を使用する 2 番目のサーバー VPC の 3 つの VPC を作成します。
クライアント VPC が ULA サーバーにアクセスするには、マルチ NIC ゲートウェイ インスタンスを指す next-hop-instance と next-hop-address の両方を使用するカスタムルートを利用します。(デフォルトの ::/0 ルートを削除した後)GUA サーバーへのアクセスを提供するには、ネクストホップ ゲートウェイがデフォルトのインターネット ゲートウェイを指すカスタムルートを使用して、インターネット経由のルーティングを提供します。
3. クライアント VPC の設定
クライアント VPC を作成する
Cloud Shell で、次の操作を行います。
gcloud compute networks create client-vpc \
--project=$projectname \
--subnet-mode=custom \
--mtu=1500 --bgp-routing-mode=regional
クライアント サブネットを作成する
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=external \
--region=us-central1
次のコマンドを使用して、割り当てられた GUA サブネットを環境変数に記録します。
export client_subnet=$(gcloud compute networks subnets \
describe client-subnet \
--project $projectname \
--format="value(externalIpv6Prefix)" \
--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. ULA サーバー VPC の設定
ULA サーバー VPC を作成する
Cloud Shell で、次の操作を行います。
gcloud compute networks create server-vpc1 \
--project=$projectname \
--subnet-mode=custom --mtu=1500 \
--bgp-routing-mode=regional \
--enable-ula-internal-ipv6
ULA サーバー サブネットを作成する
Cloud Shell で、次の操作を行います。
gcloud compute networks subnets create server-subnet1 \
--network=server-vpc1 \
--project=$projectname \
--range=192.168.0.0/24 \
--stack-type=IPV4_IPV6 \
--ipv6-access-type=internal \
--region=us-central1
次のコマンドを使用して、割り当てられた ULA サブネットを環境変数に記録します。
export server_subnet1=$(gcloud compute networks subnets \
describe server-subnet1 \
--project $projectname \
--format="value(internalIpv6Prefix)" \
--region us-central1)
ULA 内部 IPV6 アドレスを使用してサーバー VM を起動する
Cloud Shell で、次の操作を行います。
gcloud compute instances create server-instance1 \
--subnet server-subnet1 \
--stack-type IPV4_IPV6 \
--zone us-central1-a \
--project=$projectname
クライアントからサーバーへのアクセスを許可するファイアウォール ルールを追加する
Cloud Shell で、次の操作を行います。
gcloud compute firewall-rules create allow-client-server1 \
--direction=INGRESS --priority=1000 \
--network=server-vpc1 --action=ALLOW \
--rules=tcp --source-ranges=$client_subnet \
--project=$projectname
IAP を許可するファイアウォール ルールを追加する
Cloud Shell で、次の操作を行います。
gcloud compute firewall-rules create allow-iap-server1 \
--direction=INGRESS --priority=1000 \
--network=server-vpc1 --action=ALLOW \
--rules=tcp:22 \
--source-ranges=35.235.240.0/20 \
--project=$projectname
ULA サーバー インスタンスに Apache をインストールする
Cloud Shell 内で、client-instance にログインします。
gcloud compute ssh server-instance1 \
--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 Server1!</h1></body></html>' | sudo tee /var/www/html/index.html
SSH セッションを終了して、Codelab を続行します。
5. GUA サーバー VPC の設定
GUA サーバー VPC を作成する
Cloud Shell で、次の操作を行います。
gcloud compute networks create server-vpc2 \
--project=$projectname \
--subnet-mode=custom --mtu=1500 \
--bgp-routing-mode=regional
GUA サーバー サブネットを作成する
Cloud Shell で、次の操作を行います。
gcloud compute networks subnets create server-subnet2 \
--network=server-vpc2 \
--project=$projectname \
--range=192.168.0.0/24 \
--stack-type=IPV4_IPV6 \
--ipv6-access-type=external \
--region=us-central1
次のコマンドを使用して、割り当てられた GUA サブネットを環境変数に記録します。
export server_subnet2=$(gcloud compute networks subnets \
describe server-subnet2 \
--project $projectname \
--format="value(externalIpv6Prefix)" \
--region us-central1)
GUA IPV6 アドレスを使用してサーバー VM を起動する
Cloud Shell で、次の操作を行います。
gcloud compute instances create server-instance2 \
--subnet server-subnet2 \
--stack-type IPV4_IPV6 \
--zone us-central1-a \
--project=$projectname
サブネット内のアクセスを許可するファイアウォール ルールを追加する
Cloud Shell で、次の操作を行います。
gcloud compute firewall-rules create allow-client-server2 \
--direction=INGRESS \
--priority=1000 \
--network=server-vpc2 \
--action=ALLOW \
--rules=tcp --source-ranges=$client_subnet \
--project=$projectname
IAP を許可するファイアウォール ルールを追加する
Cloud Shell で、次の操作を行います。
gcloud compute firewall-rules create allow-iap-server2 \
--direction=INGRESS \
--priority=1000 \
--network=server-vpc2 \
--action=ALLOW \
--rules=tcp:22 \
--source-ranges=35.235.240.0/20 \
--project=$projectname
GUA サーバー インスタンスへの SSH アクセスを確認し、Apache をインストールする
Cloud Shell 内で、client-instance にログインします。
gcloud compute ssh server-instance2 \
--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 Server2!</h1></body></html>' | sudo tee /var/www/html/index.html
SSH セッションを終了して、Codelab を続行します。
6. ゲートウェイ インスタンスを作成する
クライアント VPC のデフォルト ルートを削除する
ULA v6 トラフィックをマルチ NIC インスタンスにリダイレクトし、インターネット下り(外向き)ルーティングを無効にする準備。デフォルトのインターネット ゲートウェイを指すデフォルトの ::/0 ルートを削除します。
Cloud Shell で、次の操作を行います。
export client_defroutename=$(gcloud compute routes list \
--project $projectname \
--format='value(name)' \
--filter="network:client-vpc AND destRange~'::/0'")
gcloud compute routes delete $client_defroutename \
--project $projectname \
--quiet
ゲートウェイ マルチ NIC VM を起動する
Cloud Shell で次の操作を行います。Cloud Shell で次の操作を行います。
gcloud compute instances create gateway-instance \
--project=$projectname \
--zone=us-central1-a \
--network-interface=stack-type=IPV4_IPV6,subnet=client-subnet,no-address \
--network-interface=stack-type=IPV4_IPV6,subnet=server-subnet1,no-address \
--can-ip-forward
ゲートウェイ インスタンスを構成する
Cloud Shell 内で、ゲートウェイ インスタンスにログインします(インスタンスの起動中に SSH が正常に完了するまでに数分かかることがあります)。
gcloud compute ssh gateway-instance \
--project=$projectname \
--zone=us-central1-a \
--tunnel-through-iap
ゲートウェイ VM シェル内で次のコマンドを実行して、IPv6 転送を有効にし、転送が有効な RA を引き続き受け入れます(accept_ra = 2)。
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
インスタンスの 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 を続行します。
7. ゲートウェイ インスタンスへのルートを作成してテストする(インスタンス名を使用)
このセクションでは、ゲートウェイ インスタンス名をネクストホップとして使用して、クライアント VPC とサーバー VPC の両方にルートを追加します。
サーバー アドレスをメモする
Cloud Shell で、次の操作を行います。
gcloud compute instances list \
--project $projectname \
--filter="name~server-instance" \
--format='value[separator=","](name,networkInterfaces[0].ipv6Address,networkInterfaces[0].ipv6AccessConfigs[0].externalIpv6)'
これにより、サーバー インスタンス名とその IPv6 プレフィックスの両方が出力されます。出力例
server-instance1,fd20:3df:8d5c:0:0:0:0:0,
server-instance2,,2600:1900:4000:71fd: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 プレフィックスへのルートがないためです。それでは、今すぐ追加しましょう。
Cloud Shell で、次の操作を行います。
gcloud compute routes create client-to-server1-route \
--project=$projectname \
--destination-range=$server_subnet1 \
--network=client-vpc \
--next-hop-instance=gateway-instance \
--next-hop-instance-zone=us-central1-a
クライアント インスタンスに 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 コマンドは、server1 VPC にゲートウェイ インスタンス経由でクライアント VPC に戻るルートがまだないため、タイムアウトします。
SSH セッションを終了して、Codelab を続行します。
ULA Server VPC にカスタムルートを追加する
Cloud Shell で、次の操作を行います。
gcloud compute routes create server1-to-client-route \
--project=$projectname \
--destination-range=$client_subnet \
--network=server-vpc1 \
--next-hop-instance=gateway-instance \
--next-hop-instance-zone=us-central1-a
クライアント インスタンスに 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 サーバー インスタンスへのエンドツーエンドの到達可能性が示されます。この接続は、ネクストホップとしてネクストホップ インスタンスを使用する 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 Server1!</h1></body></html>
SSH セッションを終了して、Codelab を続行します。
8. ゲートウェイ インスタンスへのルートを作成してテストする(インスタンスのアドレスを使用)
このセクションでは、ゲートウェイ インスタンスの IPv6 アドレスをネクストホップとして使用して、クライアント VPC とサーバー VPC の両方にルートを追加します。
以前のルートを削除する
インスタンス名を使用するカスタムルートを削除して、カスタムルートを追加する前の状態に環境を復元しましょう。
Cloud Shell で、次の操作を行います。
gcloud compute routes delete client-to-server1-route --quiet --project=$projectname
gcloud compute routes delete server1-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 へのルートがなくなったため、タイムアウトします。
ゲートウェイ インスタンスの IPv6 アドレスを取得する
ネクストホップ アドレスを使用するルートを記述するには、ゲートウェイ インスタンスの IPv6 アドレスを取得する必要があります。
Cloud Shell で、次の操作を行います。
export gateway_ula_address=$(gcloud compute instances \
describe gateway-instance \
--project $projectname \
--format='value(networkInterfaces[1].ipv6Address)')
export gateway_gua_address=$(gcloud compute instances \
describe gateway-instance \
--project $projectname \
--format='value(networkInterfaces[0].ipv6AccessConfigs[0].externalIpv6)')
クライアント VPC にカスタムルートを追加する
これで、クライアント VPC に ULA プレフィックスのルートを再度追加できますが、ネクストホップとしてゲートウェイ GUA アドレスを使用します。
Cloud Shell で、次の操作を行います。
gcloud compute routes create client-to-server1-route \
--project=$projectname \
--destination-range=$server_subnet1 \
--network=client-vpc \
--next-hop-address=$gateway_gua_address
クライアント インスタンスに 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 コマンドは引き続きタイムアウトします。これは、server1 VPC にゲートウェイ インスタンス経由でクライアント VPC に戻るルートがまだないためです。
SSH セッションを終了して、Codelab を続行します。
ULA Server VPC にカスタムルートを追加する
Cloud Shell で、次の操作を行います。
gcloud compute routes create server1-to-client-route \
--project=$projectname \
--destination-range=$client_subnet \
--network=server-vpc1 \
--next-hop-address=$gateway_ula_address
クライアント インスタンスに 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 サーバー インスタンスへのエンドツーエンドの到達可能性が示されます。この接続は、ネクストホップとしてネクストホップ アドレスを使用する 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 Server1!</h1></body></html>
SSH セッションを終了して、Codelab を続行します。
9. インターネット ゲートウェイへのルートを作成してテストする
このラボのセットアップが完了したら、新しいネクストホップ プロパティ(next-hop-gateway)の機能もテストしましょう。
クライアントから GUA サーバー インスタンスに curl コマンドを実行する
新しいルートを追加する前の動作を確認します。クライアント インスタンスから server2 の IP アドレスに対して curl コマンドを実行します。
Cloud Shell 内で、クライアント インスタンスにログインします。
gcloud compute ssh client-instance \
--project=$projectname \
--zone=us-central1-a \
--tunnel-through-iap
クライアント インスタンス内で、IPv6 エンドポイントに対して curl を実行します。
curl -m 5.0 -g -6 'http://[GUA-ipv6-address-of-server2]:80/'
この curl コマンドはタイムアウトします。これは、クライアント VPC に独自のサブネット ルートと server1 の VPC へのルートしかないためです。server2 VPC の GUA 範囲に到達できるようにするには、カスタムルートを介してデフォルトのインターネット ゲートウェイを使用する必要があります。
SSH セッションを終了して、Codelab を続行します。
クライアント VPC にカスタム ゲートウェイ ルートを追加する
Cloud Shell で、次の操作を行います。
gcloud compute routes create client-to-server2-route \
--project=$projectname \
--destination-range=$server_subnet2 \
--network=client-vpc \
--next-hop-gateway=default-internet-gateway
クライアント インスタンスに SSH で戻ります。
gcloud compute ssh client-instance \
--project=$projectname \
--zone=us-central1-a \
--tunnel-through-iap
クライアント インスタンス内で、同じ curl を繰り返します。
curl -m 5.0 -g -6 'http://[GUA-ipv6-address-of-server2]:80/'
これで、curl コマンドが成功し、カスタムの hello メッセージが返されるはずです。これは、デフォルトのインターネット ゲートウェイを介して他のサーバーの IPv6 アドレスに正常に到達できたことを示しています。
出力例:
<user id>@client-instance:~$ curl -m 5.0 -g -6 'http://[2600:1900:4000:71fd:0:0:0:0]:80/'
<!doctype html><html><body><h1>Hello World! From Server2!</h1></body></html>
SSH セッションを終了して、ラボのクリーンアップ セクションに進みます。
10. クリーンアップ
インスタンスをクリーンアップする
Cloud Shell で、次の操作を行います。
gcloud compute instances delete client-instance --zone us-central1-a --quiet --project=$projectname
gcloud compute instances delete server-instance1 --zone us-central1-a --quiet --project=$projectname
gcloud compute instances delete server-instance2 --zone us-central1-a --quiet --project=$projectname
gcloud compute instances delete gateway-instance --zone us-central1-a --quiet --project=$projectname
サブネットをクリーンアップする
Cloud Shell で、次の操作を行います。
gcloud compute networks subnets delete client-subnet --region=us-central1 --quiet --project=$projectname
gcloud compute networks subnets delete server-subnet1 --region=us-central1 --quiet --project=$projectname
gcloud compute networks subnets delete server-subnet2 --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-server1 --quiet --project=$projectname
gcloud compute firewall-rules delete allow-iap-server2 --quiet --project=$projectname
gcloud compute firewall-rules delete allow-gateway-client --quiet --project=$projectname
gcloud compute firewall-rules delete allow-client-server1 --quiet --project=$projectname
gcloud compute firewall-rules delete allow-client-server2 --quiet --project=$projectname
カスタムルートをクリーンアップする
Cloud Shell で、次の操作を行います。
gcloud compute routes delete client-to-server1-route --quiet --project=$projectname
gcloud compute routes delete client-to-server2-route --quiet --project=$projectname
gcloud compute routes delete server1-to-client-route --quiet --project=$projectname
VPC をクリーンアップする
Cloud Shell で、次の操作を行います。
gcloud compute networks delete client-vpc --quiet --project=$projectname
gcloud compute networks delete server-vpc1 --quiet --project=$projectname
gcloud compute networks delete server-vpc2 --quiet --project=$projectname
11. 完了
ネクストホップが next-hop-gateway、next-hop-instance、next-hop-address に設定された静的カスタム IPv6 ルートが正常に使用されました。また、これらのルートを使用してエンドツーエンドの IPv6 通信を検証しました。
次のステップ
以下の Codelab をご覧ください。