はじめに
AWSとGCP間をシームレスに接続する必要が出てきたので、VPNセッションを冗長化する方法で実装しました。
この投稿内容は、テスト環境上に実装&動作検証した際の備忘録となります。
VPN要件
- 2つのVPN接続を用意して冗長性を確保する。
- クラウド間はBGP(Border Gateway Protocol)を用いてルーティング情報を交換する。(ダイナミックルーティング)
- 両クラウド基盤は、東京リージョン間を接続する。(距離遅延を最小に抑える為)
実装後のネットワーク構成イメージ
VPN周りの構成を検討するにあたり、公式ドキュメントにある『冗長 Cloud VPN トンネル』を参考にした。
また本投稿ではテスト環境下で検証した為、IPアドレス等の情報をマスクせずに記載する。
(現在は全てのテスト環境を削除した為、アドレス等は存在していません。)
VPN接続手順
(GCP) 外部IPアドレスの予約
VPN Gateway #1、#2 に割り当てる外部IPアドレスを2つ予約する。
VPCネットワーク>外部 IP アドレスを開き、静的アドレスを予約をクリック
任意の名前を入力、リージョンにasia-northeast1を選択して予約をクリック

(AWS) VPN接続の作成
VPC>VPN接続を開き、VPNの作成をクリック
| 項目 | 説明 | 今回値 |
|---|---|---|
| 名前タグ | このVPN接続に付ける任意の名前 | VPN Test 1 |
| 仮想プライベートゲートウェイ | VPN接続を作成するVGWを選択 | vgw-2d85382c |
| カスタマーゲートウェイ | 対向のカスターゲートウェイについて、既存のゲートウェイを利用するか新規に作成するか選択 | 新規 |
| IPアドレス | カスタマーゲートウェイのIPアドレス。GCP側で予約した外部IPアドレスを入力 | 35.189.141.66 |
| BGP ASN | カスタマーゲートウェイ側BGP AS番号 | 65000(デフォルト) |
| ルーティングオプション | ルートの管理方法を選択 | 動的(デフォルト) |
| トンネルオプション | 全て空欄 |
2つ目のVPN接続も1つ目と同様に作成(IPアドレスはGCP側で予約した、別の外部IPアドレスを入力)

またVPN接続と同時にカスタマーゲートウェイも同時に作成される。(コンソールからVPC>カスタマーゲートウェイ)

VPN接続の状態が保留中から使用可能に変わった後、それぞれのVPN接続を選択して設定のダウンロードをクリック

ベンダーにGenericを選択してダウンロードをクリック、任意の場所に設定ファイルを保存する。

ダウンロードした設定ファイルには、GCP側でVPN接続を作成する際に必要な情報が記載されている。
このファイルをテキストエディタ(改行コードがLFな点に注意)で開けば内容を確認できる。
また設定ファイルには、Tunnel #1とTunnel #2の2セッション分が記載されているが、各VPN接続で設定するトンネルは1つなので、Tunnel #1の情報だけを利用する。
以下、各設定ファイルの内容から必要な情報のみ抜粋する。
(1つ目のVPN)
IPSec Tunnel #1
================================================================================
# 1: Internet Key Exchange Configuration
Configure the IKE SA as follows:
- IKE version : IKEv1
- Pre-Shared Key : pcXXXXXXXXXXXXXXXXXXXXXXXXXXXXxS
# 3: Tunnel Interface Configuration
Outside IP Addresses:
- Customer Gateway : 35.189.141.66
- Virtual Private Gateway : 13.113.157.43
Inside IP Addresses
- Customer Gateway : 169.254.26.158/30
- Virtual Private Gateway : 169.254.26.157/30
# 4: Border Gateway Protocol (BGP) Configuration:
BGP Configuration Options:
- Customer Gateway ASN : 65000
- Virtual Private Gateway ASN : 64512
(2つ目のVPN)
IPSec Tunnel #1
================================================================================
# 1: Internet Key Exchange Configuration
Configure the IKE SA as follows:
- IKE version : IKEv1
- Pre-Shared Key : MqXXXXXXXXXXXXXXXXXXXXXXXXXXXXP3
# 3: Tunnel Interface Configuration
Outside IP Addresses:
- Customer Gateway : 35.189.143.44
- Virtual Private Gateway : 13.113.145.178
Inside IP Addresses
- Customer Gateway : 169.254.26.134/30
- Virtual Private Gateway : 169.254.26.133/30
# 4: Border Gateway Protocol (BGP) Configuration:
BGP Configuration Options:
- Customer Gateway ASN : 65000
- Virtual Private Gateway ASN : 64512
(GCP) クラウドルータの作成
コンソールからハイブリッド接続>クラウド ルーターを開き、ルーターを作成をクリック
| 項目 | 説明 | 今回値 |
|---|---|---|
| 名前 | このクラウドルーターに付ける任意の名前 | vpn-router |
| ネットワーク | このクラウドルーターをアタッチするVPC | test-vpc |
| 名前 | このクラウドルーターをアタッチするリージョン | asia-northeast1 |
| 名前 | クラウドルーターのBGP AS番号、特に変更する必要が無ければ65000
|
65000 |
(GCP) VPN接続の作成
1つ目のVPN接続の作成
前述のAWS側でダウンロードした1つ目の設定ファイルの情報を元に、1つ目のVPN接続を作成する。
コンソールからハイブリッド接続>VPNを開き、作成をクリック
VPNゲートウェイとトンネルの各項目を入力してVPN接続を作成

(VPNゲートウェイ項目)
| 項目 | 説明 | 今回値 |
|---|---|---|
| 名前 | このVPNゲートウェイに付ける任意の名前 | vpn-test-1-gw |
| ネットワーク | このVPNゲートウェイをアタッチするVPC | test-vpn |
| リージョン | このVPNゲートウェイをアタッチするリージョン | asia-northeast1 |
| IPアドレス | 予約しておいた1つ目の外部IPアドレス | 35.189.141.66 |
(VPNトンネル項目)
| 項目 | 説明 | 今回値 |
|---|---|---|
| 名前 | このVPNトンネルに付ける任意の名前 | vpn-test-1-tun |
| リモートピア IP アドレス | 1つ目の設定ファイルにあるOutside IP AddressesのVirtual Private Gateway
|
13.113.157.43 |
| IKEバージョン | IKEプロトコルのバージョンを選択 | IKEv1 |
| 共有シークレット | 1つ目の設定ファイルにあるPre-Shared Key
|
pcXXX...XXXxS |
| ルーティング オプション | ルーティングの設定方法 | 動的(BGP) |
| クラウドルーター | このVPNゲートウェイと連携するクラウドルーターを選択 | vpn-router |
| BGP セッション | (後述参照) |
BGP セッションの右にある鉛筆マークをクリックするとBGP セッションの作成ダイアログが表示されるので、各項目を入力

| 項目 | 説明 | 今回値 |
|---|---|---|
| 名前 | このBGPセッションに付ける任意の名前 | vpn-test-1-bgp |
| ピア ASN | 1つ目の設定ファイルにあるVirtual Private Gateway ASN
|
64512 |
| Cloud Router の BGP IP | 1つ目の設定ファイルにあるInside IP AddressesのCustomer Gateway
|
169.254.26.158 |
| BGP ピア IP | 1つ目の設定ファイルにあるInside IP AddressesのVirtual Private Gateway
|
169.254.26.157 |
2つ目のVPN接続の作成
1つ目のVPN接続と同様に、今度はダウンロードした2つ目の設定ファイルの情報を元に、2つ目のVPN接続を作成する。
コンソールからハイブリッド接続>VPNを開き、作成をクリック
VPNゲートウェイとトンネルの各項目を入力してVPN接続を作成

(VPNゲートウェイ項目)
| 項目 | 説明 | 今回値 |
|---|---|---|
| 名前 | このVPNゲートウェイに付ける任意の名前 | vpn-test-2-gw |
| ネットワーク | このVPNゲートウェイをアタッチするVPC | test-vpn |
| リージョン | このVPNゲートウェイをアタッチするリージョン | asia-northeast1 |
| IPアドレス | 予約しておいた2つ目の外部IPアドレス | 35.189.143.44 |
(VPNトンネル項目)
| 項目 | 説明 | 今回値 |
|---|---|---|
| 名前 | このVPNトンネルに付ける任意の名前 | vpn-test-2-tun |
| リモートピア IP アドレス | 2つ目の設定ファイルにあるOutside IP AddressesのVirtual Private Gateway
|
13.113.145.178 |
| IKEバージョン | IKEプロトコルのバージョンを選択 | IKEv1 |
| 共有シークレット | 2つ目の設定ファイルにあるPre-Shared Key
|
MqXXX...XXXP3 |
| ルーティング オプション | ルーティングの設定方法 | 動的(BGP) |
| クラウドルーター | このVPNゲートウェイと連携するクラウドルーターを選択 | vpn-router |
| BGP セッション | (後述参照) |
BGP セッションの右にある鉛筆マークをクリックするとBGP セッションの作成ダイアログが表示されるので、各項目を入力

| 項目 | 説明 | 今回値 |
|---|---|---|
| 名前 | このBGPセッションに付ける任意の名前 | vpn-test-2-bgp |
| ピア ASN | 2つ目の設定ファイルにあるVirtual Private Gateway ASN
|
64512 |
| Cloud Router の BGP IP | 2つ目の設定ファイルにあるInside IP AddressesのCustomer Gateway
|
169.254.26.134 |
| BGP ピア IP | 2つ目の設定ファイルにあるInside IP AddressesのVirtual Private Gateway
|
169.254.26.133 |
(GCP) IPsec、BGPセッションの確認
Google VPN トンネルをクリックすると、下図のように作成した2つのトンネルが表示される。
それぞれのステータスが確立済みであれば、IPsecでのVPNセッションが対向のAWS側VPNセッションと確立していることを表す。

コンソールからハイブリッド接続>クラウド ルーターを開き、VPNを設定したクラウドルーターの名前(vpn-router)をクリック
下図のようにBGPセッションが2つ表示されていれば、2本のVPNセッションを介してそれぞれBGPセッションが確立されていることが判る。
更にアドバタイズ(広報)されたルートにあるネクストホップを確認すると、BGPのベストパス(優先ルート)がどちらのVPNセッションに設定されているか判る。(下図の場合、vpn-test-1-tunが優先ルートになっている。)

(AWS) IPsec、BGPセッションの確認
コンソールからVPC>VPN接続を開き、各VPN接続を選択してトンネル詳細タブをクリックすると、トンネルの状態を確認することができる。
詳細列がX BGP ROTESまたはIPSEC IS UPとなっていればIPsecでのVPNセッションが確立されていることを表し、状態列がアップとなっていればBGPセッションが確立されていることを表している。
(GCP) ルートテーブルの確認
コンソールからVPCネットワーク>ルートを開くと、プロジェクトのルーティングテーブルを確認することができる。
下図のように、AWS側からアドバタイズされたルートが動的に追加されていることが判る。

(何故ベストパス以外のルートが、ルーティングテーブルに追加されているのか不明・・・。挙動に支障はないけど)
(AWS) ルートテーブルの確認
コンソールからVPC>ルートテーブルを開き、VPNを作成したVPCのルートテーブルを選択後ルートタブをクリックする。
BGPセッションが確立していれば、下図のようにGCPからアドバタイズされたルートが動的に追加されている。

もしBGPセッションが確立しているにも関わらずCGPへのルートが追加されてい場合は、ルート伝播タブをクリックし、伝播列がはいとなっているか確認する。
もし下図のようにいいえになっている場合、GCPからのアドバタイズを無視してしまうので、編集してはいに変更する。

↓↓↓↓↓変更

疎通、フェイルオーバーテスト
(AWS, GCP) インスタンスの作成
CGP、AWSそれぞれにLinux(今回はCentOS7)のインスタンスを作成する。(作成手順は割愛)
またAWS側のインスタンス側のセキュリティグループには、GCPからのPingを通すよう、インバウンド側へのICMP通信を許可するルールを追加しておく。
Pingテスト
GCPのVMインスタンスからEC2インスタンスに対し、Pingを10回送ってみた。
距離が近いだけに(東京リージョン間)、思っていたより速度が出ている感じだ。
$ ping -c 10 10.2.0.6
PING 10.2.0.6 (10.2.0.6) 56(84) bytes of data.
64 bytes from 10.2.0.6: icmp_seq=1 ttl=64 time=7.64 ms
64 bytes from 10.2.0.6: icmp_seq=2 ttl=64 time=6.76 ms
64 bytes from 10.2.0.6: icmp_seq=3 ttl=64 time=6.85 ms
64 bytes from 10.2.0.6: icmp_seq=4 ttl=64 time=6.76 ms
64 bytes from 10.2.0.6: icmp_seq=5 ttl=64 time=6.80 ms
64 bytes from 10.2.0.6: icmp_seq=6 ttl=64 time=6.60 ms
64 bytes from 10.2.0.6: icmp_seq=7 ttl=64 time=6.74 ms
64 bytes from 10.2.0.6: icmp_seq=8 ttl=64 time=6.63 ms
64 bytes from 10.2.0.6: icmp_seq=9 ttl=64 time=6.70 ms
64 bytes from 10.2.0.6: icmp_seq=10 ttl=64 time=6.57 ms
--- 10.2.0.6 ping statistics ---
10 packets transmitted, 10 received, 0% packet loss, time 9017ms
rtt min/avg/max/mdev = 6.571/6.810/7.645/0.302 ms
フェイルオーバーテスト
AWS、GCP共に、VPNのセッションを一時的に切断する方法が見当たらなかったので、GCP側のトンネルを削除することで検証した。
GCP側VMインスタンスからEC2インスタンスに対し、Pingを実行しておく。
$ ping 10.2.0.6
PING 10.2.0.6 (10.2.0.6) 56(84) bytes of data.
64 bytes from 10.2.0.6: icmp_seq=1 ttl=64 time=8.13 ms
64 bytes from 10.2.0.6: icmp_seq=2 ttl=64 time=6.75 ms
64 bytes from 10.2.0.6: icmp_seq=3 ttl=64 time=6.81 ms
・・・
GCPコンソールからハイブリッド接続>クラウド ルーターを開き、vpn-routerをクリックして詳細を確認し、どちらのVPN接続がベストパスに選択されているか確認する。
この時は下図のように、vpn-test-2がベストパスとして選択されていた。

サイドメニューのVPNを開き、vpn-test-2-tunをクリックして詳細ページにある削除をクリックする。

実行しておいたPingの状態を確認する。
icmp_seqが85から115に飛んでいるので、この間にルーティングがvpn-test-1側に切り替わったことが想像できる。(クラウド ルーターの詳細ページで確認可能)
またPingの間隔はデフォルトでは1秒なので、フェイルオーバーに約30秒かかっていると思われる。
・・・
64 bytes from 10.2.0.6: icmp_seq=83 ttl=64 time=4.98 ms
64 bytes from 10.2.0.6: icmp_seq=84 ttl=64 time=5.24 ms
64 bytes from 10.2.0.6: icmp_seq=85 ttl=64 time=5.10 ms
64 bytes from 10.2.0.6: icmp_seq=115 ttl=64 time=5.87 ms
64 bytes from 10.2.0.6: icmp_seq=116 ttl=64 time=5.13 ms
64 bytes from 10.2.0.6: icmp_seq=117 ttl=64 time=5.06 ms
・・・
何回かテストしてみた結果、瞬時~30秒で切り替わることが確認できた。
RFC1771(「Appendix 6.4 BGP Timers」)では30秒が推奨されているので、この仕様に従って最小アドバタイズの間隔が設定されていると思われる。
削除したVPNトンネルvpn-test-2-tunを再作成し、もう一方のトンネルも削除して同様の試験を実施する。(テストの内容は上記と同様なため割愛)
尚、トンネルを再作成する際、VPNゲートウェイvpn-test-2-gwは削除されず残っているので、VPNゲートウェイの詳細ページからVPN トンネルを追加をクリックしてトンネルのみ作成する。









