1. はじめに
静的カスタムルートは、VPC のデフォルトのルーティング動作に影響します。IPv6 カスタムルートが、新しいネクストホップ属性(next-hop-gateway、next-hop-instance、next-hop-address)をサポートするようになりました。この Codelab では、マルチ NIC VM インスタンスで接続された 2 つの VPC を使用して、これらの新しいネクストホップ オプションで IPv6 カスタムルートを使用する方法について説明します。また、ULA と GUA のアドレスを組み合わせて、新しいカスタムルート機能を使用して ULA VPC からパブリック インターネットへの到達可能性を提供する方法についても説明します。
学習内容
- ネクストホップ インスタンスのネクストホップを使用して IPv6 カスタムルートを作成する方法。
- ネクストホップ ゲートウェイのネクストホップを使用して IPv6 カスタムルートを作成する方法。
- ネクストホップ アドレスのネクストホップを使用して IPv6 カスタムルートを作成する方法。
必要なもの
- Google Cloud プロジェクト
2. 始める前に
Codelab をサポートするようにプロジェクトを更新する
この 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 サーバーにアクセスできるようにするには、デフォルト インターネット ゲートウェイを指す next-hop-gateway を持つカスタムルートを使用して、インターネット経由のルーティングを提供します。
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 で、クライアント インスタンスにログインします。
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 で、クライアント インスタンスにログインします。
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 で、クライアント インスタンスにログインします。
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. Gateway インスタンスを作成する
クライアント 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 で次の操作を行います。
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 で、クライアント インスタンスにログインします。
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/'
クライアント VPC にサーバー VPC へのルートがまだないため、この curl コマンドはタイムアウトします。
では、この問題を解決しましょう。現時点では 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/'
server1 VPC に、ゲートウェイ インスタンスを経由してクライアント VPC に戻るルートがまだないため、この curl コマンドでもタイムアウトします。
SSH セッションを終了して、Codelab を続行します。
ULA サーバー 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 サーバー インスタンスへのエンドツーエンドの到達性が示されます。この接続は、next-hop-instance をネクストホップとして使用する 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 で、クライアント インスタンスにログインします。
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/'
クライアント VPC にサーバー VPC へのルートがないため、この curl コマンドはタイムアウトします。
ゲートウェイ インスタンスの IPv6 アドレスを取得する
next-hop-address を使用するルートを記述する前に、ゲートウェイ インスタンスの 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 サーバー 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 サーバー インスタンスへのエンドツーエンドの到達性が示されます。この接続は、ネクストホップとして next-hop-address を使用する 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/'
クライアント VPC には、独自のサブネット ルートと server1 の VPC へのルートのみが存在するため、この curl コマンドはタイムアウトします。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 コマンドを実行すると、デフォルトのインターネット ゲートウェイを介して他のサーバーの IPv6 アドレスに正常に到達できたことを示すカスタム hello メッセージが返されます。
出力例:
<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 をご覧ください。