GCPのCloud VPNで2つのVPCをつなぐ

とにかく手順がややこしいし、一回設定するといじらないので次回やるときにはほぼ忘れてるやつ。毎回思い出すのも面倒なので手順書化した。

# 全体の概要
どういうものかは [公式ページ](https://cloud.google.com/network-connectivity/docs/vpn/concepts/overview?hl=ja) を見るとして。要するにIPSec VPN。AWSで言うところの [AWS Site-to-Site VPN](https://docs.aws.amazon.com/ja_jp/vpn/latest/s2svpn/VPC_VPN.html) 。

で、GCP版はHAに対応しているらしい。

全体的な構造はこんな感じになっている。
![Screenshot from 2023-02-26 20-06-43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/7a08fa53-0329-d870-1f07-ae1a1d859a2a.png)

上の図の中の①、②・・・と振ってある数字は作るべきもの、管理するべきものを一覧するために通し番号をふっている。以下の手順でもこの数字で作るべきもの、管理すべきものを指し示している。ただし以下の文中ではフォントが対応していないので(1), (2)...としている。実際に作るときにも番号を確認しながらどこまで作ったのか、どんな値をセットしたのかをメモしながら進めると迷わずに済むと思う。

# 手順
## ベースとなる環境の作成
- プロジェクト(1), (2)を作成する
    - ポリシーで以下の項目が許可されていることを確認
        - constraints/compute.restrictVpnPeerIPs
        - ![20230226-01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/5d1d7c6c-8cbe-f4a2-c6a8-ee0a43dfaaae.jpeg)
    - プロジェクトのオーナー権限があること
- VPC(3), (4)を作成する
    - 初回の場合はCompute Engine APIが有効になっていないことがあるので有効化する。有効化すると`default`というVPCができる。それを使ってもいいが、使用しないサブネットが大量にできて見通しが悪いので、今回はカスタム設定で作成した
        - 名前: 任意の名前(今回の例では、`vpc-peer1`, `vpc-peer2`)
        - VPC ネットワーク ULA の内部 IPv6 範囲: 無効(デフォルト値)
        - サブネット
            - カスタムモードで作成
                - `vpc-peer1`には`subnet-peer1`(上図の(3), `192.168.10.0/24`), `vpc-peer2`には`subnet-peer2`(上図の(4), `172.16.0.0/24`)をそれぞれ作成。
        - ファイアウォールルール: デフォルトのまま
        - 動的ルーティングモード: リージョン(デフォルト値。`subnet-peer1`と`subnet-peer2`が異なるリージョンになる場合にはグローバルに変更する)
        - 最大伝送単位(MTU): 1460(デフォルト値)

Cloud Routerを作る
- Cloud Router(5), (6)をつくる
    - 名前: 今回の例では、上図の(5)を`router-peer1`、上図の(6)を`router-peer2`
    - ネットワーク:
        - 上図の(5)`router-peer1`には(3)`vpc-peer1`、上図の(6)`router-peer1`には(4)`vpc-peer1`
    - リージョン: (3), (4)のサブネットがあるリージョンを指定
    - Google ASN: それぞれにユニークなAS番号を割り当てる。[RFP6996](https://www.rfc-editor.org/rfc/rfc6996)準拠のプライベートAS番号である64512〜65534のなかで割り当てる。この例では上図の(5)`router-peer1`に`64512`、上図の(6)`router-peer2`に`64513`を割り当てた
    - BGPピアキープアライブの間隔: 空白(デフォルト。20秒となる)
    - アドバタイズされたルート
        - ルート: Cloud Router に表示されるすべてのサブネットにアドバタイズ（デフォルト）を選択
![20230226-02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/ae7ded02-a82e-5471-2ecf-8e37579e1fe8.jpeg)
## VPNゲートウェイの作成
ここまでで以下のような状態になっている
![Screenshot from 2023-02-26 23-11-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/1d625660-b1a5-83c7-1c73-72f7da6682df.png)

- (3)のVPCの中にVPNゲートウェイ(7)を作る。「高可用性(HA)VPN」を選択する
![20230226-03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/0aa5addd-2fa7-ca94-d3bc-3e46971524ab.jpeg)

- (7)には以下のように値をセットする
    - VPNゲートウェイの名前: (7)の場合は`vpn-peer1`, (8)の場合は`vpn-peer2`
    - ネットワーク: (3)の名前。(7)-`vpn-peer1`の場合は`vpc-peer1`になる
    - リージョン: VPNゲートウェイを作成するリージョン。ここでは作成したサブネットと同じリージョンにする。(7)の場合は(3)のサブネット`subnet-peer1`のある、東京リージョンにする
    - VPN トンネルの内部 IP スタックタイプ
        - IPv4(シングルスタック)を選択
![20230226-04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/90fc42b7-d010-4f55-e1e6-b833a91ffe8a.jpeg)

作成したら「VPNトンネルの追加」の作業を行わず、もう1つブラウザのタブを開き、(2)-プロジェクト`peer2`の(4)-`vpc-peer2`の中に、同じくVPNゲートウェイ(8)を作る。(7)と同様に以下のような値をセットする
- (8)には以下のように値をセットする
    - VPNゲートウェイの名前: (8)の場合は`vpn-peer2`
    - ネットワーク: (4)の名前。(8)-`vpn-peer1`の場合は`vpc-peer2`になる
    - リージョン: VPNゲートウェイを作成するリージョン。ここでは作成したサブネットと同じリージョンにする。(8)の場合は(4)のサブネット`subnet-peer2`のある、東京リージョンにする
    - VPN トンネルの内部 IP スタックタイプ
        - IPv4(シングルスタック)を選択
![20230226-05.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/2f0ca13e-3000-21d3-be08-2fed3812492a.jpeg)

## VPNトンネルの作成
ここまでで以下のような状態になっている。VPNゲートウェイが作成され、グローバルIPアドレスがVPNゲートウェイごとに2つ割り当てられている(図中の(9), (10), (11), (12))
![Screenshot from 2023-02-26 23-27-58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/96429a35-3d60-b489-3bc0-cdca7db9c17d.png)

それぞれのVPNゲートウェイの中に、VPNトンネルを作成する。まずは(7)-`vpn-peer1`の中に、(13), (16)を作成する
- 以下のように値をセットする
    - ピア VPN ゲートウェイ: Google Cloudを選択
    - プロジェクト: 対向となるプロジェクトを指定する。この場合は(2)-`peer2`を指定する
    - VPNゲートウェイの名前: 対向となるVPNゲートウェイを指定する。この場合は(8)-`vpn-peer2`を指定する
    - 高可用性: VPNトンネルのペアを作成するを選択
    - Cloud Router: 自分のVPC内のCloud Routerを指定する。この場合は(5)-`router-peer1`
![20230226-06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/498579da-ee12-3bc5-3432-723cd7bc18f3.jpeg)

続けてトンネル(13), (16)の設定を作成する
- 以下のように値をセットする
    - 1つめのトンネル(13)
        - 名前: `tunnel1-peer1`
        - IKEバージョン: IKEv2(デフォルト値)
        - IKE事前共有キー: [生成してコピー]を押して自動生成し、メモしておく。これが(15)-事前共有キー(1)になる。
    - 2つめのトンネル(16)
        - 名前: `tunnel2-peer1`
        - IKEバージョン: IKEv2(デフォルト値)
        - IKE事前共有キー: [生成してコピー]を押して自動生成し、メモしておく。これが(18)-事前共有キー(2)になる。
![20230226-07.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/60977618-084b-43f2-5512-882683f0b0ae.jpeg)

[作成して続行]をクリックする。作成が完了したら、もう1つのブラウザタブに移動し、(8)-`vpn-peer2`の中に、(14), (17)を作成する
- 以下のように値をセットする
    - ピア VPN ゲートウェイ: Google Cloudを選択
    - プロジェクト: 対向となるプロジェクトを指定する。この場合は(1)-`peer1`を指定する
    - VPNゲートウェイの名前: 対向となるVPNゲートウェイを指定する。この場合は(7)-`vpn-peer1`を指定する
    - 高可用性: VPNトンネルのペアを作成するを選択
    - Cloud Router: 自分のVPC内のCloud Routerを指定する。この場合は(6)-`router-peer2`
![20230226-08.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/4970b9e2-cf81-ed10-e244-95bc44e39367.jpeg)

続けてトンネル(14), (17)の設定を作成する
- 以下のように値をセットする
    - 1つめのトンネル(14)
        - 名前: `tunnel1-peer2`
        - IKEバージョン: IKEv2(デフォルト値)
        - IKE事前共有キー: (15)-事前共有キー(1)をメモからペーストする
    - 2つめのトンネル(17)
        - 名前: `tunnel2-peer2`
        - IKEバージョン: IKEv2(デフォルト値)
        - IKE事前共有キー: (18)-事前共有キー(2)をメモからペーストする
![20230226-09.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/d4da0bf7-41bd-3e62-659f-19285f7cccda.jpeg)

[作成して続行]をクリックする。

## BGPの設定
ここまでで以下のような状態になっている。
![Screenshot from 2023-02-26 23-53-09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/33d8cf1c-ffac-9059-a3a2-0aaaff75d1ef.png)

次に作成したトンネルの中に、BGPセッションを設定する

まず(13)-`tunnel1-peer1`の中に(19)を作成する。
画面上の`tunnel1-peer1`行の "BGPセッションを構成" をクリックする
![20230226-10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/88c12021-bd1f-f02a-262f-4651d7c5cf78.jpeg)

- 以下のように値をセットする
    - 名前: `bgp-tunnel1-peer1`
    - ピアASN: 対向となるASN。この場合は(6)の`64513`を指定する
    - アドバタイズされたルートの優先度: 空欄(デフォルト値)
    - マルチプロトコルBGP
        - Allocate BGP IPv4 address: 自動を選択
        - BGPピア: 有効を選択
        - MD5認証: 無効を選択
    - アドバタイズされたルート、Bidirectional Forwarding Detection(BFD): 変更しない
![20230226-11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/48bca235-8e21-c25e-41a8-64aa3bc4c19d.jpeg)

[保存して次へ] をクリック

同様に(16)-`tunnel2-peer1`の中に(21)を作成する。
画面上の`tunnel2-peer1`行の "BGPセッションを構成" をクリックする
![20230226-12.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/57f3975d-1df2-1fb8-8f09-3f7ab57c09dd.jpeg)

- 以下のように値をセットする
    - 名前: `bgp-tunnel2-peer1`
    - ピアASN: 対向となるASN。この場合は(6)の`64513`を指定する
    - アドバタイズされたルートの優先度: 空欄(デフォルト値)
    - マルチプロトコルBGP
        - Allocate BGP IPv4 address: 自動を選択
        - BGPピア: 有効を選択
        - MD5認証: 無効を選択
    - アドバタイズされたルート、Bidirectional Forwarding Detection(BFD): 変更しない
![20230226-13.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/072b2b29-db6e-fd28-9a1a-3b2c766a2864.jpeg)


[保存して次へ] をクリック

2つのBGPセッションが設定されていることを確認して、[BGP構成を保存]をクリック
![20230226-14.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/13bc2f8c-1a0d-ca14-d4e6-cc169d8f967b.jpeg)

確認画面の[OK]を押して閉じると、以下のような画面が表示される。
![20230226-16.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/079be7d1-0250-1321-970f-19f85b64de3f.jpeg)
上記の(23),(24),(25),(26)は以降の手順で使用するためメモしておく

続けてもう1つのタブの方に移動して、同様にBGPセッションを作成する

(14)-`tunnel1-peer2`の中に(20)を作成する。
画面上の`tunnel1-peer2`行の "BGPセッションを構成" をクリックする
![20230226-15.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/52495d2b-a8c2-752d-a85b-c0729b12c9bf.jpeg)


- 以下のように値をセットする
    - 名前: `bgp-tunnel1-peer2`
    - ピアASN: 対向となるASN。この場合は(5)の`64512`を指定する
    - アドバタイズされたルートの優先度: 空欄(デフォルト値)
    - マルチプロトコルBGP
        - Allocate BGP IPv4 address: 手動を選択
            - Cloud RouterのBGP IPv4アドレス: (24)の値をセット(先程メモしたときの表記と逆転していることに注意)
            - BGPピアIPv4アドレス: (23)の値をセット(先程メモしたときの表記と逆転していることに注意)
        - BGPピア: 有効を選択
        - MD5認証: 無効を選択
    - アドバタイズされたルート、Bidirectional Forwarding Detection(BFD): 変更しない
![20230226-17.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/e1109c0b-88ee-4b84-2c74-b13e525c3151.jpeg)

[保存を押して次へ]をクリック

同様に(17)-`tunnel2-peer2`の中に(22)を作成する。
画面上の`tunnel2-peer2`行の "BGPセッションを構成" をクリックする
![20230226-18.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/11e725ca-d5bd-0d2a-776f-07c537f46cb3.jpeg)

- 以下のように値をセットする
    - 名前: `bgp-tunnel2-peer2`
    - ピアASN: 対向となるASN。この場合は(5)の`64512`を指定する
    - アドバタイズされたルートの優先度: 空欄(デフォルト値)
    - マルチプロトコルBGP
        - Allocate BGP IPv4 address: 手動を選択
            - Cloud RouterのBGP IPv4アドレス: (26)の値をセット(先程メモしたときの表記と逆転していることに注意)
            - BGPピアIPv4アドレス: (25)の値をセット(先程メモしたときの表記と逆転していることに注意)
        - BGPピア: 有効を選択
        - MD5認証: 無効を選択
    - アドバタイズされたルート、Bidirectional Forwarding Detection(BFD): 変更しない
![20230226-19.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/5e60e358-4851-8382-46c2-2c6c0167b817.jpeg)

[保存を押して次へ]をクリック

2つのBGPセッションが設定されていることを確認して、[BGP構成を保存]をクリック
![20230226-20.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/05cef196-806f-9da3-dad3-fcf193c1ff93.jpeg)

まとめ画面でBGPセッションが確率していればOK
![20230226-21.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/52237/2f222cc7-7689-d650-014b-525fe468e880.jpeg)

## Firewallルールの設定

(3)-`vpc-peer1`, (4)-`vpc-peer2`のファイアウォールルールを設定し、両方のサブネットが疎通するようにする

# おわりです

おつかれさまでした！
慣れれば割とすんなりできるようになるかも。オンプレとの接続もなんとなくできるようになるかもです。