[AWS] 積年の夢の続き:リージョン間VPN接続 (powered by Windows Server 2012 R2)


はじめに

積年の夢の実現:リージョン間VPN接続 (Powered by SoftEther)
というポストで『SoftEtherによるAWSリージョン間VPN接続』に触れましたが、その同音異義版である、
Windowsサーバ仮想プライベートゲートウェイによるAWSリージョン間VPN接続』について、御本家AWS謹製の記事『Windows Server 2012 R2 のカスタマーゲートウェイとしての設定』を見かけ、飛びついて試してみました☆
(過去にこのアプローチをトライした当時はハマって断念...今正解を見るに、とても自力では辿り着けない世界... (・・;))
この記事に則して、AWS上の2つのリージョンを使って実装してみたところ、アッサリと疎通成功!!

以下、疎通に至ったまでの設定手順を備忘メモ φ(..)
(詳細記述は引用記事に任せることにして、全体の流れと画面コピーを中心に)

環境構成概要


■SG側:VPC=172.16.0.0/16、プライベートIP=172.16.0.100、EIP=XXX.XXX.XXX.XXX
■US側:VPC=10.10.0.0/16、プライベートIP=10.10.12.200
を、IPSec-VPN接続。
※Virutal Private GWはUS側、WindowsサーバはSG(シンガポール)側、にしますよ。

構築手順

  1. [SG] Windows EC2インスタンスの作成・設定
  2. [US] カスタマーゲートウェイ(CGW)の作成
  3. [US] 仮想プライベートゲートウェイ(VGW)作成・RouteTableの設定
  4. [US] VPNコネクション(VPNC)の作成
  5. [SG] Windowsサーバの設定
  6. [SG] ルーティングおよびリモートアクセスサーバの設定・有効化(Windows)
  7. [SG] VPNトンネルの設定(Windows)
  8. [SG/US] 疎通確認

1. [SG] Windows EC2インスタンスの作成・設定

  • EC2にEIPを付与
  • EC2のSrc./Dest. Checkの無効化
  • Windowsアダプタの設定の更新

※Windowsサーバ側からVPN通信を開始するみたい。Windows EC2側のSecurityGroupのInBoundは調整不要。

2. [US] カスタマーゲートウェイ(CGW)の作成

※CGW/VGW/VPNCの作成手順の詳細は、AWSサイトを参照
- SG側のWindows EC2のEIPを指定

3. [US] 仮想プライベートゲートウェイ(VGW)作成・RouteTableの設定

  • VGWに紐づける、USからSGへのルーティング設定

  • VGWのルート伝達を有効化

4. [US] VPNコネクション(VPNC)の作成

  • 作成済みのCGWとVGWを紐づけるVPNCを作成

  • VPNC作成後に設定ファイルをDL
    ⇒IPSecの事前共有キー(Pre-Shared-Key)と、VGWのグローバルIPアドレス(2つ)をゲット。

5. [SG] Windowsサーバの設定

  • 役割(Roles)の追加:「ネットワーク ポリシーとアクセス サービス」&「リモートアクセス」

  • 役割サービスの設定:NPS

  • 役割サービスの設定:RAS

  • 役割サービスの設定:IIS (デフォルトのママでOK)

6. [SG] リモートアクセスサーバの設定・有効化(Windows)

  • リモートアクセス設定①

  • リモートアクセス設定②

  • リモートアクセス設定③

  • リモートアクセス設定④

  • リモートアクセス設定⑤

7. [SG] VPNトンネルの設定(Windows)

※DLした設定ファイル中のnetshスクリプトをWindowsサーバ上で実行!

  • 設定ファイル内の設定項目の補足:

    • Local Tunnel Endpoint:SG側のWindowsサーバのEIP ※「XXX.XXX.XXX.XXX」に該当
    • Remote Tunnel Endpoint:US側のVGWが持つ(2つの)グローバルIPアドレス  ※VPNC作成時に自動付与される
    • Endpoint 1:SG側のCIDR ※「172.16.0.0/16」に該当
    • Endpoint 2:US側のCIDR ※「10.10.0.0/16」に該当
  • ファイアウォールルールの追加設定
    ※Admin権限で起動したコマンドプロンプトにてnetshコマンドを実行

トンネル(正)用
netsh advfirewall consec add rule Name="VPN to AWS Tunnel 1" ^
Enable=Yes Profile=any Type=Static Mode=Tunnel ^
LocalTunnelEndpoint=172.16.0.100 ^
RemoteTunnelEndpoint=VGWのグローバルIPアドレス①》 ^
Endpoint1=172.16.0.0/24 ^
Endpoint2=10.10.0.0/16 ^
Protocol=Any Action=RequireInClearOut ^
Auth1=ComputerPSK Auth1PSK=《事前共有キー①》 ^
QMSecMethods=ESP:SHA1-AES128+60min+100000kb ^
ExemptIPsecProtectedConnections=No ApplyAuthz=No QMPFS=dhgroup2
トンネル(副)用
netsh advfirewall consec add rule Name="VPN to AWS Tunnel 2" ^
Enable=Yes Profile=any Type=Static Mode=Tunnel ^
LocalTunnelEndpoint=172.16.0.100 ^
RemoteTunnelEndpoint=VGWのグローバルIPアドレス②》 ^
Endpoint1=172.16.0.0/24 ^
Endpoint2=10.10.0.0/16 ^
Protocol=Any Action=RequireInClearOut ^
Auth1=ComputerPSK Auth1PSK=《事前共有キー②》 ^
QMSecMethods=ESP:SHA1-AES128+60min+100000kb ^
ExemptIPsecProtectedConnections=No ApplyAuthz=No QMPFS=dhgroup2
  • レジストリの追加設定 ※Admin権限で起動したコマンドプロンプトにてコマンドを実行
reg add HKLM\System\CurrentControlSet\services\Tcpip\Parameters ^
/v EnableDeadGWDetect /t REG_DWORD /d 1

⇒Regeditで、下記画面のレジストリが追加されていることを確認:

8. [SG/US] 疎通確認

SG側
C:\>ping 10.10.12.200

10.10.12.200  ping を送信しています 32 バイトのデータ:
要求がタイムアウトしました。
10.10.12.200 からの応答: バイト数 =32 時間 =176ms TTL=254
10.10.12.200 からの応答: バイト数 =32 時間 =176ms TTL=254
10.10.12.200 からの応答: バイト数 =32 時間 =176ms TTL=254

10.10.12.200  ping 統計:
    パケット数: 送信 = 4、受信 = 3、損失 = 1 (25% の損失)
ラウンド トリップの概算時間 (ミリ秒):
    最小 = 176ms、最大 = 176ms、平均 = 176ms
US側
$ ping 172.16.0.100
PING 172.16.0.100 (172.16.0.100) 56(84) bytes of data.
64 bytes from 172.16.0.100: icmp_seq=1 ttl=128 time=176 ms
64 bytes from 172.16.0.100: icmp_seq=2 ttl=128 time=176 ms
64 bytes from 172.16.0.100: icmp_seq=3 ttl=128 time=176 ms
64 bytes from 172.16.0.100: icmp_seq=4 ttl=128 time=176 ms
^C
--- 172.16.0.100 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
rtt min/avg/max/mdev = 176.363/176.461/176.549/0.076 ms

⇒反応があればOK!!

後記

  • いずれの方法がいいぜというよりは、リージョン間VPN接続スケーラビリティ管理をAWSに任せてラクしたいならVPN Connection、利用料を抑えるならSoftEther等で腹を括って自己責任、という使い分けでしょうか。
  • 今回の接続方法だとWindowsサーバ側[SG側]からVPNセッションを張る必要がある模様(US側から最初にPingを打つと疎通しない。SG側から疎通した後なら、US側からのPingも通るようになる)
    ⇒SG側からUS側に定期的にPingを打ってVPNセッションを維持する、とかでしょうか...?

  • VPNトンネルは、通信開始後Upになるのに少し時間がかかる。暫く通信していないとDownする。

  • VPNトンネルは可用性目的で2本張られるが、切り替え(フェールオーバ)はどうやって検証できるのだろうか...

  • 次は、VyOS/でやってみたひ。