☁️くもをもくもくまなぶ

クラウドコンピューティングサービスの学んだことを中心につらつらと書いています

Google CloudのCloudVPN(HA)構成で接続してみる”

背景

前回の記事にも掲載しましたが、Google CloudからVPNについて案内が来ています。

件名:[ご対応のお願い] 202110 月までに Classic VPN から高可用性 VPN に移行してください
本文:
(一部抜粋)

サポートを終了する次の Classic VPN 構成を使用した新しいトンネルは 202110 月以降は作成できなくなります。
また、これらの構成を使用している既存のトンネルはサポート対象外となります。
すでにインストールして使用しているトンネルは、引き続き正常に動作します。

・ トンネルの接続先のゲートウェイに関係なく、動的ルーティング(Cloud Router)を使用するすべての Classic VPN トンネル。
・ 使用するルーティング方法に関係なく、2 つの GCP Classic VPN ゲートウェイを相互接続する Classic VPN トンネル。
・ 静的ルーティングを使用して GCP Classic VPN ゲートウェイを他のクラウド プロバイダのネットワークに接続する Classic VPN トンネル。

この変更に向けた準備をお手伝いできるよう、このメールをネットワーク エンジニアやサイト信頼性エンジニア(SRE)にご転送ください。

https://cloud.google.com/network-connectivity/docs/vpn/how-to/moving-to-ha-vpn

CloudVPNとは?など疑問がある方は、次のブログを拝見するとよいです。  
GCP の細かすぎて伝わらないハイブリッドネットワーキング

CloudVPN(HA)については、公式ドキュメントでトポロジーについて次の通りに記載されています。

  • 1 台の HA VPN ゲートウェイと 2 台の別々のピア VPN デバイスを接続し、各ピアデバイスが個別の外部 IP アドレスを持つ。
  • 1 台の HA VPN ゲートウェイと 1 台のピア VPN デバイスを接続し、ピアデバイスが 2 つの外部 IP アドレスを持つ。
  • 1 台の HA VPN ゲートウェイと 1 台のピア VPN デバイスを接続し、ピアデバイスが 1 つの外部 IP アドレスを持つ。

https://cloud.google.com/network-connectivity/docs/vpn/concepts/topologies

今回の検証で構築する環境については、「1 台の HA VPN ゲートウェイと 1 台のピア VPN デバイスを接続し、ピアデバイスが 1 つの外部 IP アドレスを持つ。」を利用して構成することにします。

Image in a image block

検証環境の構成

Image in a image block
検証結果

Google Cloud側の設定は問題なく実施できましたが、
Firebox側の設定で1つのインタフェースからGoogle Cloudとの複数のBGP接続ができないようで、  
Google Cloud側でステータスが変わらないことがわかりました。

<details>
<summary>toGCP-1の概要</summary>

    *** WG Diagnostic Report for Gateway "toGCP-1" ***
    Created On: Mon Sep 20 17:57:36 2021

    [Conclusion]
        There are no VPN routes for BOVPN virtual interface toGCP-1.A correction to this error was attempted.
        Recommendation: Send traffic to a host on the remote network, and run the report again.

    [Gateway Summary]
        Gateway "toGCP-1" contains "1" gateway endpoint(s). IKE Version is IKEv2.
        Gateway Endpoint #1 (name "toGCP-1") Enabled
            PFS: Disabled 	AlwaysUp: Enabled
            DPD: Disabled 	Keepalive: Enabled
            Local ID<->Remote ID: {IP_ADDR(${myGlobalIpAddress}) <-> IP_ADDR(35.220.56.85)}
            Local GW_IP<->Remote GW_IP: {${myGlobalIpAddress} <-> 35.220.56.85}
            Outgoing Interface: eth0 (ifIndex=2)
                ifMark=0x10000
                linkStatus=2 (0:unknown, 1:down, 2:up)
            BVPN Interface: bvpn1 (ifIndex=18)
                Remote Endpoint Type: Cloud VPN or Third-Party Gateway
                Local IP address/Netmask: {169.254.1.2 / 255.255.255.252}
                NAT-D flag=0x0 (0:none, 1:remote, 2:local, 3:both)


    [Tunnel Summary]
        "1" tunnel(s) are found using the previous gateway

        Name: "toGCP-1" Enabled
            PFS: "Enabled" DH-Group: "14"
            Number of Proposals: "1"
            Proposal "ESP-AES256-SHA256"
                ESP:
                EncryptAlgo: "AES" KeyLen: "32(bytes)"
                AuthAlgo: "SHA2-256"
                LifeTime: "28800(seconds)" LifeByte: "0(kbytes)"
            Number of Tunnel Routes: "0"


    [Run-time Info (bvpn routes)]


    [Run-time Info (gateway IKE_SA)]
        Name: "toGCP-1" (IfStatus: 0x80000002)
        IKE SAID: "0x4436fa33" State: "MATURE"
        Created: Mon Sep 20 17:15:09 2021
        My Address: ${myGlobalIpAddress}:500	Peer Address: 35.220.56.85:500
        InitCookie: "d30b0de5027278e2"	RespCookie: "d95dfe2177ef4615"
        LifeTime: "86400(seconds)" LifeByte: "0(kbtyes)" DPD: "Enabled"
        Serial Number: 301
        msgIdSend: 78 msgIdRecv: 68


    [Run-time Info (tunnel IPSEC_SA)]
        "2" IPSEC SA(s) are found under tunnel "toGCP-1"
        #1 "OUTBOUND"
            SPI: 0x3460484e ISAKMP SA ID: 0x4436fa33
            Created on: Mon Sep 20 17:15:13 2021
            Last Used on: Mon Sep 20 17:57:35 2021
            Bytes Sent: "349612" Packets Sent: "7999"
            Errors: replay: "0" replay_win: "0" integrity: "0" hw_ctx: "0"
            HwCryptoCtx: currErr: "0" ctxState: "0"
            Tunnel Endpoint: "${myGlobalIpAddress}->35.220.56.85"
            Tunnel Selector: "0 -> 0	Proto: ANY"
            AUTH: "hmac(sha256)" KeyLen: "32(bytes)"
            CRYPT: "cbc(aes)" KeyLen: "32(bytes)"
            XFRM Mark: 1 (value: 0x1 mask: 0xffff)
            Gateway Name: "toGCP-1"
            Tunnel Name: "toGCP-1"
            Owner Id: "D0FF037E97925"
            IFMARK: "0x10000(2)" DPD: "Disabled"
            Number of Rekeys: "0"
        #2 "INBOUND"
            SPI: 0xc023b9e ISAKMP SA ID: 0x4436fa33
            Created on: Mon Sep 20 17:15:13 2021
            Last Used on: Mon Sep 20 17:57:35 2021
            Bytes Sent: "515169" Packets Sent: "7999"
            Errors: replay: "0" replay_win: "0" integrity: "0" hw_ctx: "0"
            HwCryptoCtx: currErr: "0" ctxState: "0"
            Tunnel Endpoint: "35.220.56.85->${myGlobalIpAddress}"
            Tunnel Selector: "0 -> 0	Proto: ANY"
            AUTH: "hmac(sha256)" KeyLen: "32(bytes)"
            CRYPT: "cbc(aes)" KeyLen: "32(bytes)"
            XFRM Mark: 1 (value: 0x1 mask: 0xffff)
            Gateway Name: "toGCP-1"
            Tunnel Name: "toGCP-1"
            Owner Id: "D0FF037E97925"
            IFMARK: "0x10000(2)" DPD: "Disabled"
            Number of Rekeys: "0"

    [Run-time Info (tunnel IPSEC_SP)]
        "1" IPSEC SP(s) are found under tunnel "toGCP-1"
        #1
            Tunnel Endpoint: "${myGlobalIpAddress}->35.220.56.85"
            Tunnel Selector: 0 -> 0	Proto: ANY
            XFRM Mark: 1 (value: 0x1, mask: 0xffff)
            Created On: Mon Sep 20 17:15:07 2021
            Last Used On: Mon Sep 20 17:57:35 2021
            Gateway Name: "toGCP-1"
            Tunnel Name: "toGCP-1"

    [Policy checker result]
        Tunnel name: toGCP-1
            No policy checker results for this tunnel(no vpn routes found or some other error)

</details>

<details>
<summary>toGCP-2の概要</summary>

    *** WG Diagnostic Report for Gateway "toGCP-2" ***
    Created On: Mon Sep 20 17:58:39 2021

    [Conclusion]
        There are no VPN routes for BOVPN virtual interface toGCP-2.A correction to this error was attempted.
        Recommendation: Send traffic to a host on the remote network, and run the report again.

    [Gateway Summary]
        Gateway "toGCP-2" contains "1" gateway endpoint(s). IKE Version is IKEv2.
        Gateway Endpoint #1 (name "toGCP-2") Enabled
            PFS: Disabled 	AlwaysUp: Enabled
            DPD: Disabled 	Keepalive: Enabled
            Local ID<->Remote ID: {IP_ADDR(219.110.18.52) <-> IP_ADDR(35.242.59.89)}
            Local GW_IP<->Remote GW_IP: {${myGlobalIpAddress} <-> 35.242.59.89}
            Outgoing Interface: eth0 (ifIndex=2)
                ifMark=0x10000
                linkStatus=2 (0:unknown, 1:down, 2:up)
            BVPN Interface: bvpn5 (ifIndex=20)
                Remote Endpoint Type: Cloud VPN or Third-Party Gateway
                Local IP address/Netmask: {169.254.2.2 / 255.255.255.252}
                NAT-D flag=0x0 (0:none, 1:remote, 2:local, 3:both)


    [Tunnel Summary]
        "1" tunnel(s) are found using the previous gateway

        Name: "toGCP-2" Enabled
            PFS: "Enabled" DH-Group: "14"
            Number of Proposals: "1"
            Proposal "ESP-AES256-SHA256"
                ESP:
                EncryptAlgo: "AES" KeyLen: "32(bytes)"
                AuthAlgo: "SHA2-256"
                LifeTime: "28800(seconds)" LifeByte: "0(kbytes)"
            Number of Tunnel Routes: "0"


    [Run-time Info (bvpn routes)]


    [Run-time Info (gateway IKE_SA)]
        Name: "toGCP-2" (IfStatus: 0x80000002)
        IKE SAID: "0x57428249" State: "DELETING"
        Created: Mon Sep 20 17:58:37 2021
        My Address: ${myGlobalIpAddress}:500	Peer Address: 35.242.59.89:500
        InitCookie: "fb2fa0a577af9c07"	RespCookie: "dd2f35401ac33b0b"
        LifeTime: "86400(seconds)" LifeByte: "0(kbtyes)" DPD: "Enabled"
        Serial Number: 949
        msgIdSend: 1 msgIdRecv: 3


    [Run-time Info (tunnel IPSEC_SA)]
        "0" IPSEC SA(s) are found under tunnel "toGCP-2"

    [Run-time Info (tunnel IPSEC_SP)]
        "1" IPSEC SP(s) are found under tunnel "toGCP-2"
        #1
            Tunnel Endpoint: "${myGlobalIpAddress}->35.242.59.89"
            Tunnel Selector: 0 -> 0	Proto: ANY
            XFRM Mark: 5 (value: 0x5, mask: 0xffff)
            Created On: Mon Sep 20 17:39:08 2021
            Gateway Name: "toGCP-2"
            Tunnel Name: "toGCP-2"

    [Policy checker result]
        Tunnel name: toGCP-2
            No policy checker results for this tunnel(no vpn routes found or some other error)

</details>

以下は設定の復習用です。

VPNの作成

2021年9月20日時点ではまだ選択可能です。

Image in a image block

前述のHA構成を実施するための選択肢が予め選択可能になっています。

Image in a image block

AS番号はプライベートで運用するため、特にしていなければ65534あたりを使う。
グローバルネットワークを管理しているようなTier1プロバイダを始め、AS番号を使って互いにBGPで通信を行うことで互いに追加したルートが動的に反映されるようになっている。

Image in a image block

IPSecのローカルアドレスは外部に通信する要件もないので、リンクローカルアドレス(169.254.x.x)がよく使われる。
255.255.255.252(/30)で互いに一つずつという構成も一般的。

Image in a image block

BGPセッションの設定も行うと、Google Cloud側は待機状態になる。

Image in a image block

追加する場合は、既に定義したVPNゲートウェイとCloud Routerを使って同じ手順を繰り返す。

Image in a image block

するとVPNは次のようになる。

Image in a image block

まとめ

接続に利用した機器の課題はありますが、目的であるGoogle CloudのCloud VPN(HA)自体は触ることができました。
結局、HA構成だからといって必ずGoogle Cloudが2つのインタフェースを使った定義をしなければならないということではなく、
まずは最低一つの定義をすればよいということは、実際に触ってみることで理解できたのでよかったです。

Fireboxなぁ...もう少し使い勝手よければいいんだけど...