GCPのVPC(Virtual Private Cloud)に入門する

2023-03-27GCP

はじめに

今まで、GCP の VPC についてあまり意識せずに通信ができていました。

Terraform 化を進めていくタイミングで気がついたのですが、
GCP プロジェクト作成時に 自動的に作成された 「VPC ネットワーク」 をそのまま使っていることがわかりました。

GCP ではこの 自動的に作成された VCP ネットワーク を本番運用で利用することを推奨していないようでしたので、
理解を含めてどうするべきかを考えたいと思いました。

「VPC ネットワーク」と構成要素を理解する

かんたんではありますが、VCP ネットワーク の構成要素を図示しました。

+- vpc network ---------------------+
| +-----------------+               |
| |Routing          |               |
| +-----------------+               |
| +-----------------+               |
| |Firewall rule    |               |
| +-----------------+               |
|                                   |
| +- region us-west --------------+ |
| | +- subnet1 -+   +- subnet2 -+ | |
| | | +-------+ |   |           | | |
| | | |GCE    | |   |           | | |
| | | +-------+ |   |           | | |
| | | +-------+ |   |           | | |
| | | |内部LB | |   |           | | |
| | | +-------+ |   |           | | |
| | | +-------+ |   |           | | |
| | | |内部   | |   |           | | |
| | | |静的IP | |   |           | | |
| | | +-------+ |   |           | | |
| | | +-------+ |   |           | | |
| | | |Subnet | |   |           | | |
| | | |routing| |   |           | | |
| | | +-------+ |   |           | | |
| | +-----------+   +-----------+ | |
| +-------------------------------+ |
|                                   |
| +- region us-eas--t ------------+ |
| | +- subnet3 -+                 | |
| | |           |                 | |
| | |           |                 | |
| | |           |                 | |
| | |           |                 | |
| | +-----------+                 | |
| +-------------------------------+ |
|                                   |
+-----------------------------------+

GCP のドキュメントには、 「ネットワーク = 「VPC ネットワーク」」 と書かれているフシがあります。
VPC というプレフィックスが記載されていなかったとしても、両者は同じものを指しています。

「VPC ネットワーク」 は以下のものを持ちます。

  • ルート情報
  • ファイアウォールルール
  • リージョンごとに...
    • サブネット (xN)
    • Compute Engine
    • GKE
    • 内部静的 IP
    • ...などなど

「サブネット」とは?

「VPC ネットワーク」 は、 少なくとも 1 つのサブネットが必要です。

GCP の 「VPC ネットワーク」自体は「マネージドサービスの名前」ぐらいの意味しか持っていません。
「VPC ネットワーク」を構成する実体は サブネット となります。

実体である サブネット の中には、IP アドレスが必要なものが所属することとなります。
例えば、全ての VM インスタンス (具体的には Compute Engine と思ってもらってよい)は (プライベートな) IP アドレスが必要になりますが、IP アドレスは サブネット から払いされれます。

今まで サブネット なんて作成した覚えがないけど?

「自分で VPC ネットワークなんて作成したつもりはないのに、Compute Engine や GKE が使えているけど?」 という方は、
以下で説明する 自動モード VPC ネットワーク が作成されているためです。

「自動モード VPC ネットワーク」 と 「カスタムモード VPC ネットワーク」

「VPC ネットワーク」 には、大きく以下の 2 つの種類があります。

  • 自動で作成される 自動モード VPC ネットワーク
  • 手動で作成する カスタムモード VPC ネットワーク

ちなみに、あとから 自動モード VPC ネットワークカスタムモード VPC ネットワーク に切り替えることはできますが、
その逆はできません。

「自動モード VPC ネットワーク」とは?

GCP の新しいプロジェクトを作成すると、「VPC ネットワーク」が自動的に 1 つ作成されます。

この「VPC ネットワーク」のことを 自動モード VPC ネットワーク と呼びます。

「VPC ネットワーク」には最低でも 1 つの サブネット が必要、と言いましたが、この 自動モード VPC ネットワーク は、すべてのリージョンに対して、 サブネット を 1 つずつ作成します。

2021-07-07 現在、GCP 上にリージョンは 25 個あったので、25 個のサブネットが自動的に作成されることになりますね。

サブネット は自動作成されたものだけでなく、必要があれば自分で追加することも可能です。

自動モード VPC ネットワーク は、いくつかの 事前設定されているファイアウォールルール (後述)も含んでいます。

新しいリージョンが利用可能になった(例えば、北海道リージョンが開設された)場合も、新しいリージョンに対して サブネット を自動的に作成してくれるそうです。

便利そうなのですが、この「自動的にサブネットを作成する」という点が悪さをする場合があるようです。

例えば、新しいリージョンがローンチされた場合には、そのリージョン用の サブネット を自動的に作成します。
これが、手動で作成した サブネット と競合したり、あるいは VPN 接続しているオンプレミスの サブネット と競合してネットワーク不具合が発生する、といったことが起こりえます。

ということで、GCP としては本番環境では後述の カスタムモード VPC ネットワーク の利用を推奨しています。

「組織ポリシー」設定ページで compute.skipDefaultNetworkCreation を無効にすることで自動モード VPC ネットワークが作成されないようにすることもできるようです。

「カスタムモード VPC ネットワーク」とは?

自動的に作成される 自動モード VPC ネットワーク 以外はすべて カスタムモード VPC ネットワーク です。
これは手動で作成されたものになります。

「VPC ネットワーク」には最低でも 1 つの サブネット が必要なので、リージョンを選択し、 IP アドレス 範囲 (後述) を指定して サブネット を作成する必要があります。

サブネット の 「IP アドレス 範囲」とは?

サブネット を作成するときには、 プライマリ IP アドレス範囲 というものを指定する必要があります。

プライマリ IP アドレス範囲 とは、 よく目にする 192.168.1.0/24 のような、ネットワークアドレスと CIDR の組み合わせで表現される値のことです。

サブネット は、
プライマリ IP アドレス範囲 の中から VM インスタンス (Compute Engine のホスト)、 内部ロードバランサ 、 内部プロトコル転送 の各リソースに対して、 プライベートな IP アドレス を払い出します。

IP アドレス範囲 に指定可能な値は以下の 3 つのいずれかになると思って良いです。
( ベンチマークテスト用など、いくつか特殊な用途で指定する IP アドレスがあるようですがサービス提供目的で利用する事はなさそうです。 )

  • 10.0.0.0/8
  • 172.16.0.0/12
  • 192.168.0.0/16

/ の後ろの CIDR 値は、 上記の値より小さければ問題有りません

  • 10.0.0.0/10 という IP アドレス範囲を指定 することはできます
  • 10.0.0.0/7 という IP アドレス範囲を指定することは できません
  • 172.16.0.0/13 という IP アドレス範囲を指定 することはできます
  • 172.16.0.0/11 という IP アドレス範囲を指定することは できません
  • 192.168.0.0/17 という IP アドレス範囲を指定 することはできます
  • 192.168.0.0/15 という IP アドレス範囲を指定することは できません

ちなみに 自動モード VPC ネットワーク の場合、 IP アドレス 範囲 に利用される CIDR ブロックは 10.128.0.0/9 となります。


少し具体的な例を上げながら、 サブネット の中で利用できる IP について説明します。

サブネットのプライマリ IP アドレス範囲を 10.1.2.0/24 と指定した場合、プライベート IP アドレスとして利用できる数はいくつになるでしょう?

IP アドレスネットマスク をビット(2 進数)化してみます。

Network:   10.1.2.0/24          00001010.00000001.00000010. 00000000
Netmask:   255.255.255.0 = 24   11111111.11111111.11111111. 00000000

ネットワーク 10.1.2.0/24 内に存在する プライベート IP アドレスは 末尾の 8 ビット = 256 個 となりますが、この内

  • 00000000 はネットワークを表すもの
  • 11111111 はブロードキャスト用に使われれるもの

として利用されます。
したがって、自由に利用できるプライベート IP アドレスは 256 - 2 = 254 個 となります。

ネットワークアドレス:         10.1.2.0             00001010.00000001.00000010. 00000000
利用可能な最初のIPドレス:     10.1.2.1             00001010.00000001.00000010. 00000001
...
利用可能な最後のIPドレス:     10.1.2.254           00001010.00000001.00000010. 11111110
ブロードキャスト用IPアドレス: 10.1.2.255           00001010.00000001.00000010. 11111111

ただし、GCP の サブネット で自由に利用できるプライベート IP アドレスはもう少し少なくなります。

10.1.2.1サブネット内の デフォルトゲートウェイ (別のネットワークと通信する際の出入り口)に利用されます。
10.1.2.254サブネット内の 将来使用される可能性があるために Google Cloud によって予約されて います。

したがって、通常のプライベートネットワークよりも使えるプライベート IP アドレスは少なく、 256 - 2 -2 = 252 個 となります。

GCP の「デフォルトゲートウェイ」について

上記で登場したデフォルトゲートウェイですが、 物理的に存在するゲートウェイではなく、仮想ゲートウェイです。

このゲートウェイは、ICMP トラフィックに応答したり、IP TTL ヘッダーをデクリメントする事はないということです。
(厳密には、IP TTL はデクリメントされるようですが、ゲートウェイがインクリメントすることで相殺する、という仕組み。)

ping コマンドに対して応答してくれないし、 traceroute / mtr でパケットのポップ経路として表示されません。

「ルート」

「VPC ネットワーク」における ルート には、VM インスタンスから出るパケット(outbound トラフィック、下りトラフィック)のパスを定義します。(inbound トラフィックに対するルートは設定できないんですね。)

「VPC ネットワーク」を作成すると、 デフォルトルート が生成されます。

デフォルトルート優先順位 = 1000宛先の IP アドレス範囲 = 0.0.0.0/0 であり、インターネットに対して通信を行う場合などはこのルートが利用されます。

したがって、 デフォルトルート を削除すると 「VPC ネットワーク」は完全にインターネットから隔離されてしまいます。

「デフォルト」 という名前がついているぐらいなので、自分でルート情報を追加することもできます。これを カスタムルート と呼びます。

「サブネットルート」

通常の「ルート」設定は、VM インスタンスから インターネット に対しての outbound トラフィック を対象とします。

V インスタンスから VCP ネットワーク内のリソース(VM インスタンス、内部ロードバランサなど に対しての outbound トラフィック を対象としたルート設定を サブネットルート と言います。

サブネット は最低でも サブネットルート を 1 つ持ちます。
宛先は サブネットプライマリ IP アドレス範囲 と一致します。

サブネットルール「VPC ネットワーク」 にて自動的に作成、更新されるため、ユーザは意識する必要がありません。

「ファイアウォールルール」

ルート のときと違い、 ファイアウォールルール はネットワーク内向きの通信(inbound トラフィック/上りトラフィック)とネットワーク外向きの通信(outbound トラフィック/下りトラフィック)の両方に適用されます。

全ての 「VPC ネットワーク」には、 2 つの暗黙のファイアウォールルール があります。

  • ほとんどの下りトラフィックを許可
    • 例外的に、ポート 25 を使った SMTP 通信は拒否
  • 全ての上りトラフィックを拒否

2 つの暗黙ルールは 削除することができません

ただしファイアウォールルールを追加することで、この暗黙ルールの制約を調整することができます。

  • 上りトラフィック に対して、許可設定を追加する
  • 下りトラフィック に対して、拒否設定を追加する

「VPC ネットワーク」の例

今までは リージョン(region) について触れてきましたが、 ゾーン(zone) を含めたネットワーク構成図の例は以下のようになります。

ひとこと

ネットワーク周りに明るい人、いろいろ教えてほしいです。

2023-03-27GCP