[AWS] 積年の夢の実現：リージョン間VPN接続 (powered by SoftEther)

# 免責
本記事の内容は、件名に関する自分用の備忘録です♪
その他は[ココ](http://qiita.com/coga2000/items/0b4fc853a87dc314d722)の「はじめに」に準じます。
一応接続実績はあるので『ココはどうやっとんじゃい』とかあったら、気軽にコメントください！
ただ、まだ「**課題**」がある（後述）ので、採用するかどうかは**自己判断**でお願いしますm(_ _)m

# 実現したこと
AWS上のプライベートサブネット内（パブリックIPアドレスを持たない）EC2に対して、
(A) **クライアントPC**からVPN接続（L2TP/IPsec）経由でSSHログイン
(B) **別リージョンのEC2**からVPN接続（L2TP/IPsec）経由でSSHログイン
※下記が概要図（今後もう少し絵心を込める予定）：
![20170318.jpg](https://qiita-image-store.s3.amazonaws.com/0/48232/bdddc904-66da-ba6a-9414-db3899ea0982.jpeg)
※早速図に間違いがありました (-_-;) オンプレミスにはSoftEtherクライアントは不使用、Windows10/Android標準のL2TP/IPsecクライアントを使用（むしろ、そのためにL2TP/IPsecを選択したのでした★）

# 構築手順
≪**課題**以外、ひとまず執筆完了!!≫
1. AWS環境の構築
2. SoftEther VPNサーバのインストール
3. SoftEther管理ツールのインストール
4. SecureNATの設定
5. 2台のVPNサーバ間でのカスケード接続設定
6. SoftEther VPNクライアントのインストール
7. 別リージョンにある2台のVPNクライアント間での疎通確認
8. Windows10/AndroidからのL2TP接続設定

## 1. AWS環境の構築
**■設定値■**

- VPC CIDR (Tokyo)：172.16.0.0/16
    - パブリックサブネット①CIDR：172.16.0.0/24 
        - パブリックEC2パブリックENI①-1：172.16.0.100/32
        - パブリックEC2プライベートENI①-2：172.16.1.100/32
    - プライベートサブネット①CIDR：172.16.1.0/24
        - プライベートEC2プライベートENI①-3：172.16.1.200/32

- VPC CIDR (Singapore)：172.19.0.0/16
    - パブリックサブネット②CIDR：172.19.0.0/24
        - パブリックEC2パブリックENI②-1：172.19.0.100/32
        - パブリックEC2プライベートENI②-2：172.19.1.100/32
    - プライベートサブネット②CIDR：172.19.1.0/24
        - プライベートEC2プライベートENI②-3：172.19.1.200/32

※パブリックEC2は、ENI×2枚差し♡

## 2. SoftEther VPNサーバのインストール
下記サイトの「**VPNサーバ設定**」の章より分り易くは書けませんw
[EPISODE 02：AWS EC2にL2TP VPNを設定する](http://www.episode02.com/entry/2017/02/24/053500)
※VPNサーバのソースコードをDLするwgetコマンド：

```
wget http://jp.softether-download.com/files/softether/v4.20-9608-rtm-2016.04.17-tree/Linux/SoftEther_VPN_Server/64bit_-_Intel_x64_or_AMD64/softether-vpnserver-v4.20-9608-rtm-2016.04.17-linux-x64-64bit.tar.gz
```
※vpnseverを（/usr/localでなく）/opt下に配置する場合、init.dスクリプト内の絶対パスを書き直す点にだけ注意。
※ポート4500番＆500番は、tcpでなくudpな点にハマりがち。
※Default仮想Hubは絶対に削除すべき！管理者パスワードはオイラでも知っている。

**■設定値■**
- インストール先：/opt
- VPN管理者名(とそのパスワード)：(任意)
- 仮想Hub名：AWSVHub
- IPSec-VPN事前共有鍵(Pre-Shared-Key)：(任意)

```
# ./vpncmd
vpncmd コマンド - SoftEther VPN コマンドライン管理ユーティリティ
SoftEther VPN コマンドライン管理ユーティリティ (vpncmd コマンド)
Version 4.20 Build 9608   (Japanese)
Compiled 2016/04/17 21:59:35 by yagi at pc30
Copyright (c) SoftEther VPN Project. All Rights Reserved.

vpncmd プログラムを使って以下のことができます。

1. VPN Server または VPN Bridge の管理
2. VPN Client の管理
3. VPN Tools コマンドの使用 (証明書作成や通信速度測定)

1 - 3 を選択: 1

接続先の VPN Server または VPN Bridge が動作しているコンピュータの IP アドレスまたはホスト名を指定してください。
'ホスト名:ポート番号' の形式で指定すると、ポート番号も指定できます。
(ポート番号を指定しない場合は 443 が使用されます。)
何も入力せずに Enter を押すと、localhost (このコンピュータ) のポート 443 に接続 します。
接続先のホスト名または IP アドレス: (空欄)

サーバーに仮想 HUB 管理モードで接続する場合は、仮想 HUB 名を入力してください。
サーバー管理モードで接続する場合は、何も入力せずに Enter を押してください。
接続先の仮想 HUB 名を入力: (空欄)
VPN Server "localhost" (ポート 443) に接続しました。

VPN Server 全体の管理権限があります。

VPN Server>HubCreate
VPN Server>HubDelete DEFAULT
VPN Server>Hub AWSVHub
VPN Server/AWSVHub>UserCreate
VPN Server/AWSVHub>UserPasswordSet
VPN Server/AWSVHub>IPSecEnable
IPsecEnable コマンド - IPsec VPN サーバー機能の有効化 / 無効化
L2TP over IPsec サーバー機能を有効 (yes / no): yes
Raw L2TP サーバー機能を有効 (yes / no): no
EtherIP / L2TPv3 over IPsec サーバー機能を有効 (yes / no): no
IPsec 事前共有鍵の文字列 (9 文字以下を推奨): (Pre-Shared-Key)
HUB 名: (空欄)
コマンドは正常に終了しました。
VPN Server/AWSVHub>SecureNATEnable
SecureNatEnable コマンド - 仮想 NAT および DHCP サーバー機能 (SecureNAT 機能) の有効化
コマンドは正常に終了しました。
VPN Server/AWSVHub>Exit
#
```

## 3. SoftEther管理ツールのインストール
これは、SoftEtherサーバ/クライアントの設定のうち、vpncmdではなくGUIで設定するために、Windows端末にインストールするもの（vpncmdでも設定可能だとは思いますが...）
なんのことはなく、下記リンクからDLしてWindowsにインストール：

[SoftEther VPN Server and VPN Bridge (Ver 4.20, Build 9608, rtm)](http://jp.softether-download.com/files/softether/v4.20-9608-rtm-2016.04.17-tree/Windows/SoftEther_VPN_Server_and_VPN_Bridge/softether-vpnserver_vpnbridge-v4.20-9608-rtm-2016.04.17-windows-x86_x64-intel.exe)
※2017年4月時点で安定版の最新版


## 4. SecureNATの設定
**ここが肝っぽい**。管理ツール(GUI)から設定。
■VPNサーバ(Tokyo)の設定■
- SecureNAT仮想ホスト：192.168.30.**100**/24
- DHCPサーバ割り当てるIPアドレスの範囲：192.168.30.**10**/24～192.168.30.**99**/24 
- クライアントに割り当てるオプションの設定：（敢えての空欄）
■VPNサーバ(Singapore)の設定■
- SecureNAT仮想ホスト：192.168.30.**200**/24
- DHCPサーバ割り当てるIPアドレスの範囲：192.168.30.**101**/24～192.168.30.**199**/24 
- クライアントに割り当てるオプションの設定：（やはり敢えての空欄）

※Tokyoを「192.168.**30**.0/24」、Singaporeを「192.168.**31**.0/24」と設定していた時は疎通できずハマっていた。。。


## 5. 2台のVPNサーバ間でのカスケード接続設定
これも管理ツール(GUI)から設定。
**どちらか一方のVPNサーバから、他方のVPNサーバに対して設定**する。
（双方向で設定する必要はない）
ここでは、「Singaporeの仮想Hub」に対して「Tokyoの仮想Hub」へのカスケード接続を設定。

## 6. SoftEther VPNクライアントのインストール
※今回の構成だと、~~プライベートEC2におけるSoftEtherクライアントのソースコードDLをインターネット経由できないので、一時的にEIP付与＆Internet-GWへのルーティング投入が必要！~~
⇒VPCサーバをNATサーバにし、プライベートサブネットからのデフォルトルートをNATサーバにすることで、インターネット接続も可能にできました！

①ソースコードのダウンロード～コンパイル

```
# cd /opt
# wget http://jp.softether-download.com/files/softether/v4.20-9608-rtm-2016.04.17-tree/Linux/SoftEther_VPN_Client/64bit_-_Intel_x64_or_AMD64/softether-vpnclient-v4.20-9608-rtm-2016.04.17-linux-x64-64bit.tar.gz
# tar xvfz softether-vpnclient-v4.20-9608-rtm-2016.04.17-linux-x64-64bit.tar.gz
# cd ./vpnclient
# make
```

②クライアントプロセス起動

```
# ./vpnclient start
```

③CLI起動～設定

```
# ./vpncmd
vpncmd command - SoftEther VPN Command Line Management Utility
SoftEther VPN Command Line Management Utility (vpncmd command)
Version 4.20 Build 9608   (English)
Compiled 2016/04/17 21:59:35 by yagi at pc30
Copyright (c) SoftEther VPN Project. All Rights Reserved.

By using vpncmd program, the following can be achieved.

1. Management of VPN Server or VPN Bridge
2. Management of VPN Client
3. Use of VPN Tools (certificate creation and Network Traffic Speed Test Tool)

Select 1, 2 or 3: 2

Specify the host name or IP address of the computer that the destination VPN Client is operating on.
If nothing is input and Enter is pressed, connection will be made to localhost (this computer).
Hostname of IP Address of Destination: (空欄)

Connected to VPN Client "localhost".

VPN Client> NicCreate
VPN Client> AccountCreate
VPN Client> AccountPasswordSet
VPN Client> AccountConnect
VPN Client> Exit
#
```

④DHCP(SecureNAT)によるIPアドレス割り当て

```
# /sbin/dhclient vpn_vnic0
```

⑤仮想NICに、DHCP(SecureNAT)が払い出したIPアドレスが割り当たっていることを確認

```
# ifconfig vpn_vnic0
```

⇒「vpn_nic0: 192.168.30.x/32」とかが割り当たっていればOK
※今のところ、②/③(AccountConnectだけ)/④/⑤の手順は、EC2を再起動する度に手動実行する必要がある...（②は自動化できそうだが）

## 7. 別リージョンにある2台のVPNクライアント間での疎通確認
ICMP(Ping)とSSHで疎通確認

```ruby:VPNクライアント①⇒②【ICMP】
$ ping 192.168.30.101
PING 192.168.30.101 (192.168.30.101) 56(84) bytes of data.
64 bytes from 192.168.30.101: icmp_seq=1 ttl=255 time=75.9 ms
64 bytes from 192.168.30.101: icmp_seq=2 ttl=255 time=76.1 ms
64 bytes from 192.168.30.101: icmp_seq=3 ttl=255 time=76.4 ms
64 bytes from 192.168.30.101: icmp_seq=4 ttl=255 time=75.6 ms
64 bytes from 192.168.30.101: icmp_seq=5 ttl=255 time=76.2 ms
64 bytes from 192.168.30.101: icmp_seq=6 ttl=255 time=76.3 ms
64 bytes from 192.168.30.101: icmp_seq=7 ttl=255 time=77.4 ms
64 bytes from 192.168.30.101: icmp_seq=8 ttl=255 time=76.5 ms
64 bytes from 192.168.30.101: icmp_seq=9 ttl=255 time=76.4 ms
・・・
```

⇒Tokyo→Singapore間で平均80msくらい

```ruby:VPNクライアント②⇒①【ICMP】
$ ping 192.168.30.10
PING 192.168.30.10 (192.168.30.10) 56(84) bytes of data.
64 bytes from 192.168.30.10: icmp_seq=1 ttl=255 time=152 ms
64 bytes from 192.168.30.10: icmp_seq=2 ttl=255 time=76.4 ms
64 bytes from 192.168.30.10: icmp_seq=3 ttl=255 time=76.8 ms
64 bytes from 192.168.30.10: icmp_seq=4 ttl=255 time=77.8 ms
64 bytes from 192.168.30.10: icmp_seq=5 ttl=255 time=76.5 ms
64 bytes from 192.168.30.10: icmp_seq=6 ttl=255 time=76.8 ms
64 bytes from 192.168.30.10: icmp_seq=7 ttl=255 time=76.7 ms
64 bytes from 192.168.30.10: icmp_seq=8 ttl=255 time=76.4 ms
64 bytes from 192.168.30.10: icmp_seq=9 ttl=255 time=76.3 ms
・・・
```
⇒Singapore→Tokyo間で平均80msくらい

- VPNクライアント①⇒②【SSH】
⇒Tokyo→Singapore間でできました！
- VPNクライアント②⇒①【SSH】 
⇒Singapore→Tokyo間でできました！

※EC2に割り当てているSecurityGroupの設定とは関係なくこれらは疎通します。トンネルしているため。
※**2017年3月時点の設定のママで、2017年4月に再度疎通確認したら、パケット欠落がなくなりました！！！。。。？？？**


## 8. Windows10/AndroidからのL2TP接続設定
ここまで疎通できてしまえば、Windows10/Androidからは楽勝で接続可能。標準機能です。

※勿論、iOSからも標準機能で接続可能w

# 課題
1. VPNサーバが稼働しているEC2に対してPingを実行すると「DUP!!」が発生...!?
⇒**※2017年3月時点の設定のママで、2017年4月に再度疎通確認したら、DUPがなくなりました！！！。。。？？？**

2. 同Pingにおいて、かなりの頻度でパケットの欠落が発生...!?
⇒**※2017年3月時点の設定のママで、2017年4月に再度疎通確認したら、パケット欠落がなくなりました！！！。。。？？？**

3. VPNクライアントは、EC2を再起動する度に**手動**で起動する必要がある...!?
4. AWSの発行した/etc/resolv.confが、dhclientコマンド発行時に上書きされている...その影響は!?
5. プライベートサブネット内のEC2からはインターネットにアクセスできていない。
（NATインスタンスやNAT-Gatewayで解決デキる）
6. 1台のVPNクライアントを踏み台としたEC2間の通信（下図（は作成中））
7. WindowsサーバとのVPN接続（これは多分デキる）
8. 3拠点間のVPN接続
9. 他クラウド（Azure/GCP）とのVPN接続

# 参考情報
1. [AWSとソフトウェアVPN](http://xp-cloud.jp/blog/2014/11/26/343/) ・・・AWSはL2接続ができない（プロミスキャスモードが利用不可）
2. [拠点間接続 VPN の構築](https://ja.softether.org/4-docs/1-manual/A/10.5) ・・・VPNサーバのカスケード接続
3. [EPISODE 02：AWS EC2にL2TP VPNを設定する](http://www.episode02.com/entry/2017/02/24/053500)・・・VPNサーバ設定
4. [AWSとソフトウェアVPN(4) – SoftEther のクライアント接続：AWS側設定編](http://xp-cloud.jp/blog/2015/03/06/385/)・・・VPNクライアント設定
5. [SoftEtherダウンロードサイト](http://www.softether-download.com/ja.aspx?product=softether)