Google Cloud ハンズオン教科書|2026-08 版
第 3 章 試験ガイド 1.3 試験ガイド 2.1

VPC ネットワーキングの基礎

サブネット・ファイアウォール・経路。クラウドネイティブなネットワークを組み立てる

この章で学ぶこと

試験ガイド対応: セクション 1.3(ネットワーク、ストレージ、コンピューティング リソースの設計)、2.1(ネットワーク トポロジの構成)

第 2 章で「誰が何をできるか」を設計しました。この章では「どこからどこへ通信できるか」を設計します。Google Cloud のネットワークはオンプレミスの常識と少し違う形をしており、その違い — VPC がグローバルであること — こそが設計の武器になります。まず構造を頭に入れ、後半のハンズオンで実際にネットワークを組み立てて壊します。

VPC ネットワークとサブネット — グローバル × リージョナルの二層構造

VPC(Virtual Private Cloud)ネットワークは、プロジェクト内に作る仮想ネットワークです。最重要の事実はスコープの二層構造です。

代表的な他クラウドでは VPC 相当のネットワークをリージョンごとに作る設計が一般的なので、ここは発想の切り替えが必要です。Google Cloud では 1 つの VPC が世界中のリージョンをまたぎ、東京の VM とアイオワの VM が同じネットワークの内部 IP で直接通信できます。リージョン間 VPN もピアリングも不要です。

プロジェクト pca-handson VPC ネットワーク handson-vpc(グローバル) リージョン asia-northeast1 サブネット subnet-tokyo 10.0.1.0/24 VM 1 10.0.1.2 VM 2 10.0.1.3 リージョン us-central1 サブネット subnet-us 10.0.2.0/24 VM 3 10.0.2.2 内部 IP で直接通信(VPC 内で完結)
図 3-1 VPC ネットワークはグローバル、サブネットはリージョナル。離れたリージョンの VM 同士も同じ VPC 内なら内部 IP で直接通信でき、トラフィックはインターネットに出ない。

auto モードと custom モード

VPC ネットワークにはサブネットの作られ方が異なる 2 つのモードがあります。新規プロジェクトに最初から存在する default ネットワークは、IPv4 ファイアウォールルールが事前設定された auto モード VPC です。

観点auto モードcustom モード
サブネット全リージョンに 1 つずつ自動作成。10.128.0.0/9 の中から各リージョンに /20 が割り当て済み(例: asia-northeast1 は 10.146.0.0/20)自分で作ったものだけが存在する
新リージョン追加時サブネットが自動で増える影響なし
IP 範囲の設計固定(どのプロジェクトでも同じ範囲)自由に設計できる
モード変換custom への一方向変換のみ可能auto へは戻せない
向く場面検証・学習の足場本番。IP 設計とハイブリッド接続の前提

auto モードの範囲はどのプロジェクトでも同一なので、将来 VPC 同士をつないだり(第 12 章)オンプレミスと接続したりすると IP 範囲の重複が起きやすくなります。変換は --switch-to-custom-subnet-mode による一方通行で、custom から auto には戻せません。本番ネットワークは最初から custom モードで設計するのが定石です。

IP アドレス設計 — プライマリ範囲・セカンダリ範囲・予約アドレス

サブネットは必須のプライマリ IPv4 範囲と、任意のセカンダリ IPv4 範囲を持ちます。設計時に押さえるルールは次のとおりです。

なお VPC ネットワークには MTU 設定があり、既定は 1460 バイト(1300〜8896 の範囲で指定可能)です。ここを変えるのはハイブリッド接続や高性能通信の設計時なので、いまは既定のままで構いません。

ファイアウォールルール — 暗黙の拒否から設計する

VPC ファイアウォールルールは VPC ネットワークに属するグローバルリソースで、VM 単位ではなくネットワーク単位で通信を制御します。特性は次の 4 点です。

パケット (着信 / 発信) ルール評価 優先度の昇順(0 が最優先) 最初に一致した時点で確定 一致したルールを適用 allow なら通し deny なら破棄 暗黙のアクション ingress: 拒否 egress: 許可 上書きは明示ルールで 評価 一致 一致なし
図 3-2 ファイアウォールルールの評価順序。優先度番号が小さいルールから照合され、最初に一致したルールで確定する。どのルールにも一致しなければ暗黙のアクションが適用されるため、新しい VPC では着信がすべて拒否された状態から始まる。

この暗黙のアクション(ingress は拒否、egress は許可)が設計の出発点です。自分で作った VPC には最初ルールが 1 つもないため、SSH も ping も一切届きません。「まず全部閉じている。必要な穴だけ開ける」が Google Cloud の既定姿勢です。

ターゲット — 誰にルールを適用するか

ルールの適用先(ターゲット)は 3 通りです: ネットワーク内の全インスタンス(既定)、ターゲットタグ(--target-tags)、ターゲットサービスアカウント(--target-service-accounts)。ingress の送信元も IP 範囲のほかタグ・サービスアカウントで指定できます。ただしタグとサービスアカウントを同一ルール内で混在させることはできません。

使い分けの軸は「誰がその属性を変えられるか」です。ネットワークタグはインスタンスを編集できる人なら誰でも付け外しできる任意の文字列ですが、サービスアカウントは 第 2 章で学んだ IAM で保護されたアイデンティティです。セキュリティ境界として使うならサービスアカウントターゲットが堅牢です。

default ネットワークの事前設定ルール

default ネットワークには次の ingress 許可ルールが事前設定されています(削除・変更は可能)。

ルール名優先度送信元許可する通信
default-allow-internal6553410.128.0.0/9tcp・udp の全ポート、icmp
default-allow-ssh655340.0.0.0/0tcp:22
default-allow-rdp655340.0.0.0/0tcp:3389
default-allow-icmp655340.0.0.0/0icmp

SSH と RDP が全世界(0.0.0.0/0)に開いている点に注目してください。学習には便利ですが、本番でこのまま使うべきではありません。なお、ファイアウォールルールとは無関係に VM とメタデータサーバー 169.254.169.254 の通信は常に許可されます(内部 DNS や起動時の鍵配布がここを通ります)。

試験の視点: 「特定の VM 群にだけポートを開けたい」ならタグかサービスアカウントターゲット、「セキュリティ要件が厳しい」ならサービスアカウント、が定番の選択です。また「default ネットワークを本番利用している」という設定はそれ自体が誤り選択肢のシグナルで、custom モード VPC + 最小限のファイアウォールルールへの置き換えが正解側に来ます。

ルート・内部 DNS・外への出口 — Cloud NAT と Private Google Access

ルート — パケットの行き先はどう決まるか

VPC のルートもグローバルリソースです。ルートには大きくシステム生成ルートとカスタムルートがあります。

ルート選択は最長プレフィックスマッチが原則です。宛先 IP に最も長く(具体的に)一致するルートが勝ち、同じ長さならルートの種類と優先度で決まります。

VM 10.0.1.2 ルート(VPC 全体で共有) サブネットルート 宛先 10.0.2.0/24(自動生成) デフォルトルート 宛先 0.0.0.0/0(削除可) 別サブネットの VM 10.0.2.5 インターネット example.com 宛先を照合 最長一致 既定の出口
図 3-3 ルート選択。宛先 IP に最も長く一致するルートが選ばれる。10.0.2.5 宛はサブネットルートに一致して内部で届き、どのルートにも一致しない example.com 宛だけがデフォルトルート経由で外へ向かう。

なお、ロードバランサのヘルスチェックや IAP のトラフィックには、上記のルートとは別の専用の戻り経路(special return paths)が Google 側のネットワークに用意されています。これらは VPC のルートテーブルには現れず、削除も上書きもできません。IAP の範囲 35.235.240.0/20 は後のハンズオンでファイアウォールの送信元として登場します。

内部 DNS — VM は名前で呼び合える

同じ VPC 内の VM は、内部 DNS 名で解決できます。現在の既定であり推奨でもあるゾーン DNS の形式は VM_NAME.ZONE.c.PROJECT_ID.internal です(障害の影響をゾーン単位に閉じ込められるため、グローバル DNS 形式 VM_NAME.c.PROJECT_ID.internal より強く推奨されています)。名前解決を担うのはメタデータサーバー 169.254.169.254 で、各 VM の DNS リゾルバとして構成されます。解決できるのは同一 VPC ネットワーク内からのみです。

外部 IP を持たない VM の出口 — Cloud NAT と Private Google Access

セキュリティ設計の基本は「VM に外部 IP を付けない」ことです。しかし外部 IP がないと、OS パッケージの更新も Google API の呼び出しもできません。この問題への答えが宛先別に 2 つ用意されています。

VPC ネットワーク VM 外部 IP なし 10.0.1.2 Cloud NAT Cloud Router に連動 Private Google Access サブネット単位で有効化 インターネット Google API 群 private.googleapis.com 199.36.153.8/30 インターネット宛 Google API 宛 SNAT で送信 内部経路
図 3-4 外部 IP を持たない VM の 2 つの出口。インターネット宛は Cloud NAT が送信元アドレスを変換(SNAT)して送り出し、Google API 宛は Private Google Access により Google の網内で完結する。どちらも VM に外部 IP を付けずに済む。

Cloud NAT は、外部 IPv4 アドレスを持たないリソースにインターネットへのアウトバウンドを提供するマネージドサービスです。プロキシ VM を立てる方式ではなく、VPC を支える Andromeda ソフトウェアに NAT を組み込む分散実装なので、単一障害点や帯域ボトルネックになりません。制御プレーンとして Cloud Router を使い(NAT 自体はリージョンリソース)、Compute Engine VM のほか GKE、Cloud Run、Cloud Run functions からも利用できます。ポートは既定で静的割り当て(VM あたり 64 ポート)、動的ポート割り当てを有効にすると 32 ポートから需要に応じて倍々に増えます。NAT 用外部 IP 1 つで TCP・UDP 各 64,512 の送信元ポートを提供でき、ポートが尽きるとパケットはドロップされます(2026-08 時点)。

Private Google Access(PGA)は、外部 IP を持たない VM が Cloud Storage や BigQuery などの Google API・サービスの外部 IP アドレスへ、Google の網内経路で到達できるようにするサブネット単位の設定です。外部 IP を持つ VM には効果がありません(設定と無関係にアクセス可能)。既定ではデフォルトルート経由で API の公開 IP に届きますが、より厳密に制御したい場合は private.googleapis.com(199.36.153.8/30)や VPC Service Controls 対応の restricted.googleapis.com(199.36.153.4/30)という専用ドメイン + 専用 IP 範囲に DNS を向ける構成が取れます(第 13 章)。

試験の視点: 「外部 IP を持たせずに ◯◯ したい」が来たら宛先で切り分けます。インターネットへのアウトバウンド = Cloud NAT、Google API = Private Google Access、オンプレミスとの相互接続 = Cloud VPN / Interconnect(第 12 章)。「外部 IP を付与する」「default ネットワークに戻す」は原則誤答側です。

ハンズオン

第 1 章で作った学習用プロジェクトと Cloud Shell を使います(ローカルの gcloud CLI でも同じです)。3 本は連続しており、3-1 で作るネットワークを 3-3 まで使い回します。現在のプロジェクトは gcloud config get-value project で確認してください。

ハンズオン 3-1|カスタムモード VPC とサブネットを作る

custom モードの VPC と東京リージョンのサブネットを作り、範囲拡張まで試します。所要 10 分。費用: 0 円(VPC・サブネット自体に課金はなく、課金対象のリソースは作りません)。

  1. custom モードで VPC ネットワークを作る:
gcloud compute networks create handson-vpc --subnet-mode=custom
  1. 東京リージョンにサブネットを作る。セカンダリ範囲と Private Google Access もここで仕込んでおく:
gcloud compute networks subnets create subnet-tokyo \
    --network=handson-vpc \
    --region=asia-northeast1 \
    --range=10.0.1.0/24 \
    --secondary-range=pods=10.4.0.0/20 \
    --enable-private-ip-google-access
  1. プライマリ範囲を /24 から /23 へ拡張し(縮小はできない)、結果を確認する:
gcloud compute networks subnets expand-ip-range subnet-tokyo \
    --region=asia-northeast1 \
    --prefix-length=23

gcloud compute networks subnets describe subnet-tokyo \
    --region=asia-northeast1 \
    --format="text(ipCidrRange, secondaryIpRanges, privateIpGoogleAccess)"

期待される出力: ipCidrRange が 10.0.0.0/23 に広がり、privateIpGoogleAccess が True になっていれば成功です。

後片付け: このネットワークはハンズオン 3-2 / 3-3 でも使うので、章の最後まで進む場合は保留してください。ここで終える場合のみ実行します。

gcloud compute networks subnets delete subnet-tokyo --region=asia-northeast1 --quiet
gcloud compute networks delete handson-vpc --quiet
ハンズオン 3-2|ファイアウォールルールを設計する — タグターゲットと優先度

暗黙の拒否しかない handson-vpc に、内部通信・IAP 経由 SSH・優先度の異なる deny の 3 ルールを作ります。所要 10 分。費用: 0 円(ルール自体は無料。ロギングを有効化した場合のみログ量に応じて課金されます)。

  1. 「内部は全許可」「SSH は IAP の範囲から、タグ付き VM にだけ許可」「検疫タグ付き VM への SSH は優先度 900 で拒否」の 3 本を作る:
gcloud compute firewall-rules create handson-allow-internal \
    --network=handson-vpc --direction=INGRESS --action=ALLOW \
    --rules=tcp,udp,icmp --source-ranges=10.0.0.0/23

gcloud compute firewall-rules create handson-allow-ssh-iap \
    --network=handson-vpc --direction=INGRESS --action=ALLOW \
    --rules=tcp:22 --source-ranges=35.235.240.0/20 \
    --target-tags=ssh-via-iap

gcloud compute firewall-rules create handson-quarantine-deny-ssh \
    --network=handson-vpc --direction=INGRESS --action=DENY \
    --rules=tcp:22 --priority=900 --source-ranges=0.0.0.0/0 \
    --target-tags=quarantine
  1. 優先度順に一覧して評価順を目で確認する:
gcloud compute firewall-rules list \
    --filter="network=handson-vpc" --sort-by=priority

NAME                         NETWORK      DIRECTION  PRIORITY  ALLOW         DENY
handson-quarantine-deny-ssh  handson-vpc  INGRESS    900                     tcp:22
handson-allow-internal       handson-vpc  INGRESS    1000      tcp,udp,icmp
handson-allow-ssh-iap        handson-vpc  INGRESS    1000      tcp:22

読み方: ssh-via-iap と quarantine の両タグが付いた VM には、優先度 900 の deny が 1000 の allow より先に一致するため SSH が拒否されます。インシデント時にタグ 1 つで VM を隔離する、という実務パターンの縮図です。

後片付け: 3-3 まで進む場合は保留。ここで終える場合のみ実行します。

gcloud compute firewall-rules delete handson-allow-internal \
    handson-allow-ssh-iap handson-quarantine-deny-ssh --quiet
ハンズオン 3-3|外部 IP なし VM を Cloud NAT と Private Google Access で外へつなぐ

外部 IP を持たない VM を作り、「Google API には届くがインターネットには出られない」状態を確認してから、Cloud NAT で出口を開けます。所要 20 分。費用: e2-micro 1 台 + Cloud NAT を 30 分ほどで合計数円程度(2026-08 時点、NAT は利用 VM 1 台あたり $0.0014/時 + NAT 用外部 IP $0.005/時 + 処理データ $0.045/GiB)。

Cloud NAT と VM は消し忘れると時間課金が積み上がります。このハンズオンは必ず後片付けまで一気に実行してください。
  1. 外部 IP なし(--no-address)の VM を、3-2 の SSH 許可タグ付きで作る:
gcloud compute instances create nat-test \
    --zone=asia-northeast1-b \
    --machine-type=e2-micro \
    --image-family=debian-12 \
    --image-project=debian-cloud \
    --network=handson-vpc \
    --subnet=subnet-tokyo \
    --tags=ssh-via-iap \
    --no-address
  1. IAP トンネル経由で SSH し、2 つの宛先へ curl してみる(初回は SSH 鍵が自動生成されます):
gcloud compute ssh nat-test --zone=asia-northeast1-b --tunnel-through-iap \
    --command="curl -s -o /dev/null -w 'google-api: %{http_code}\n' -m 10 https://storage.googleapis.com; curl -s -o /dev/null -w 'internet: %{http_code}\n' -m 10 https://example.com"

期待される出力: google-api: には 400 などの HTTP コードが返り(= Private Google Access 経由で Google API に到達できている)、internet: は 10 秒待って 000(タイムアウト = 外部 IP がないのでインターネットへは出られない)になります。

  1. Cloud Router と Cloud NAT ゲートウェイを作り、1 分ほど待ってから再度 curl する:
gcloud compute routers create handson-router \
    --network=handson-vpc --region=asia-northeast1

gcloud compute routers nats create handson-nat \
    --router=handson-router --region=asia-northeast1 \
    --auto-allocate-nat-external-ips --nat-all-subnet-ip-ranges

gcloud compute ssh nat-test --zone=asia-northeast1-b --tunnel-through-iap \
    --command="curl -s -o /dev/null -w 'internet: %{http_code}\n' -m 10 https://example.com"

期待される出力: 今度は internet: 200 が返ります。VM 側には一切手を入れていないのに出口ができました — NAT がネットワーク側の機能であることの証明です。

後片付け: 章全体のリソースをすべて削除します(NAT → Router → VM → ルール → サブネット → VPC の順)。

gcloud compute routers nats delete handson-nat \
    --router=handson-router --region=asia-northeast1 --quiet
gcloud compute routers delete handson-router --region=asia-northeast1 --quiet
gcloud compute instances delete nat-test --zone=asia-northeast1-b --quiet
gcloud compute firewall-rules delete handson-allow-internal \
    handson-allow-ssh-iap handson-quarantine-deny-ssh --quiet
gcloud compute networks subnets delete subnet-tokyo --region=asia-northeast1 --quiet
gcloud compute networks delete handson-vpc --quiet

gcloud compute networks list

最後の networks list に handson-vpc が出てこなければ削除完了です。

つまずきポイント

VM に SSH も ping も通らない。 自作 VPC の最初の状態は「暗黙の deny ingress」だけです。allow ルールを作るまで何も届きません。逆に egress は暗黙で全許可なので、「出ていくのは自由、入ってくるのは全部拒否」から始まると覚えてください。SSH を開けるなら全世界にではなく、IAP の範囲 35.235.240.0/20 だけに開けるのが定石です。
default ネットワークを本番に流用してしまう。 default-allow-ssh と default-allow-rdp は 0.0.0.0/0 に開いています。学習用プロジェクトの外では、custom モード VPC を作り直すか、少なくともこの 2 ルールを削除・制限してください。auto モードの IP 範囲(10.128.0.0/9)は全プロジェクト共通なので、将来のピアリングやオンプレミス接続で範囲重複の詰みが発生しやすい点も本番回避の理由です(変換は custom への一方通行)。
タグとサービスアカウントは 1 つのルールに混在できない。 --target-tags と --target-service-accounts を同時指定するとエラーになります。またタグはインスタンス編集権限があれば誰でも書き換えられるため、防御境界として使うならタグの付け替え権限まで含めて設計するか、サービスアカウントターゲットに寄せてください。
Cloud NAT の消し忘れとポート枯渇。 NAT ゲートウェイは通信していなくても時間課金が続きます(2026-08 時点で利用 VM 1 台あたり $0.0014/時 — 32 台超はゲートウェイあたり $0.044/時で頭打ち — に加え、NAT 用外部 IP 1 つあたり $0.005/時)。また既定の静的割り当てでは VM あたり 64 ポートしかなく、1 台から大量の同時アウトバウンド接続を張るとポート枯渇でパケットがドロップされます。大量接続のワークロードでは動的ポート割り当てや --min-ports-per-vm の調整を検討してください。

理解度チェック

Q1. VPC ネットワークとサブネットのスコープの違いは? ルートとファイアウォールルールはどちらのスコープか?

VPC ネットワークはグローバルリソース、サブネットはリージョンリソースです。ルートとファイアウォールルールは VPC ネットワークに属するグローバルリソースで、リージョンをまたいで一貫して適用されます。この「1 つの網が全リージョンに広がる」構造が他クラウドとの最大の違いです。

Q2. サブネット 10.0.1.0/24 で VM に割り当てられる IP アドレスは何個? 理由も説明せよ。

252 個です。256 個のうち、先頭のネットワークアドレス(10.0.1.0)、2 番目のゲートウェイ(10.0.1.1)、末尾から 2 番目(将来のための予約)、末尾のブロードキャスト(10.0.1.255)の計 4 つが予約されているためです。なおセカンダリ範囲には予約がなく全アドレスを使えます。

Q3. 新しく作った custom モード VPC の VM に、どこからも SSH できない。ファイアウォールルールは 1 つも作っていない。原因は?

暗黙のアクションです。どのルールにも一致しない ingress トラフィックは拒否されるため、allow ルールを作るまで着信は一切届きません(egress は暗黙で許可)。tcp:22 を許可する ingress ルールを、可能なら IAP の範囲 35.235.240.0/20 を送信元にして作るのが解決策です。

Q4.(試験形式)セキュリティ方針により外部 IP を持てない VM 群が、夜間バッチで外部 SaaS の API(インターネット上)を呼び出す必要がある。推奨される構成は?
A. VM に一時的に外部 IP を付与するスクリプトを組む B. Cloud NAT ゲートウェイをリージョンに構成する C. サブネットで Private Google Access を有効にする D. default ネットワークへ VM を移設する

B。外部 IP なしのままインターネットへのアウトバウンドを得る標準解が Cloud NAT です。A は方針違反かつ攻撃面の拡大。C の PGA が届くのは Google API・サービスであり、外部 SaaS には使えません。D はセキュリティを下げるだけで外部 IP がなければ結局出られません。

Q5.(試験形式)ある企業が auto モード VPC で本番稼働中。今後オンプレミスと VPN 接続する際、オンプレ側の 10.128.0.0/16 と重複することが判明した。取るべき対応は?
A. auto モードのまま重複サブネットだけ削除する B. custom モードへ変換し、重複しない IP 設計のサブネットを新リージョンに追加していく C. いったん auto モードを解除して後で auto に戻す D. オンプレ側を再設計するまで接続を諦める

B。auto モードは custom モードへ一方向変換でき、変換後は自由な IP 設計が可能になります。A はそもそも実行できません(auto モードの自動作成サブネットは、custom モードへ変換しない限り削除できません)。C は不可能(変換は一方通行で auto へは戻せない)。D はクラウド側で解決できる問題を放置する誤りです。

まとめと次章へ

ネットワークという土台ができたので、第 4 章ではその上で動かす Compute Engine — マシンタイプの選定からマネージドインスタンスグループまで — を学びます。ここで作った「外部 IP なし + IAP SSH」の構成は、以降の章でも VM を作るたびの既定形として使います。