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

# はじめに
[積年の夢の実現：リージョン間VPN接続 (Powered by SoftEther)](http://qiita.com/coga2000/items/668081e6e42ce313d32c)
というポストで『**SoftEther**による**AWSリージョン間VPN接続**』に触れましたが、その同音異義版である、
『**Windowsサーバ**＆**仮想プライベートゲートウェイ**による**AWSリージョン間VPN接続**』について、御本家AWS謹製の記事『[Windows Server 2012 R2 のカスタマーゲートウェイとしての設定](http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/NetworkAdminGuide/customer-gateway-windows-2012.html)』を見かけ、飛びついて試してみました☆
（過去にこのアプローチをトライした当時はハマって断念...今正解を見るに、とても自力では辿り着けない世界...  (・・;)）
この記事に則して、AWS上の2つのリージョンを使って実装してみたところ、**アッサリと疎通成功**！！

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

# 環境構成概要
![@OVERVIEW.jpg](https://qiita-image-store.s3.amazonaws.com/0/48232/5e72a758-089d-3b0e-99e2-902cd9171670.jpeg)
■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アダプタの設定の更新
![①デバイスマネージャ.jpg](https://qiita-image-store.s3.amazonaws.com/0/48232/554a36b4-c17b-d797-89c1-94c8cf777b6f.jpeg)

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

## 2. [US] カスタマーゲートウェイ(CGW)の作成
※CGW/VGW/VPNCの作成手順の詳細は、[AWSサイト](http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_VPN.html)を参照
- SG側のWindows EC2のEIPを指定
![②CGW.jpg](https://qiita-image-store.s3.amazonaws.com/0/48232/d135e0de-f93a-a691-73fd-f3f713dd9ceb.jpeg)

## 3. [US] 仮想プライベートゲートウェイ(VGW)作成・RouteTableの設定
- VGWに紐づける、USからSGへのルーティング設定
![③VGW-1.jpg](https://qiita-image-store.s3.amazonaws.com/0/48232/c21dd8d3-2ced-1b4e-22c4-1b54c365b704.jpeg)

- VGWのルート伝達を有効化
![④VGW-2.jpg](https://qiita-image-store.s3.amazonaws.com/0/48232/569c84e8-fa23-8a20-3731-cd1738e456d3.jpeg)

## 4. [US] VPNコネクション(VPNC)の作成
- 作成済みのCGWとVGWを紐づけるVPNCを作成
![⑤VPNC.jpg](https://qiita-image-store.s3.amazonaws.com/0/48232/a03ddf7c-d5f6-814e-6b10-6e4d73dcc9ac.jpeg)

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

## 5. [SG] Windowsサーバの設定
- 役割(Roles)の追加：「ネットワーク ポリシーとアクセス サービス」＆「リモートアクセス」
![⑥役割.jpg](https://qiita-image-store.s3.amazonaws.com/0/48232/5ea98984-dac7-12e1-c1cc-7a1f77479cba.jpeg)

- 役割サービスの設定：NPS
![⑦NPS.jpg](https://qiita-image-store.s3.amazonaws.com/0/48232/20bc9030-0f68-a4f2-1022-f6a0c429b21a.jpeg)

- 役割サービスの設定：RAS
![⑧RAS.jpg](https://qiita-image-store.s3.amazonaws.com/0/48232/535ef745-c6bd-504b-d0fe-7165bb324533.jpeg)

- 役割サービスの設定：IIS (デフォルトのママでOK)
![⑨IIS.jpg](https://qiita-image-store.s3.amazonaws.com/0/48232/c403eadd-4252-36f7-651a-eccfe8e8b36f.jpeg)

## 6. [SG] リモートアクセスサーバの設定・有効化(Windows)
- リモートアクセス設定①
![⑩リモートアクセス設定①.jpg](https://qiita-image-store.s3.amazonaws.com/0/48232/cecd3280-173b-dff6-6272-ae8222a1f09a.jpeg)

- リモートアクセス設定②
![⑪リモートアクセス設定②.jpg](https://qiita-image-store.s3.amazonaws.com/0/48232/03af1509-4717-aedf-16a2-192739c35db8.jpeg)

- リモートアクセス設定③
![⑫リモートアクセス設定③.jpg](https://qiita-image-store.s3.amazonaws.com/0/48232/a4c7c612-3ec2-2f22-2ada-1830ac817f25.jpeg)

- リモートアクセス設定④
![⑬リモートアクセス設定④.jpg](https://qiita-image-store.s3.amazonaws.com/0/48232/b0b8f917-c19d-96e4-ee39-3b1714242af4.jpeg)

- リモートアクセス設定⑤
![⑭リモートアクセス設定⑤.jpg](https://qiita-image-store.s3.amazonaws.com/0/48232/3b55b270-6b86-be10-1232-421961da1a26.jpeg)

## 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コマンドを実行

```Ruby:トンネル(正)用
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
```
```Ruby:トンネル(副)用
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で、下記画面のレジストリが追加されていることを確認：
![⑮regedit.jpg](https://qiita-image-store.s3.amazonaws.com/0/48232/b78ea7d5-a6b6-6109-86d9-0abc8a5b16d2.jpeg)

## 8. [SG/US] 疎通確認
```ruby: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
```
```ruby: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**[①](http://qiita.com/t11a/items/9d732ae647ed878e4625)/[②](http://dev.classmethod.jp/etc/aws-vpc-vpn-nat-traversal/)でやってみたひ。