はじめに
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 トンネルを追加
をクリックしてトンネルのみ作成する。