VyOSでVPN接続

# ◎ はじめに
・顧客オンプレミス環境とAWS VPCをVPN接続するという案件があり、
その案件に着手する前にVPN接続をおさらいしようと思い、自身の環境で確認してみました。

検証に際して、オンプレミス側ルータをどうしたものかと迷っていましたが、
ソフトウェアルータVyattaを試してみたいと考えていたことを思い出し、そちらを利用し同じAWSアカウント内で検証環境を作ってみました。

![VPN Connection.png](https://qiita-image-store.s3.amazonaws.com/0/50310/80f5f576-20e3-be9d-4078-71df237d2d67.png)

# ◎ 今回の目標
・主な目的は上述のとおりですが、今回は検証ということで
<b>Tokyo Region</b>のVPC内Windows Server と 
<b>London Region</b>のVPC内Windows Server が VPN経由でRDP接続出来るようしてみました。
ちなみに<b>London側がオンプレ(Customer Gateway配置)を想定</b>という構成になります。

![VPC間VPN.png](https://qiita-image-store.s3.amazonaws.com/0/50310/b0ec249b-6579-3677-92f9-52313cb318b9.png)

<div class="center">
    <p>想定構成図</p>
</div>

# ◎ 検証環境
- Windows_Server-2016 (Tokyo、Londonともに)
- VyOS version 1.1.7 (公式安定版とのことより)

▽備考
・VPCおよびSubnetの設定はほぼほぼデフォルト

## ◎◎ VyOSとは
■概要
https://wiki.vyos.net/wiki/ の [日本語版](http://wiki.vyos-users.jp)より引用
> VyOSは、Vyattaから派生したオープンソースのネットワーク・オペレーティング・システムで、ソフトウェアベースのルーティング、ファイアウォール、VPNなどの機能を提供します。

大雑把に言えば、買収後VyattaはVyOSと名称を変えリリース継続しているとのこと。
そんなことも知らずにインフラ・エンジニア名乗っている私。。反省。

![VyOS.png](https://qiita-image-store.s3.amazonaws.com/0/50310/60ed809c-9728-300f-0d6f-03c7d443096b.png)

・そんなわけで
上述のサイトをざっと読んだところ、名称は違えど基本的にソフトウェアルータ機能があることは変わらず、 [AWS Market Place](https://aws.amazon.com/marketplace/pp/B00JK5UPF6#)ではVyOSを含んだAMIが発売され EC2をサポートしているとのこと。そして、AWS VPNのConfiguration一覧にVyattaとあることより、そのまま使えそうと思いCustomer Gateway(ルータ)としてVyOSを利用してみました。

# ◎ 参考資料
- [AWS Black Belt Online Seminar 2017 Amazon VPC - SlideShare (2017/04/12)]
(https://www.slideshare.net/AmazonWebServicesJapan/aws-black-belt-online-seminar-2017-amazon-vpc)

- [(AWSブログ) AWS Black Belt Online Seminar「Amazon VPC」の資料およびQA公開](http://aws.typepad.com/sajp/2017/04/aws-black-belt-online-seminaramazon-vpc_slidesqa.html)

- [Amazon VPC VPN 接続設定 参考資料]
(https://d0.awsstatic.com/webinars/jp/pdf/misc/VPNConnectionInstruction-20141225.pdf)
→　シンプルに整理された資料。こちらの手順書を見ながらやれば、基本的なVPN設定は出来るかと思います。

## ◎◎ 備考
・本件を調査してみると同様の構成を試されている方がすでに沢山いらっしゃいました。
二番煎じ感は否めないですが、実装に際して困った箇所をどう対処したかを記載しましたので、そちらが参考になれば幸いです。

・同様の内容を検証していたクラスメソッドさんのblog。参考にさせて頂きました。
- [[新サービス] SORACOM Doorを試してみた](http://dev.classmethod.jp/event/soracom-door/)
- [VyOSをAWSで使う時によくやることをまとめてみた](http://dev.classmethod.jp/server-side/network/vyos-aws/)


# ◎ 実装
## 01. VPCおよびSubnetの定義
・Tokyo側はVPC 「10.0.0.0/16」
そこにSubnet 「10.0.1.0/24」 と 「10.0.2.0/24」を切っています。

・London側はVPC 「172.31.0.0/16」
そこにSubnet 「172.31.0.0/20」 と 「172.31.16.0/20」となっています。
こちらはデフォルトVPC/Subnetとなり、東京側と被っていなかったためそのまま使用しました。

■補足
・障害時Remoteから操作することを考え、全てPublic Subnetとしています。その代わりSecurity Groupでアクセス制限をキッチリやっています。

## 02. Windows Server用意
### 02-1. Launch
・特に拘りはなかったため、Launch時に選択出来る AMI 「Microsoft Windows Server 2016 Base」から、Windows Serverを両regionに起動しました。

### 02-2. Security Group設定
・対向からRDP接続出来るようにSecurity Groupを設定
※疎通確認のため、pingも許可しています。

// 東京側
![WinServer-Tokyo_SecG.png](https://qiita-image-store.s3.amazonaws.com/0/50310/d026b1e8-5039-64c3-ad29-25d33629d3be.png)

// London側
![WinServer-London_SecG.png](https://qiita-image-store.s3.amazonaws.com/0/50310/b3814a08-f820-4884-9ef7-37b517d613f7.png)


### 02-3. Firewall設定(任意)
・疎通確認のため両インスタンス間でpingを実行する場合、FirewallにてICMP疎通許可を設定する必要があります。

・設定手順
[ServerManager] - [Local Server] - [Windows Firewall]
[Advanced Settings] - [Inbound Rules] - [File and Printer Sharing (Echo Request - ICMPv4-In)] → [Enable Rules]
※ Remote Desktop関連はデフォルトで許可されているため、設定の必要はありませんでした。

<img width="944" alt="WindowsServer_FW設定01.png" src="https://qiita-image-store.s3.amazonaws.com/0/50310/29d2724f-6294-b6cf-b57b-1854f63a3fb2.png">

↓

<img width="1166" alt="WindowsServer_FW設定02.png" src="https://qiita-image-store.s3.amazonaws.com/0/50310/d4eb30ef-8b67-f295-27e1-871293464910.png">

## 03. オンプレミス側ルータ(VyOS, Customer Gateway)の準備
### 03-1. Customer Gateway launch
・AWS Marketplace にて「VyOS」で検索
VyOS最新版(安定)1.1.7のAMI(Linux)からEC2 Launch
→ 一応、本番時を想定してグローバルIP(EIP)を付与しました。

### 03-2. 送信元/送信先チェックを無効にする
・パケットを透過させる必要があるため、該当機能を無効にします。
設定方法等は下記公式ドキュメントを参照下さい。

・公式ドキュメントより[送信元/送信先チェックを無効にする](http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/VPC_NAT_Instance.html#EIP_Disable_SrcDestCheck)

![Disable Source:Destination Check.png](https://qiita-image-store.s3.amazonaws.com/0/50310/9329473f-633e-f90c-0e6f-962e630d4c87.png)

### 03-3. Security Group設定
★ココでハマりました。
・VPNの設定が全て完了後、本インスタンスのSecurity Groupは何も設定していなくとも
東京からLondon(Customer GW)側の各インスタンスへの疎通が出来るのに対し、逆の通信が出来なかったからです。

対処としては、Customer GW側のインスタンスが対向のインスタンスと疎通出来るよう、
本インスタンスのSecurity Groupを解放する必要がありました。

![Customer GW-London_SecG.png](https://qiita-image-store.s3.amazonaws.com/0/50310/1a370d2a-07aa-05d5-9c3f-2333b408283f.png)

## 04. VPN設定
### 04-1. Route Tableの設定
Routing先が決まったので、下記のように設定しました。
シンプルな内容としています。

// 東京側
![RouteTable-Tokyo.png](https://qiita-image-store.s3.amazonaws.com/0/50310/5522eb6f-d517-91df-bf73-711e9034244f.png)

// London側
![RouteTable-London.png](https://qiita-image-store.s3.amazonaws.com/0/50310/f4cbf374-d6ce-6d8f-a2b3-ef09331ef2d4.png)

### 04-2. Virtual Private Gatewayの設定
・AWSコンソールにて [Services] - [VPC]より、ボタンをポチポチとやって作成。その後該当VPCにアタッチします。

![Virtual Private Gateway.png](https://qiita-image-store.s3.amazonaws.com/0/50310/63536833-12fd-60dc-17b3-fbd159913bed.png)

### 04-3. VPN Connectionの設定
・こちらもAWSコンソールよりCreateします。
設定値は後述のとおり。今回はstaticではなくBGPを利用してみました。

```
Name: vpcconn-tokyo2london
Virtual Private Gateway: <先に作成したものを選択>
Customer Gateway: [New] を選択 ※Customer Gatewayはこの時点でも作成可能
IP Address: <Customer GatewayのパブリックIP(EIP)設定>
BGP ASN: 65000 ※今回はデフォルト値を利用しました
Routing Options: Dynamic
```

### 04-4. Customer Gateway Configuration
・VPN Connection作成後、Customer Gateway(ルータ)のConfigurationがダウンロード出来るようになります。

・ダウンロードに際して指定したルータ情報は下記

```bash
- Vendor: Vyatta
- Platform: Vyatta Network OS
- Software: Vyatta Network OS 6.5+
```
※該当configにVyOSという項目はありませんでしたが、互換性があるようで流用することができました。

・config一部修正
→ サイト間接続設定のCustomer Gatewayの宛先を<b>Public IPから Private IP</b>に修正

```
set vpn ipsec site-to-site peer 13.112.136.118 local-address '172.31.20.174'
set vpn ipsec site-to-site peer 54.178.173.158 local-address '172.31.20.174'
```

### 04-5. VyOSの設定
・まずはSSHログイン。デフォルトのユーザは `vyos` 

```bash
% ssh -i ***.pem vyos@<Customer GW のEIP>
```

・設定モードに切り替え、取得したconfigを流し込む

```bash
vyos@VyOS-AMI:~$ configure
vyos@VyOS-AMI#
[edit]

(上記で取得したコンフィグを流し込む ※)

・変更のコミットおよび設定保存後、設定モードを終了
vyos@VyOS-AMI# commit

vyos@vyos# save
Saving configuration to '/config/config.boot'...
Done
vyos@vyos# exit
```
※注: AWS Consoleより取得したConfigをコメント欄も含めて流し込むと途中で可笑しくなったため、set行のみ流し込むようにしました。

### 04-6. VPN Connectionの状態確認

・コマンドラインより Route Tableの状態確認
→ 対向からルーティング情報を取得出来ていることを確認

```
vyos@VyOS-AMI:~$ show ip route
Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,
       I - ISIS, B - BGP, > - selected route, * - FIB route

S>* 0.0.0.0/0 [210/0] via 172.31.16.1, eth0
B>* 10.0.0.0/16 [20/100] via 169.254.25.77, vti1, 3d01h35m
C>* 127.0.0.0/8 is directly connected, lo
C>* 169.254.25.76/30 is directly connected, vti1
C>* 169.254.27.96/30 is directly connected, vti0
C>* 172.31.16.0/20 is directly connected, eth0
```

・コマンドラインより　IPsec SAコネクション確認
→ LinkUpしていることを確認

```
vyos@VyOS-AMI:~$ show vpn ipsec sa
Peer ID / IP                            Local ID / IP
------------                            -------------
13.112.136.118                          172.31.20.174

    Description: VPC tunnel 1

    Tunnel  State  Bytes Out/In   Encrypt  Hash    NAT-T  A-Time  L-Time  Proto
    ------  -----  -------------  -------  ----    -----  ------  ------  -----
    vti     up     8.8K/14.7K     aes128   sha1    no     2044    3600    all


Peer ID / IP                            Local ID / IP
------------                            -------------
54.178.173.158                          172.31.20.174

    Description: VPC tunnel 2

    Tunnel  State  Bytes Out/In   Encrypt  Hash    NAT-T  A-Time  L-Time  Proto
    ------  -----  -------------  -------  ----    -----  ------  ------  -----
    vti     up     8.0K/6.7K      aes128   sha1    no     1533    3600    all
```

・VPN Connectionの状態確認
→ AWSコンソール上からもLink Upしていることを確認

![VPN Connection.png](https://qiita-image-store.s3.amazonaws.com/0/50310/f4e631a5-00f0-e1b5-316d-b2287ebad8c9.png)

# ◎ 動作確認
・当初の目的どおりWindows Server間でRDP接続できることを確認

RDP接続 from Tokyo to London。 
「10.0.1.30」 -(RDP)→ 「172.31.3.159」
RDP接続を確認出来ました。
また逆の通信(London→Tokyo)も問題なく接続出来ることを確認しています。

<img width="939" alt="RDP接続成功(from Tokyo to London).png" src="https://qiita-image-store.s3.amazonaws.com/0/50310/116929f5-aa8b-fce9-315f-55f424b90b0a.png">

※ 余談
・RDP接続時の認証パスワード入力が大変。
コピペが出来ないこと。macを使っているとキーボード配列が違い記号を打つのが大変でした。
RDP接続ソフト for macを変更するなど対策方法がネット上に散見されましたが、面倒だったため地道に記号がどこにマッピングされているのか探して私は対処しました。その後は接続設定を保存すれば接続が楽になります。

# ◎おわりに
・AWSが発行したVyOS用Configを使うことで繋がったため、今回はルータconfigに関して深追いしていません。しかし、ざっと見たところ下記FAQにあるVPN接続に必要なipsec関連の必須設定がされていたことを確認しています。

[Q: Amazon VPC に接続するために、どのようなカスタマーゲートウェイ装置を使用することができますか?](
https://aws.amazon.com/jp/vpc/faqs/#C9)


以上になります。