AWS
VPN
gcp

AWSとGCP間をVPN接続してみた

はじめに

AWSとGCP間をシームレスに接続する必要が出てきたので、VPNセッションを冗長化する方法で実装しました。

この投稿内容は、テスト環境上に実装&動作検証した際の備忘録となります。

VPN要件

  • 2つのVPN接続を用意して冗長性を確保する。
  • クラウド間はBGP(Border Gateway Protocol)を用いてルーティング情報を交換する。(ダイナミックルーティング)
  • 両クラウド基盤は、東京リージョン間を接続する。(距離遅延を最小に抑える為)

実装後のネットワーク構成イメージ

VPN周りの構成を検討するにあたり、公式ドキュメントにある『冗長 Cloud VPN トンネル』を参考にした。

また本投稿ではテスト環境下で検証した為、IPアドレス等の情報をマスクせずに記載する。
(現在は全てのテスト環境を削除した為、アドレス等は存在していません。)

Topology.png

VPN接続手順

(GCP) 外部IPアドレスの予約

VPN Gateway #1#2 に割り当てる外部IPアドレスを2つ予約する。

VPCネットワーク外部 IP アドレスを開き、静的アドレスを予約をクリック

任意の名前を入力、リージョンasia-northeast1を選択して予約をクリック
gcp_vpn_01.png

以上の操作を2回繰り返し、外部IPアドレスを2個予約する
gcp_vpn_02.png

(AWS) VPN接続の作成

VPCVPN接続を開き、VPNの作成をクリック

各項目に必要な情報を入力して1つ目のVPN接続を作成
aws_vpn_01.png

項目 説明 今回値
名前タグ この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アドレスを入力)
aws_vpn_02.png

これで下図のように、2つのVPN接続が作成される。
aws_vpn_03.png

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

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

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

ダウンロードした設定ファイルには、GCP側でVPN接続を作成する際に必要な情報が記載されている。
このファイルをテキストエディタ(改行コードがLFな点に注意)で開けば内容を確認できる。

また設定ファイルには、Tunnel #1Tunnel #2の2セッション分が記載されているが、各VPN接続で設定するトンネルは1つなので、Tunnel #1の情報だけを利用する。

以下、各設定ファイルの内容から必要な情報のみ抜粋する。

(1つ目のVPN)

vpn-5db35034.txt
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)

vpn-5db35035.txt
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) クラウドルータの作成

コンソールからハイブリッド接続クラウド ルーターを開き、ルーターを作成をクリック

各項目を入力してクラウドルーターを作成
gcp_vpn_03.png

項目 説明 今回値
名前 このクラウドルーターに付ける任意の名前 vpn-router
ネットワーク このクラウドルーターをアタッチするVPC test-vpc
名前 このクラウドルーターをアタッチするリージョン asia-northeast1
名前 クラウドルーターのBGP AS番号、特に変更する必要が無ければ65000 65000

(GCP) VPN接続の作成

1つ目のVPN接続の作成

前述のAWS側でダウンロードした1つ目の設定ファイルの情報を元に、1つ目のVPN接続を作成する。

コンソールからハイブリッド接続VPNを開き、作成をクリック

VPNゲートウェイとトンネルの各項目を入力してVPN接続を作成
gcp_vpn_04.png

(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 AddressesVirtual Private Gateway 13.113.157.43
IKEバージョン IKEプロトコルのバージョンを選択 IKEv1
共有シークレット 1つ目の設定ファイルにあるPre-Shared Key pcXXX...XXXxS
ルーティング オプション ルーティングの設定方法 動的(BGP)
クラウドルーター このVPNゲートウェイと連携するクラウドルーターを選択 vpn-router
BGP セッション (後述参照)

BGP セッションの右にある鉛筆マークをクリックするとBGP セッションの作成ダイアログが表示されるので、各項目を入力
gcp_vpn_05.png

項目 説明 今回値
名前 このBGPセッションに付ける任意の名前 vpn-test-1-bgp
ピア ASN 1つ目の設定ファイルにあるVirtual Private Gateway ASN 64512
Cloud Router の BGP IP 1つ目の設定ファイルにあるInside IP AddressesCustomer Gateway 169.254.26.158
BGP ピア IP 1つ目の設定ファイルにあるInside IP AddressesVirtual Private Gateway 169.254.26.157

2つ目のVPN接続の作成

1つ目のVPN接続と同様に、今度はダウンロードした2つ目の設定ファイルの情報を元に、2つ目のVPN接続を作成する。

コンソールからハイブリッド接続VPNを開き、作成をクリック

VPNゲートウェイとトンネルの各項目を入力してVPN接続を作成
gcp_vpn_06.png

(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 AddressesVirtual Private Gateway 13.113.145.178
IKEバージョン IKEプロトコルのバージョンを選択 IKEv1
共有シークレット 2つ目の設定ファイルにあるPre-Shared Key MqXXX...XXXP3
ルーティング オプション ルーティングの設定方法 動的(BGP)
クラウドルーター このVPNゲートウェイと連携するクラウドルーターを選択 vpn-router
BGP セッション (後述参照)

BGP セッションの右にある鉛筆マークをクリックするとBGP セッションの作成ダイアログが表示されるので、各項目を入力
gcp_vpn_07.png

項目 説明 今回値
名前 このBGPセッションに付ける任意の名前 vpn-test-2-bgp
ピア ASN 2つ目の設定ファイルにあるVirtual Private Gateway ASN 64512
Cloud Router の BGP IP 2つ目の設定ファイルにあるInside IP AddressesCustomer Gateway 169.254.26.134
BGP ピア IP 2つ目の設定ファイルにあるInside IP AddressesVirtual Private Gateway 169.254.26.133

これで下図のように、VPNゲートウェイが2つ作成される。
gcp_vpn_08.png

(GCP) IPsec、BGPセッションの確認

Google VPN トンネルをクリックすると、下図のように作成した2つのトンネルが表示される。
それぞれのステータス確立済みであれば、IPsecでのVPNセッションが対向のAWS側VPNセッションと確立していることを表す。
gcp_vpn_09.png

コンソールからハイブリッド接続クラウド ルーターを開き、VPNを設定したクラウドルーターの名前(vpn-router)をクリック

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

(AWS) IPsec、BGPセッションの確認

コンソールからVPCVPN接続を開き、各VPN接続を選択してトンネル詳細タブをクリックすると、トンネルの状態を確認することができる。
詳細列がX BGP ROTESまたはIPSEC IS UPとなっていればIPsecでのVPNセッションが確立されていることを表し、状態列がアップとなっていればBGPセッションが確立されていることを表している。

(VPN#1側)
aws_vpn_07.png

(VPN#2側)
aws_vpn_08.png

(GCP) ルートテーブルの確認

コンソールからVPCネットワークルートを開くと、プロジェクトのルーティングテーブルを確認することができる。
下図のように、AWS側からアドバタイズされたルートが動的に追加されていることが判る。
gcp_vpn_11.png

(何故ベストパス以外のルートが、ルーティングテーブルに追加されているのか不明・・・。挙動に支障はないけど)

(AWS) ルートテーブルの確認

コンソールからVPC>ルートテーブルを開き、VPNを作成したVPCのルートテーブルを選択後ルートタブをクリックする。
BGPセッションが確立していれば、下図のようにGCPからアドバタイズされたルートが動的に追加されている。
aws_vpn_09.png

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

疎通、フェイルオーバーテスト

(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がベストパスとして選択されていた。
gcp_vpn_12.png

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

暫くするとvpn-test-2-tunが削除される。
gcp_vpn_14.png

実行しておいたPingの状態を確認する。
icmp_seq85から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(「6.4 BGP Timers」)では30秒が推奨されているので、この仕様に従って最小アドバタイズの間隔が設定されていると思われる。

削除したVPNトンネルvpn-test-2-tunを再作成し、もう一方のトンネルも削除して同様の試験を実施する。(テストの内容は上記と同様なため割愛)
尚、トンネルを再作成する際、VPNゲートウェイvpn-test-2-gwは削除されず残っているので、VPNゲートウェイの詳細ページからVPN トンネルを追加をクリックしてトンネルのみ作成する。
gcp_vpn_15.png