[AWS] 積年の夢の終焉...？：リージョン間VPN接続 (powered by VyOS 1.1.7)

# プロローグ
[[AWS] 積年の夢の実現：リージョン間VPN接続 (powered by SoftEther)](http://qiita.com/coga2000/items/668081e6e42ce313d32c)
[[AWS] 積年の夢の続き：リージョン間VPN接続 (powered by Windows Server 2012 R2)](http://qiita.com/coga2000/items/41edef9b7dee2f997a1a)
と歩を進めてきた、**三部作**（勝手に後付け♪）のファイナルw VyOS編。

- VyOSがSoftEther/Windowsより優れているのは、VPN Connection接続（**下記【a】**）もPeer-to-Peer接続（**下記【b】**）もMobileアプリからのL2TP/IPSec接続（**下記【c】**）も可能なこと（と思っている）。
    ⇒SoftEtherは【a】不可、Windowsはそりゃ頑張ればナンでもできるでしょうが。。
![OVERVIEW_20170516.jpg](https://qiita-image-store.s3.amazonaws.com/0/48232/f7b766f1-8f30-a60b-ad1d-9fd25cd84397.jpeg)

- 。。。と思っていたところ、VPN ConnectionでVyOS(Vyatta)用のconfigをDLできなくなった？？？一昔前はできたはず...(・・;)
  ⇒なんと、**RegionによってVPNCがサポートしているルータが異なる**ことを発見!!（VyOS(Vyatta)は、N.Virginiaにはあるが、N.Californiaにはない、といった具合）

- 半面、VyOSのDisadvantageは、学習コストが（少なくともCCNAしか持っていないヲレには）高い、という点か。
    ※SoftEtherもWindowsも、自動化とか欲張らなければ、GUIでも設定可能
    - といいつつ、VyOSもLinuxベース（vbash？）なので、そこまではぢめまして感はなく。
    - 「configure～commit/save」は、Cisco IOSの「configure terminal」と似ていると感じたよ。
    - その後、VyOSも、接続するまでなら、~~そんなに敷居が高くない（低くはない）~~ことを識る（いわゆる「知らないから怖い」＆「食わず嫌い」）
    
⇒いや、**やはりVyOSの敷居は高かった**。。。CentOS等と似て非なり。Cisco IOSと非なりて似る。

# 構成オプション、どん！
VyOSは、様々なインストール方法・様々なVPN接続方法がある（♬そしてワタシはツブされる...(@_@)）

- **VyOSインストール方法**：
　【1】 AWSのAMIを利用してEC2インスタンスとして作成
　【2】 オンプレミスにVirtualBox上に仮想マシンとして作成
　【3】 VirtualBox上のDockerホストにてDockerコンテナとして作成[【Dockerでルータをコンテナ化してみた】](http://kurochan-note.hatenablog.jp/entry/2015/10/05/130927)） 
　【4】 あらゆるDockerホストにてDockerコンテナとして動作
　　　　⇒ そしてマルチクラウドへ。。。（[【VyOSを使ってSoftLayerとAWSをIPSecVPN接続】](https://www.creationline.com/lab/5675)）

- **VPN接続方法**：
　【a】 AWSのCustomer Gateway(**CGW**)/VPC Connection(**VPNC**)/Virtual Private Gateway(**VGW**)を利用 [[①](http://qiita.com/t11a/items/9d732ae647ed878e4625)/[②](http://dev.classmethod.jp/server-side/network/vyos-aws/)/[③](http://dev.classmethod.jp/event/soracom-door/)]
　【b】 VyOS同士の直接接続（Site-to-Site接続）[[①](http://qiita.com/khayama/items/c63d4d5f02abdf348889)]
　【c】 Windows10やAndroidから接続（Point-to-Site接続） [[①](http://freebsd.fkimura.com/VyOS-b0.html)/[②](http://qiita.com/w2-yamaguchi/items/bfbdb6a7db465cbc498e)]


## 【1】AMIを利用してEC2インスタンスとして作成
- VyOS AMIのビルトインユーザは、「ec2-user」でなく「vyos」
- rootユーザにパスワードを設定。。。passwdコマンドではできない。。。！？**【保留中】**
- ~~ログインユーザ作成~~**【保留中】**

```
$ configure
# set system login user 《管理者ユーザ》 authentication plaintext-password 《管理者ユーザのパスワード》
# commit
# save
# exit
```

- ~~「vyos」の公開鍵を、《管理者ユーザ》にコピー~~**【保留中】**

```
$ sudo cp /home/vyos/.ssh/authorized_keys /home/《管理者ユーザ名》/.ssh/
```


- ~~ビルトインユーザ「vyos」削除~~  ※「vyos」以外のユーザでログインし直した上で
⇒**【保留中】**VyOSサーバを再起動したら、作成した管理者ユーザでSSHログインできなくなった (・・;)

```
$ configure
# delete system login user vyos
# commit
# save
# exit
```

- 2枚目のENI(Private側)にプライベートIPアドレスをアサイン

※EC2を作成するCloudFormationにおいて、Public側ENIをIndex0、Private側ENIをIndex1と指定済み
OR
※ENI 1枚挿しのEC2インスタンスを起動した後で、2枚目ENIを手動でAttach済み

```
$ configure
# set interfaces ethernet eth1 address '10.100.12.100/24'
# commit
# save
# exit
$ sudo ifconfig
《eth1にプライベートIPアドレス「10.100.12.100」が割り当たっていることを確認》 
```
※ifconfigやroute等のNW系コマンドは**rootでのみ実行可能**

## 【1】を使ってAWS上で【a】でツナぐずら
（韓国(KR)のVyOSサーバと、USのVGWをVPN Connectionで接続）

- 【US】VyOSサーバ持つEIPを使って、CSGを作成
    - BGPのAS番号を「65000」と指定
    
- 【US】VPCとVPNCを作成
    - VPCのRouteTableにおいて「Propagated=yes」
    ⇒KRへのルーティング情報が、VGW経由で、US側のRouteTableに動的に追加されるようになる！

- 【US】VPNCから「VyOS用config」をDL・・・少なくとも「N.Virginia」なら可能
- 【KR】「VyOS用config」の一部を手動で書き換え：
    - local-address
        - VyOSサーバの**パブリック側**の**プライベートIPアドレス**（10.100.11.100）に書き換え
        （**NAT-T**を利用するため、EIPではなくてプライベートIPアドレスと理解）
    - BGPのアドバタイズ情報
        - 10.100.11.0/24, 10.100.12.0/24
        - この**BGPアドバタイズが中々できずにハマる**。。。「10.100.12.0/24」をVyOSが認識していないためと推理（後述）
- 【KR】「VyOS用config」を投入!!
    - AWSからDLしたスクリプトを一部書き換え後に愚直に実行すると、BGPアドバタイズの行で「Already exists」のエラーが発生★ そりゃそうなので無視～
- 【KR】BGPアドバタイズ情報の追加

```
$ configure
# set protocols static route 10.100.12.0/24 next-hop 10.100.12.1
# set protocols bgp 65000 network 10.100.12.0/24
# commit
# save
# exit
```
[【とっても素敵な参考情報】BGPアドバタイズするネットワーク設定の追加](http://dev.classmethod.jp/server-side/network/vyos-aws/)

- 【US】ルーティング情報の確認
    - VGWのTunnel(2本)がUpしていることを確認
    - KR側のVPCサブネットに関するルーティング情報が、BGPによって動的にUS側RouteTableに反映されていることを確認する。

- 【KR】疎通確認
①KR側のVyOSサーバからUS側にPingを送って確認

```
vyos@VyOS-AMI:~$ ping 172.16.12.200 interface 10.100.11.100
PING 172.16.12.200 (172.16.12.200) from 10.100.11.100 : 56(84) bytes of data.
64 bytes from 172.16.12.200: icmp_req=1 ttl=254 time=196 ms
64 bytes from 172.16.12.200: icmp_req=2 ttl=254 time=196 ms
64 bytes from 172.16.12.200: icmp_req=3 ttl=254 time=196 ms
・・・
```

⇒**VyOS上の送信IF(Public側)を明示的に指定**する必要がある模様

②KR側のプライベートEC2からUS側にPingを送って確認

```
ping 172.16.12.200
```

- 【US】疎通確認
    - US側からKR側にPingを送って確認

# 【閑話休題】BGPアドバタイズでハマった考察
疎通できた後で振り返ってみれば単純なことだが、めっちゃハマったのは、**BGPによる動的ルーティング情報交換**。

1. VyOS EC2の2枚目のENIの(プライベート)IPアドレスが、いつの間にか外れていた...
⇒最初ifconfigで設定していたから、再起動中に消失？VyOS設定「set interfaces ethernet eth1 address～」なら永続的？

2. VyOSサーバに対して、KR側プライベートサブネットへのStatic Routeが必要だった。
⇒これは...自力では思いつかない...
[【再掲】BGPアドバタイズするネットワーク設定の追加](http://dev.classmethod.jp/server-side/network/vyos-aws/)

3. BGPのルーティング情報伝達(コンバージェンス？)に、設定投入～環境反映の間のタイムラグがある？
⇒KR側のVyOSへのBGP設定投入後、US側のVGWからRouteTableへの伝達に少し時間がかかることを知らず、設定ミスだと思いこんでいた...

## 【2】オンプレミスのVirtualBox上に仮想マシンとして作成

VyOSは、一般的には[ISOファイル](http://packages.vyos.net/iso/release/1.1.7/)で提供されているのか（AWSならAMIで提供）。
ISOファイルをDLし、VirtualBoxの起動時の「Optical Device」として指定してあげると、VyOSのインストールプロセス開始☆
（**格闘中**...）

## 【1】と【2】を【b】でツナぐもな
（オンプレミスのVirtualBox仮想マシンと、VyOS-EC2を、VyOS機能で直接通信）

## 【1】と【3】を【c】でツナぐだなも
（Windows10/Android端末と、VyOS-EC2を、IPSec/L2TPで通信）

# エピローグ
AWSリージョン間接続について、SoftEther/Windows/VyOSをひととおりやってみた。
まだまだ試したいこと・課題はあるけど、ひとまずおなかいっぱい。