Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Inter-VPC NATで重複サブネットの壁を越える

By Chimbu ChinnaduraiSep 22, 20238 min read

このページはEnglishDeutschEspañolFrançaisItalianoPortuguêsでもご覧いただけます。

クラウドにおけるネットワーク管理は、アプリケーションやサービスを安定して稼働させるために欠かせない要素です。

Overcoming-Overlapping-Subnet-Challenges-with-Inter-VPC-NAT-in-GCP

Photo by Ar_TH from Shutterstock

はじめに

クラウドにおけるネットワーク管理は、アプリケーションやサービスを安定して稼働させるために欠かせない要素です。その基本のひとつが、クラウド環境内の各種リソースに対するIP(Internet Protocol)アドレスの割り当てです。IPアドレスはクラウドリソースを識別するデジタルな識別子として機能し、リソース同士やインターネットとの通信を可能にします。

オンプレミス環境であれ、Google Cloud Platform(GCP)のようなクラウドプラットフォームであれ、ネットワークを設計する際には「IPアドレス範囲が重複する(overlapping)」「重複しない(non-overlapping)」という考え方が登場します。

重複IPレンジとは、2つ以上のIPアドレス範囲が共通のIPアドレスを含み、互いに重なり合っている状態を指します。

非重複IPレンジとは、各アドレスが一意であり、他のレンジのアドレスと交差・重複しないIPアドレスの集合です。

GCPのVirtual Private Cloud(VPC)ネットワークは1つ以上のサブネットで構成され、各サブネットのIPアドレス範囲は他のVPCのものと重複する場合もあれば、重複しない場合もあります。重複するサブネット間ではデフォルトでプライベートネットワークアクセスが許可されないため、サブネットには非重複のIPレンジを使うことが重要です。

以前の記事では、Private Service Connect(PSC)を使って、重複するIPレンジを含むVPCネットワーク内のサービスにプライベートアクセスする方法を解説しました。

そして最近、GCPは重複ネットワーク間のプライベート通信を実現するPrivate NATをプレビュー版として公開しました。本記事では、重複・非重複のIPレンジを含む別々のVPCネットワークで稼働するサービスにプライベートアクセスするための、Inter-VPC NATの設定方法を解説します。

Inter-VPC NATとは

GCPでは、重複するネットワーク間でVPCピアリングを行うことができません。VPC間で特定のサブネットだけを共有する仕組みがないためです。Inter-VPC NATはPrivate NATゲートウェイの一種で、type=PRIVATEのNAT構成を用いることで、重複サブネット内のVPCネットワークリソースが、別のVPCを経由して非重複サブネット内のリソースと通信できるようにします。他のサブネットが重複していても通信が可能です。

Inter-VPC NATはNetwork Connectivity Centerと連携して動作します。Network Connectivity Centerは、ネットワーク接続を一元的かつシンプルに管理できるシステムで、Google Cloudのさまざまなネットワーキング機能を単一のインターフェースに統合し、クラウドとオンプレミスのネットワーク接続・管理を容易にすることを目的としています。

Network Connectivity Centerはハブアンドスポーク型のモデルを採用しています。ハブはVirtual Private Cloud(VPC)ネットワークへの接続を集約する中心的なポイントで、複数のスポークからの接続を束ねる仮想ルーターのようなものと考えるとわかりやすいでしょう。スポークにはVPN、Interconnect、サードパーティ製ルーター、他のVPCネットワークなどを指定できます。

VPCネットワーク間でInter-VPC NATを有効化するには、各VPCネットワークをNetwork Connectivity CenterハブのVPCスポークとして構成する必要があります。VPCスポークを使うと、VPCピアリングではできなかった、複数のVPCネットワークを接続して特定のIPv4サブネットルートを交換することが可能になります。これにより、対象となる全VPCネットワーク上のworkloads間で、相互に完全なIPv4接続が確立されます。

スポークを作成する際には、重複するIPアドレス範囲が他のVPCスポークに共有されないように設定してください。

制限事項

Inter-VPC NATには現在、プレビュー版として以下の主要な制限があります。

  • Inter-VPC NATはEndpoint-Independent Mappingに対応していません。
  • クロスプロジェクトに対応するInter-VPC NATはプレビューでは利用できません。
  • Inter-VPC NATのロギング機能はプレビューでは利用できません。
  • プレビュー版では、既存のPrivate NATゲートウェイを更新する際にgcloud CLIのみを使用してください。Google Cloudコンソールから既存のPrivate NATゲートウェイを更新すると、構成が正しく反映されない可能性があります。
  • Inter-VPC NATがサポートする接続はTCPとUDPのみです。
  • Inter-VPC NATが対応するネットワークアドレス変換(NAT)は、Network Connectivity CenterのVirtual Private Cloud(VPC)スポーク間のみです。VPC Network Peeringで接続されたVirtual Private Cloudネットワークは対象外です。
  • VPCネットワーク内の仮想マシン(VM)インスタンスは、ピア接続先ネットワークのうち非重複サブネットワークの宛先にしかアクセスできません。重複サブネットワーク内の宛先にはアクセスできません。

GCPはGAリリースまでにいくつかの制限を緩和する可能性があります。最新情報は公式ドキュメントをご確認ください。

リファレンスアーキテクチャ

本構成では、vpc-avpc-bに重複するIPアドレス範囲を持つサブネットがあります。vpc-bにはサンプルアプリケーションをホストする非重複サブネットも用意されています。

Private NATゲートウェイをvpc-aにデプロイし、重複サブネット内のインスタンスから非重複サブネット上のサンプルアプリケーションへ接続できるようにします。

"alttext"

Private NATフローの例

ネットワークの構築とサンプルアプリケーションのデプロイ

ステップ1: 必要な環境変数を設定します。

export PROJECT_ID="your-project-id" #ex: chimbu-playground
export VPC_A_SUBNET_REGION="us-east1"
export VPC_A_SUBNET_A_CIDR="192.168.1.0/24"
export VPC_B_SUBNET_REGION="us-west1"
export VPC_B_SUBNET_B_CIDR="192.168.2.0/24" #non-overlapping subnet between vpc-a and vpc-b
export VPC_B_SUBNET_C_CIDR="192.168.1.0/24" #overlapping subnet between vpc-a and vpc-b
export VPC_A_PRIVATE_NAT_GW_CIDR="10.1.2.0/29"

ステップ2: VPCネットワークとサブネットを作成します。

#Create vpc-a custom Network and subnet
gcloud beta compute networks create vpc-a \
--subnet-mode=custom
gcloud beta compute networks subnets create subnet-a \
--network="vpc-a" \
--role="ACTIVE" \
--purpose="PRIVATE" \
--range=$VPC_A_SUBNET_A_CIDR \
--region=$VPC_A_SUBNET_REGION
# Create vpc-b custom Network and subnets
gcloud beta compute networks create vpc-b \
--subnet-mode=custom
gcloud beta compute networks subnets create subnet-b \
--network="vpc-b" \
--role="ACTIVE" \
--purpose="PRIVATE" \
--range=$VPC_B_SUBNET_B_CIDR \
--region=$VPC_B_SUBNET_REGION
gcloud beta compute networks subnets create subnet-c \
--network="vpc-b" \
--role="ACTIVE" \
--purpose="PRIVATE" \
--range=$VPC_B_SUBNET_C_CIDR \
--region=$VPC_B_SUBNET_REGION

ステップ3: VMインスタンスへのSSHアクセスを許可するため、Identity-Aware Proxy(IAP)TCP転送用のファイアウォールルールを作成します。

このあとのステップでは外部IPを持たないVMインスタンスを作成します。IAP TCP転送を使うと、暗号化トンネル経由でSSH、RDPなどのトラフィックをVMインスタンスへ中継できます。

TCP転送および関連操作を行うには、ユーザーに roles/iap.tunnelResourceAccessorロールが付与されていることを確認してください。

gcloud compute firewall-rules create vpc-a-iap \
--direction=INGRESS \
--priority=1000 \
--network=vpc-a \
--action=ALLOW \
--rules=tcp:22 \
--source-ranges=35.235.240.0/20
gcloud compute firewall-rules create vpc-b-iap \
--direction=INGRESS \
--priority=1000 \
--network=vpc-b \
--action=ALLOW \
--rules=tcp:22 \
--source-ranges=35.235.240.0/20

ステップ4: インターネットアクセス用のCloud NATインスタンスを作成します。このCloud NATインスタンスではVPC間のプライベート通信は行えません。プライベート通信は別途設定します。

#vpc-a Cloud router and NAT
gcloud compute routers create vpc-a-internet-nat-router \
--network=vpc-a \
--region=$VPC_A_SUBNET_REGION
gcloud beta compute routers nats create vpc-a-internet-nat \
--router=vpc-a-internet-nat-router \
--nat-all-subnet-ip-ranges \
--region=$VPC_A_SUBNET_REGION \
--auto-allocate-nat-external-ips
#vpc-b Cloud router and NAT
gcloud compute routers create vpc-b-internet-nat-router \
--network=vpc-b \
--region=$VPC_B_SUBNET_REGION
gcloud beta compute routers nats create vpc-b-internet-nat \
--router=vpc-b-internet-nat-router \
--nat-all-subnet-ip-ranges \
--region=$VPC_B_SUBNET_REGION \
--auto-allocate-nat-external-ips

"Cloud

ステップ5: 外部IPを持たないテスト用Compute Engineインスタンスを作成します。

#Test instance in vpc-a network and subnet-a
gcloud compute instances create vpc-a-subnet-a-test \
--project=$PROJECT_ID \
--zone="us-east1-b" \
--machine-type=e2-medium \
--network-interface=stack-type=IPV4_ONLY,subnet=subnet-a,no-address \
--tags=http-server \
--create-disk=auto-delete=yes,boot=yes,device-name=vpc-a-subnet-a-test,image=projects/debian-cloud/global/images/debian-11-bullseye-v20230814,mode=rw,size=10,type=projects/$PROJECT_ID/zones/us-east1-b/diskTypes/pd-balanced
#Test instance in vpc-b network and subnet-b, Also deployed nginx service.Cloud NAT to download the required ngninx packages.
gcloud compute instances create vpc-b-subnet-b-test \
--project=$PROJECT_ID \
--zone="us-west1-a" \
--machine-type=e2-medium \
--network-interface=stack-type=IPV4_ONLY,subnet=subnet-b,no-address \
--metadata=startup-script=\#/bin/sh

"Compute

この時点では、サブネットが重複しているためネットワーク接続が確立されておらず、VPCピアリングも作成できません。そのため、vpc-a内のvpc-a-subnet-a-testインスタンスからvpc-b-subnet-b-testインスタンスで稼働するサービスへはアクセスできません。

Network Connectivity CenterでのHubとVPC Spokesのセットアップ

サブネットIPレンジが重複する2つのVPCネットワーク間で通信を可能にするには、両方のVPCネットワークを同じNetwork Connectivity CenterハブのVPCスポークとして構成する必要があります。

ステップ6: Network Connectivity Centerハブを作成します。

gcloud network-connectivity hubs create private-nat-demo-vpc-hub

"PC

ステップ7: VPCネットワークをスポークとしてハブに追加します。重複するネットワークがエクスポート対象から除外されていることを確認してください。

#Add vpc-a to the hub and exclue VPC_A_SUBNET_A_CIDR from export.
gcloud network-connectivity spokes linked-vpc-network create vpc-a \
--hub="https://www.googleapis.com/networkconnectivity/v1/projects/$PROJECT_ID/locations/global/hubs/private-nat-demo-vpc-hub" --global \
--vpc-network="https://www.googleapis.com/compute/v1/projects/$PROJECT_ID/global/networks/vpc-a" \
--exclude-export-ranges=$VPC_A_SUBNET_A_CIDR
#Add vpc-b to the hub and exclue VPC_B_SUBNET_C_CIDR from export.VPC_B_SUBNET_B_CIDR will be exported between the VPCs.
gcloud network-connectivity spokes linked-vpc-network create vpc-b \
--hub="https://www.googleapis.com/networkconnectivity/v1/projects/$PROJECT_ID/locations/global/hubs/private-nat-demo-vpc-hub" --global \
--vpc-network="https://www.googleapis.com/compute/v1/projects/$PROJECT_ID/global/networks/vpc-b" \
--exclude-export-ranges=$VPC_B_SUBNET_C_CIDR

"VPC

VPCスポーク

"Exchanged

VPC間で交換されたルート

Inter-VPC NATのセットアップ

Inter-VPC NATには、purposeがPRIVATE_NATの専用サブネットが必要です。Private NATゲートウェイは、このサブネットのIPアドレス範囲を使ってNATを実行します。このサブネットは、同じNetwork Connectivity Centerハブに接続された他のVPCスポーク内の既存サブネットと重複してはいけません。また、Private NAT専用に使用されます。

ステップ8: Private NAT用のサブネットを作成します。vpc-bで稼働するサービスへアクセスする必要があるため、vpc-aに作成します。Private NATは送信(アウトバウンド)リクエストに対してのみNATを行います。

gcloud beta compute networks subnets create private-nat-gateway \
--network=vpc-a \
--region=$VPC_A_SUBNET_REGION \
--range=$VPC_A_PRIVATE_NAT_GW_CIDR \
--purpose=PRIVATE_NAT

"Create

ステップ9: Cloud RouterとPrivate NATゲートウェイを作成します。

gcloud compute routers create vpc-a-private-nat-gw-router \
--network="vpc-a" \
--region=$VPC_A_SUBNET_REGION
gcloud beta compute routers nats create vpc-a-private-nat-gw \
--router=vpc-a-private-nat-gw-router \
--type=PRIVATE \
--nat-all-subnet-ip-ranges \
--region=$VPC_A_SUBNET_REGION

ステップ10: Private NATゲートウェイにNATルールを作成し、ソース側VPCスポークから、同じNetwork Connectivity Centerハブに接続されたピアVPCスポークへ送信されるトラフィックに対してNATを実行します。Private NATゲートウェイはこのNATルールに基づき、Private NATサブネットからNAT用IPアドレスを割り当ててトラフィックを変換します。

gcloud beta compute routers nats rules create 1000 \
--router=vpc-a-private-nat-gw-router \
--nat=vpc-a-private-nat-gw \
--match='nexthop.hub == "//networkconnectivity.googleapis.com/projects/chimbuc-playground/locations/global/hubs/private-nat-demo-vpc-hub"' \
--source-nat-active-ranges=private-nat-gateway \
--region=$VPC_A_SUBNET_REGION

"Private

ステップ11: vpc-bにファイアウォールルールを作成し、Private NATゲートウェイからの接続を許可します。

gcloud compute firewall-rules create vpc-b-allow-ingress-private-nat-gw \
--direction=INGRESS \
--priority=1000 \
--network=vpc-b \
--action=ALLOW \
--rules=tcp \
--source-ranges=$VPC_A_PRIVATE_NAT_GW_CIDR

ステップ12: vpc-avpc-bネットワーク間の接続性を確認します。

"non-overlapping

このスクリーンショットから、vpc-aのインスタンスがInter-VPC NAT経由でvpc-bの非重複サブネットで稼働するサービスにアクセスできていることが確認できます。

Inter-VPC NATは、重複ネットワーク間のプライベート通信をシンプルに実現できる強力なツールです。Inter-VPC NATを使えば、あるリソースが他のサブネットと重複するサブネットに置かれていても、別VPC内の非重複サブネット上のリソースとプライベートに通信させることができます。

重複サブネット間のプライベート通信を実現するにはPrivate Service Connectもぜひご活用ください。本記事がお役に立てば幸いです。ご質問があればお気軽にお問い合わせください。

\n'sudo\ \
apt\ update

"Compute

この時点では、サブネットが重複しているためネットワーク接続が確立されておらず、VPCピアリングも作成できません。そのため、vpc-a内のvpc-a-subnet-a-testインスタンスからvpc-b-subnet-b-testインスタンスで稼働するサービスへはアクセスできません。

Network Connectivity CenterでのHubとVPC Spokesのセットアップ

サブネットIPレンジが重複する2つのVPCネットワーク間で通信を可能にするには、両方のVPCネットワークを同じNetwork Connectivity CenterハブのVPCスポークとして構成する必要があります。

ステップ6: Network Connectivity Centerハブを作成します。

"PC

ステップ7: VPCネットワークをスポークとしてハブに追加します。重複するネットワークがエクスポート対象から除外されていることを確認してください。

"VPC

VPCスポーク

"Exchanged

VPC間で交換されたルート

Inter-VPC NATのセットアップ

Inter-VPC NATには、purposeがPRIVATE_NATの専用サブネットが必要です。Private NATゲートウェイは、このサブネットのIPアドレス範囲を使ってNATを実行します。このサブネットは、同じNetwork Connectivity Centerハブに接続された他のVPCスポーク内の既存サブネットと重複してはいけません。また、Private NAT専用に使用されます。

ステップ8: Private NAT用のサブネットを作成します。vpc-bで稼働するサービスへアクセスする必要があるため、vpc-aに作成します。Private NATは送信(アウトバウンド)リクエストに対してのみNATを行います。

"Create

ステップ9: Cloud RouterとPrivate NATゲートウェイを作成します。

ステップ10: Private NATゲートウェイにNATルールを作成し、ソース側VPCスポークから、同じNetwork Connectivity Centerハブに接続されたピアVPCスポークへ送信されるトラフィックに対してNATを実行します。Private NATゲートウェイはこのNATルールに基づき、Private NATサブネットからNAT用IPアドレスを割り当ててトラフィックを変換します。

"Private

ステップ11: vpc-bにファイアウォールルールを作成し、Private NATゲートウェイからの接続を許可します。

ステップ12: vpc-avpc-bネットワーク間の接続性を確認します。

"non-overlapping

このスクリーンショットから、vpc-aのインスタンスがInter-VPC NAT経由でvpc-bの非重複サブネットで稼働するサービスにアクセスできていることが確認できます。

Inter-VPC NATは、重複ネットワーク間のプライベート通信をシンプルに実現できる強力なツールです。Inter-VPC NATを使えば、あるリソースが他のサブネットと重複するサブネットに置かれていても、別VPC内の非重複サブネット上のリソースとプライベートに通信させることができます。

重複サブネット間のプライベート通信を実現するにはPrivate Service Connectもぜひご活用ください。本記事がお役に立てば幸いです。ご質問があればお気軽にお問い合わせください。

\n'sudo\ apt\ install\ nginx\ -y\ \
--tags=http-server \
--create-disk=auto-delete=yes,boot=yes,device-name=vpc-b-subnet-b-test,image=projects/debian-cloud/global/images/debian-11-bullseye-v20230814,mode=rw,size=10,type=projects/$PROJECT_ID/zones/us-west1-a/diskTypes/pd-balanced
#Test instance deployed in vpc-b network and subnet-c
gcloud compute instances create vpc-b-subnet-c-test \
--project=$PROJECT_ID \
--zone="us-west1-a" \
--machine-type=e2-medium \
--network-interface=stack-type=IPV4_ONLY,subnet=subnet-c,no-address \
--tags=http-server \
--create-disk=auto-delete=yes,boot=yes,device-name=vpc-b-subnet-c-test,image=projects/debian-cloud/global/images/debian-11-bullseye-v20230814,mode=rw,size=10,type=projects/$PROJECT_ID/zones/us-west1-a/diskTypes/pd-balanced

"Compute

この時点では、サブネットが重複しているためネットワーク接続が確立されておらず、VPCピアリングも作成できません。そのため、vpc-a内のvpc-a-subnet-a-testインスタンスからvpc-b-subnet-b-testインスタンスで稼働するサービスへはアクセスできません。

Network Connectivity CenterでのHubとVPC Spokesのセットアップ

サブネットIPレンジが重複する2つのVPCネットワーク間で通信を可能にするには、両方のVPCネットワークを同じNetwork Connectivity CenterハブのVPCスポークとして構成する必要があります。

ステップ6: Network Connectivity Centerハブを作成します。

"PC

ステップ7: VPCネットワークをスポークとしてハブに追加します。重複するネットワークがエクスポート対象から除外されていることを確認してください。

"VPC

VPCスポーク

"Exchanged

VPC間で交換されたルート

Inter-VPC NATのセットアップ

Inter-VPC NATには、purposeがPRIVATE_NATの専用サブネットが必要です。Private NATゲートウェイは、このサブネットのIPアドレス範囲を使ってNATを実行します。このサブネットは、同じNetwork Connectivity Centerハブに接続された他のVPCスポーク内の既存サブネットと重複してはいけません。また、Private NAT専用に使用されます。

ステップ8: Private NAT用のサブネットを作成します。vpc-bで稼働するサービスへアクセスする必要があるため、vpc-aに作成します。Private NATは送信(アウトバウンド)リクエストに対してのみNATを行います。

"Create

ステップ9: Cloud RouterとPrivate NATゲートウェイを作成します。

ステップ10: Private NATゲートウェイにNATルールを作成し、ソース側VPCスポークから、同じNetwork Connectivity Centerハブに接続されたピアVPCスポークへ送信されるトラフィックに対してNATを実行します。Private NATゲートウェイはこのNATルールに基づき、Private NATサブネットからNAT用IPアドレスを割り当ててトラフィックを変換します。

"Private

ステップ11: vpc-bにファイアウォールルールを作成し、Private NATゲートウェイからの接続を許可します。

ステップ12: vpc-avpc-bネットワーク間の接続性を確認します。

"non-overlapping

このスクリーンショットから、vpc-aのインスタンスがInter-VPC NAT経由でvpc-bの非重複サブネットで稼働するサービスにアクセスできていることが確認できます。

Inter-VPC NATは、重複ネットワーク間のプライベート通信をシンプルに実現できる強力なツールです。Inter-VPC NATを使えば、あるリソースが他のサブネットと重複するサブネットに置かれていても、別VPC内の非重複サブネット上のリソースとプライベートに通信させることができます。

重複サブネット間のプライベート通信を実現するにはPrivate Service Connectもぜひご活用ください。本記事がお役に立てば幸いです。ご質問があればお気軽にお問い合わせください。