ハードウェアVPN機能とvyattaを用いたAWS & SoftLayer多拠点間VPN接続

[前回](http://qiita.com/nmatsui/items/18080372752651fc36ba)はvyattaを用いてAWS VPCとSoftLayerをIPsec VPNで接続したが、設定が非常に煩雑だった。

そこで今回は、AWSのハードウェアVPN機能とvyattaを用い、各拠点の経路情報をBGPを用いて交換することで、なるべく簡単な手順でAWSとSoftLayerを多拠点間VPN接続する。
![aws_sl_vpn.png](https://qiita-image-store.s3.amazonaws.com/0/37648/c23d2e61-12e4-3735-2a17-dae12da79375.png)

# SoftLayerでvyatta起動
SoftLayerのvyattaインスタンスのパブリックIPを確定するために、最初にSoftLayerの東京DCとシンガポールDCでvyattaインスタンスを立ち上げる。

* OS: Vyatta 6.6 Community Edision (64bit)
* CPU: 2.0GHz 1core
* RAM: 1GB RAM

|DC|パブリックIP|パブリックサブネット|プライベートIP|プライベートサブネット|
|:--|:--|:--|:--|:--|
|東京|161.202.114.70|161.202.114.64/28|10.132.182.81|10.132.182.64/26|
|シンガポール|161.202.24.85|161.202.24.80/28|10.117.212.51|10.117.212.0/26|

# AWSシンガポールリージョンでElastic IP確保
AWSシンガポールリージョンで立ち上げる予定のvyattaインスタンス用に、使用箇所がVPCのElastic IPを一つ確保する。

今回は**52.76.38.181**が確保された。

# AWS東京リージョンでハードウェアVPN接続を立ち上げ
AWS東京リージョンでVPCを作成して仮想プライベートゲートウェイを割り当て、AWSシンガポールリージョン、SoftLayer東京DC、SoftLayerシンガポールDCとのVPN接続を設定する。

## VPC作成
VPCを作成する。CIDRは**192.168.0.0/17**とする。

![aws_softlayer_vpn01.png](https://qiita-image-store.s3.amazonaws.com/0/37648/1249d385-89b3-f7a4-b2b6-b9c98e909b85.png)

## 仮想プライベートゲートウェイを割り当て
仮想プライベートゲートウェイを作成する。

![aws_softlayer_vpn02.png](https://qiita-image-store.s3.amazonaws.com/0/37648/0ad83306-27b7-40eb-75c9-2b908e640de5.png)

先ほど作成したVPCにアタッチする。

![aws_softlayer_vpn03.png](https://qiita-image-store.s3.amazonaws.com/0/37648/c9ad7202-78e5-71c1-7af7-2dbe6de6f0f3.png)

## カスタマーゲートウェイ作成
VPN接続先のアンカーとなるカスタマーゲートウェイを、SoftLayer東京DC、SoftLayerシンガポールDC、AWSシンガポールリージョンの3拠点分作成する。BGPによる動的ルーティングを行うが、AS番号はプライベート領域（64512～65535）から重複せずに選ぶ。

|拠点|パブリックIP|AS番号|
|:--|:--|:--|
|SoftLayer東京DC|161.202.114.70|65001|
|SoftLayerシンガポールDC|161.202.24.85|65002|
|AWSシンガポールリージョン|52.76.38.181|65003|

以下はSoftLayer東京DC用のカスタマーゲートウェイの例。

![aws_softlayer_vpn04.png](https://qiita-image-store.s3.amazonaws.com/0/37648/b71d11b7-a8ab-7d88-29f8-02110124ce8b.png)

## VPN接続の立ち上げ
作成した仮想プライベートゲートウェイと３つのカスタマーゲートウェイを結びつけて、AWS東京リージョンを中心とした3つのVPN接続を立ち上げる。

以下はSoftLayer東京DCとのVPN接続の例。

![aws_softlayer_vpn05.png](https://qiita-image-store.s3.amazonaws.com/0/37648/1ae53b59-5d7b-51af-de95-d3f46a64c168.png)

AWSのハードウェアVPN機能は最初から冗長化されており、VPNトンネルは自動的に二つ作成される。ただしこの段階では対向のVPNルータが立ち上がっていないため、VPNトンネルはDOWNした状態になっている。

![aws_softlayer_vpn06.png](https://qiita-image-store.s3.amazonaws.com/0/37648/693c4399-c820-e216-9db2-b04a2e335da2.png)

## 設定ファイルのダウンロード
各VPN接続の設定情報を、vyattaのコマンド形式でそれぞれダウンロードする。

![aws_softlayer_vpn07.png](https://qiita-image-store.s3.amazonaws.com/0/37648/07d14f6c-b58b-d685-36c5-2e69badf9d10.png)

# AWSシンガポールリージョンでvyatta起動
AWSシンガポールリージョンでVPCとパブリックサブネットを作成し、vyattaインスタンスを起動して確保しておいたElastic IPを割り当てる。

## VPC作成
VPCを作成する。CIDRは**192.168.128.0/17**とする。

![aws_softlayer_vpn08.png](https://qiita-image-store.s3.amazonaws.com/0/37648/64b12f62-cd5f-e33d-c2e6-62312af08478.png)

## サブネット作成
先ほど作ったVPC内のap-southeast-1aでサブネットを作成する。CIDRは**192.168.128.0/24**とする。

![aws_softlayer_vpn09.png](https://qiita-image-store.s3.amazonaws.com/0/37648/0d7650f2-8144-ed1c-75fe-dbd3a051b665.png)

## インターネットゲートウェイの作成とアタッチ
先ほど作ったVPC内に、インターネットゲートウェイを作成し、VPCにアタッチする。

![aws_softlayer_vpn10.png](https://qiita-image-store.s3.amazonaws.com/0/37648/a80efcba-d80b-3875-3b87-761958ccb6b9.png)

![aws_softlayer_vpn11.png](https://qiita-image-store.s3.amazonaws.com/0/37648/fe386aa9-0615-5b9c-bff5-95b757592507.png)

## ルートテーブルの修正
作成したサブネットに割り当てられているルートテーブルに、**0.0.0.0/0**をインターネットゲートウェイに向けるエントリを追加する。

![aws_softlayer_vpn12.png](https://qiita-image-store.s3.amazonaws.com/0/37648/db243247-0c51-fa2f-293f-a63e7facc403.png)

## vyattaインスタンス起動
以下のスペックのインスタンスを作成したサブネットに立ち上げる。

* ami: Vyatta Core 6.6 R1 x86_64 rev1 - ami-d2b0ff80
* type: t1.micro
* IPアドレス: **192.168.128.10**

![aws_softlayer_vpn13.png](https://qiita-image-store.s3.amazonaws.com/0/37648/309bb3db-0a1c-f645-c3f7-20de9fd7e3a9.png)

### セキュリティグループ
AWS東京リージョンで作成したVPN接続のトンネル端点のIPアドレス（**103.246.151.29**と**103.246.151.39**）からのESP（IPプロトコル50）とIKE（UDPポート500）を受け入れる。またAWSとSoftLayerのプライベートIPも受け入れる。

![aws_softlayer_vpn14.png](https://qiita-image-store.s3.amazonaws.com/0/37648/c6b93594-31f4-41a2-6cea-e0ee47d8e3a0.png)

## ENIの設定変更
作成したvyattaインスタンスのENIの「送信元/送信先の変更チェック」を無効化し、パケットを転送できるようにする。

![aws_softlayer_vpn15.png](https://qiita-image-store.s3.amazonaws.com/0/37648/d6023d6b-5983-0c73-e0e7-09437b8d0436.png)

![aws_softlayer_vpn16.png](https://qiita-image-store.s3.amazonaws.com/0/37648/1ea07181-1282-0e04-bd03-4f8782fc9c89.png)

## Elastic IP割り当て
確保しておいたElastic IPを立ち上げたvyattaインスタンスのENIに割り当てる。

![aws_softlayer_vpn17.png](https://qiita-image-store.s3.amazonaws.com/0/37648/285e8e2d-47e7-febf-ca26-98622eca00a8.png)

# AWSシンガポールリージョンのvyatta設定
ダウンロードしたvyatta用設定スクリプトを元に、AWSシンガポールリージョンのvyattaを設定する。
ただし、**ダウンロードしたスクリプトをそのまま実行しても動作しない**。BGPで広報するネットワークの設定、及び各トンネルをピアリングするlocal addressを適切に変更しなければならない。

## 共通の設定
### IPsecを設定するNICの指定
唯一のNICであるeth0を指定する（スクリプトからの変更点なし）。

```text:IPsecを設定するNICの指定
vyatta@vyatta# set vpn ipsec ipsec-interfaces interface 'eth0'
[edit]
```

### IKEの設定
IKEを設定する（スクリプトからの変更点なし）。

```text:IKEの設定
vyatta@vyatta# set vpn ipsec ike-group AWS lifetime '28800'
[edit]
vyatta@vyatta# set vpn ipsec ike-group AWS proposal 1 dh-group '2'
[edit]
vyatta@vyatta# set vpn ipsec ike-group AWS proposal 1 encryption 'aes128'
[edit]
vyatta@vyatta# set vpn ipsec ike-group AWS proposal 1 hash 'sha1'
[edit]
vyatta@vyatta# set vpn ipsec ike-group AWS dead-peer-detection action 'restart'
[edit]
vyatta@vyatta# set vpn ipsec ike-group AWS dead-peer-detection interval '15'
[edit]
vyatta@vyatta# set vpn ipsec ike-group AWS dead-peer-detection timeout '30'
[edit]
```

### ESPの設定
ESPを設定する（スクリプトからの変更点なし）。

```text:ESPの設定
vyatta@vyatta# set vpn ipsec esp-group AWS compression 'disable'
[edit]
vyatta@vyatta# set vpn ipsec esp-group AWS lifetime '3600'
[edit]
vyatta@vyatta# set vpn ipsec esp-group AWS mode 'tunnel'
[edit]
vyatta@vyatta# set vpn ipsec esp-group AWS pfs 'enable'
[edit]
vyatta@vyatta# set vpn ipsec esp-group AWS proposal 1 encryption 'aes128'
[edit]
vyatta@vyatta# set vpn ipsec esp-group AWS proposal 1 hash 'sha1'
[edit]
```

### BGPで広報するネットワークの設定
ダウンロードしたスクリプトには全てのネットワーク（0.0.0.0/0）をVPNに向けるように広報する設定が書かれているが、これをシンガポールリージョンのVPCのアドレス（**192.168.128.0/17**）を広報するように変更する。

なおvyattaが所属するサブネットのアドレス（**192.168.128.0/24**）だけを広報するならば不要なのだが、AWSシンガポールリージョンのvpc全域のパケットをこちらにルーティングさせたいので、静的ルートとnext hopも指定する。

```text:BGPで広報するネットワークの設定
vyatta@vyatta# set protocols bgp 65003 network 192.168.128.0/17
[edit]
vyatta@vyatta# set protocols static route 192.168.128.0/17 next-hop 192.168.128.1
[edit]
```

## トンネル 1の設定
### ピアリングの設定
AWS東京リージョン トンネル 1へのピアリングを設定する。

ダウンロードしたスクリプトにはlocal-adderssとしてvyattaインスタンスのElastic IP（**52.76.38.181**）が書かれているが、これをvyattaインスタンスのプラ一ベートIP（**192.168.128.10**）に置き換える。

```text:ピアリングの設定
vyatta@vyatta# set vpn ipsec site-to-site peer 103.246.151.29 authentication mode 'pre-shared-secret'
[edit]
vyatta@vyatta# set vpn ipsec site-to-site peer 103.246.151.29 authentication pre-shared-secret <スクリプトで指定されている秘密の鍵>
[edit]
vyatta@vyatta# set vpn ipsec site-to-site peer 103.246.151.29 description 'VPC tunnel 1'
[edit]
vyatta@vyatta# set vpn ipsec site-to-site peer 103.246.151.29 ike-group 'AWS'
[edit]
vyatta@vyatta# set vpn ipsec site-to-site peer 103.246.151.29 local-address '192.168.128.10'
[edit]
vyatta@vyatta# set vpn ipsec site-to-site peer 103.246.151.29 vti bind 'vti0'
[edit]
vyatta@vyatta# set vpn ipsec site-to-site peer 103.246.151.29 vti esp-group 'AWS'
[edit]
```

### トンネルインタフェースの設定
トンネル 1のインタフェースを設定する（スクリプトからの変更点なし）。

```text:トンネルインタフェースの設定
vyatta@vyatta# set interfaces vti vti0 address '169.254.252.42/30'
[edit]
vyatta@vyatta# set interfaces vti vti0 description 'VPC tunnel 1'
[edit]
vyatta@vyatta# set interfaces vti vti0 mtu '1436'
[edit]
```

### BGPピアの設定
トンネル 1の対向となるBGPピアを設定する（スクリプトからの変更点なし）。

```text:BGPピアの設定
vyatta@vyatta# set protocols bgp 65003 neighbor 169.254.252.41 remote-as '10124'
[edit]
vyatta@vyatta# set protocols bgp 65003 neighbor 169.254.252.41 soft-reconfiguration 'inbound'
[edit]
vyatta@vyatta# set protocols bgp 65003 neighbor 169.254.252.41 timers holdtime '30'
[edit]
vyatta@vyatta# set protocols bgp 65003 neighbor 169.254.252.41 timers keepalive '30'
[edit]
```

## トンネル 2の設定
トンネル 1と同様、local addressの変更に注意して設定を行う。

### ピアリングの設定

```text:ピアリングの設定
vyatta@vyatta# set vpn ipsec site-to-site peer 103.246.151.39 authentication mode 'pre-shared-secret'
[edit]
vyatta@vyatta# set vpn ipsec site-to-site peer 103.246.151.39 authentication pre-shared-secret <スクリプトで指定されている秘密の鍵>
[edit]
vyatta@vyatta# set vpn ipsec site-to-site peer 103.246.151.39 description 'VPC tunnel 2'
[edit]
vyatta@vyatta# set vpn ipsec site-to-site peer 103.246.151.39 ike-group 'AWS'
[edit]
vyatta@vyatta# set vpn ipsec site-to-site peer 103.246.151.39 local-address '192.168.128.10'
[edit]
vyatta@vyatta# set vpn ipsec site-to-site peer 103.246.151.39 vti bind 'vti1'
[edit]
vyatta@vyatta# set vpn ipsec site-to-site peer 103.246.151.39 vti esp-group 'AWS'
[edit]
```

### トンネルインタフェースの設定

```text:トンネルインタフェースの設定
vyatta@vyatta# set interfaces vti vti1 address '169.254.252.46/30'
[edit]
vyatta@vyatta# set interfaces vti vti1 description 'VPC tunnel 2'
[edit]
vyatta@vyatta# set interfaces vti vti1 mtu '1436'
[edit]
```

### BGPピアの設定

```text:BGPピアの設定
vyatta@vyatta# set protocols bgp 65003 neighbor 169.254.252.45 remote-as '10124'
[edit]
vyatta@vyatta# set protocols bgp 65003 neighbor 169.254.252.45 soft-reconfiguration 'inbound'
[edit]
vyatta@vyatta# set protocols bgp 65003 neighbor 169.254.252.45 timers holdtime '30'
[edit]
vyatta@vyatta# set protocols bgp 65003 neighbor 169.254.252.45 timers keepalive '30'
[edit]
```

## 設定の確定と保存
ここまででAWSシンガポールリージョンのvyattaの設定が終わったので、設定を確定して保存する。

```text:設定の確定と保存
vyatta@vyatta# commit
[edit]
vyatta@vyatta# save
Saving configuration to '/config/config.boot'...
Done
[edit]
```

## IPSec接続の確認
少し時間を置くと、IPSec接続が確立したことが確認できる。

### AWSシンガポールリージョンのIPsec VPN接続の状態
ikeとipsecがupになっている。

```text:IPsec接続の確認
vyatta@vyatta# run show vpn ike sa
Peer ID / IP                            Local ID / IP               
------------                            -------------
103.246.151.29                          192.168.128.10                         

    Description: VPC tunnel 1

    State  Encrypt  Hash  D-H Grp  NAT-T  A-Time  L-Time
    -----  -------  ----  -------  -----  ------  ------
    up     aes128   sha1  2        no     800     28800  

 
Peer ID / IP                            Local ID / IP               
------------                            -------------
103.246.151.39                          192.168.128.10                         

    Description: VPC tunnel 2

    State  Encrypt  Hash  D-H Grp  NAT-T  A-Time  L-Time
    -----  -------  ----  -------  -----  ------  ------
    up     aes128   sha1  2        no     1041    28800  

 
[edit]
vyatta@vyatta# run show vpn ipsec sa
Peer ID / IP                            Local ID / IP               
------------                            -------------
103.246.151.29                          192.168.128.10                         

    Description: VPC tunnel 1

    Tunnel  State  Bytes Out/In   Encrypt  Hash  NAT-T  A-Time  L-Time  Proto
    ------  -----  -------------  -------  ----  -----  ------  ------  -----
    vti     up     1.4K/1.2K      aes128   sha1  no     1033    3600    all

 
Peer ID / IP                            Local ID / IP               
------------                            -------------
103.246.151.39                          192.168.128.10                         

    Description: VPC tunnel 2

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

 
[edit]
```

### AWS東京リージョンのIPsec VPN接続の状態
AWSシンガポールリージョンをアンカーするカスタマーゲートウェイのステータスがUPになっている。

![aws_softlayer_vpn18.png](https://qiita-image-store.s3.amazonaws.com/0/37648/07704521-4c5d-65cb-0354-16ed884e5e32.png)

# SoftLayerのvyatta設定
次にSoftLayerのvyattaを設定する。以下はSoftLayer東京DCでの設定だが、シンガポールDCでも同様の設定を行う。

AWSと同様、**ダウンロードしたスクリプトをそのまま実行しても動作しない**。変更すべきポイントは、BGPで広報するネットワークの設定と、IPsecを設定するNICがeth0ではなくeth1であること。

## 共通の設定
### IPsecを設定するNICの指定
SoftLayerのパブリックにつながっているNICはeth1なので、IPsecを設定するNICはeth1を指定する。

```text:IPsecを設定するNICの指定
vyatta@vyatta-sl-tok# set vpn ipsec ipsec-interfaces interface 'eth1'
[edit]
```

### IKEの設定
IKEを設定する（スクリプトからの変更点なし）。

```text:IKEの設定
vyatta@vyatta-sl-tok# set vpn ipsec ike-group AWS lifetime '28800'
[edit]
vyatta@vyatta-sl-tok# set vpn ipsec ike-group AWS proposal 1 dh-group '2'
[edit]
vyatta@vyatta-sl-tok# set vpn ipsec ike-group AWS proposal 1 encryption 'aes128'
[edit]
vyatta@vyatta-sl-tok# set vpn ipsec ike-group AWS proposal 1 hash 'sha1'
[edit]
vyatta@vyatta-sl-tok# set vpn ipsec ike-group AWS dead-peer-detection action 'restart'
[edit]
vyatta@vyatta-sl-tok# set vpn ipsec ike-group AWS dead-peer-detection interval '15'
[edit]
vyatta@vyatta-sl-tok# set vpn ipsec ike-group AWS dead-peer-detection timeout '30'
[edit]
```

### ESPの設定
ESPを設定する（スクリプトからの変更点なし）。

```text:ESPの設定
vyatta@vyatta-sl-tok# set vpn ipsec esp-group AWS compression 'disable'
[edit]
vyatta@vyatta-sl-tok# set vpn ipsec esp-group AWS lifetime '3600'
[edit]
vyatta@vyatta-sl-tok# set vpn ipsec esp-group AWS mode 'tunnel'
[edit]
vyatta@vyatta-sl-tok# set vpn ipsec esp-group AWS pfs 'enable'
[edit]
vyatta@vyatta-sl-tok# set vpn ipsec esp-group AWS proposal 1 encryption 'aes128'
[edit]
vyatta@vyatta-sl-tok# set vpn ipsec esp-group AWS proposal 1 hash 'sha1'
[edit]
```

### BGPで広報するネットワークの設定
SoftLayer東京DCのプライベートサブネットのアドレス（**10.132.182.64/26**）を広報する。SoftLayerの場合このサブネットのみルーティングすれば良いので、明示的な静的ルートの設定は不要。

```text:BGPで広報するネットワークの設定
vyatta@vyatta-sl-tok# set protocols bgp 65001 network 10.132.182.64/26
[edit]
```

## トンネル 1の設定
### ピアリングの設定
AWS東京リージョン トンネル 1へのピアリングを設定する（スクリプトからの変更点なし）。

```text:ピアリングの設定
vyatta@vyatta-sl-tok# set vpn ipsec site-to-site peer 103.246.151.29 authentication mode 'pre-shared-secret'
[edit]
vyatta@vyatta-sl-tok# set vpn ipsec site-to-site peer 103.246.151.29 authentication pre-shared-secret <スクリプトで指定されている秘密の鍵>
[edit]
vyatta@vyatta-sl-tok# set vpn ipsec site-to-site peer 103.246.151.29 description 'VPC tunnel 1'
[edit]
vyatta@vyatta-sl-tok# set vpn ipsec site-to-site peer 103.246.151.29 ike-group 'AWS'
[edit]
vyatta@vyatta-sl-tok# set vpn ipsec site-to-site peer 103.246.151.29 local-address '161.202.114.70'
[edit]
vyatta@vyatta-sl-tok# set vpn ipsec site-to-site peer 103.246.151.29 vti bind 'vti0'
[edit]
vyatta@vyatta-sl-tok# set vpn ipsec site-to-site peer 103.246.151.29 vti esp-group 'AWS'
[edit]
```

### トンネルインタフェースの設定
トンネル 1のインタフェースを設定する（スクリプトからの変更点なし）。

```text:トンネルインタフェースの設定
vyatta@vyatta-sl-tok# set interfaces vti vti0 address '169.254.252.26/30'
[edit]
vyatta@vyatta-sl-tok# set interfaces vti vti0 description 'VPC tunnel 1'
[edit]
vyatta@vyatta-sl-tok# set interfaces vti vti0 mtu '1436'
[edit]
```

### BGPピアの設定
トンネル 1の対向となるBGPピアを設定する（スクリプトからの変更点なし）。

```text:BGPピアの設定
vyatta@vyatta-sl-tok# set protocols bgp 65001 neighbor 169.254.252.25 remote-as '10124'
[edit]
vyatta@vyatta-sl-tok# set protocols bgp 65001 neighbor 169.254.252.25 soft-reconfiguration 'inbound'
[edit]
vyatta@vyatta-sl-tok# set protocols bgp 65001 neighbor 169.254.252.25 timers holdtime '30'
[edit]
vyatta@vyatta-sl-tok# set protocols bgp 65001 neighbor 169.254.252.25 timers keepalive '30'
[edit]
```

## トンネル 2の設定
トンネル 1と同様、スクリプトからの変更点は無い。

### ピアリングの設定

```text:ピアリングの設定
vyatta@vyatta-sl-tok# set vpn ipsec site-to-site peer 103.246.151.39 authentication mode 'pre-shared-secret'
[edit]
vyatta@vyatta-sl-tok# set vpn ipsec site-to-site peer 103.246.151.39 authentication pre-shared-secret <スクリプトで指定されている秘密の鍵>
[edit]
vyatta@vyatta-sl-tok# set vpn ipsec site-to-site peer 103.246.151.39 description 'VPC tunnel 2'
[edit]
vyatta@vyatta-sl-tok# set vpn ipsec site-to-site peer 103.246.151.39 ike-group 'AWS'
[edit]
vyatta@vyatta-sl-tok# set vpn ipsec site-to-site peer 103.246.151.39 local-address '161.202.114.70'
[edit]
vyatta@vyatta-sl-tok# set vpn ipsec site-to-site peer 103.246.151.39 vti bind 'vti1'
[edit]
vyatta@vyatta-sl-tok# set vpn ipsec site-to-site peer 103.246.151.39 vti esp-group 'AWS'
[edit]
```

### トンネルインタフェースの設定

```text:トンネルインタフェースの設定
vyatta@vyatta-sl-tok# set interfaces vti vti1 address '169.254.252.30/30'
[edit]
vyatta@vyatta-sl-tok# set interfaces vti vti1 description 'VPC tunnel 2'
[edit]
vyatta@vyatta-sl-tok# set interfaces vti vti1 mtu '1436'
[edit]
```

### BGPピアの設定

```text:BGPピアの設定
vyatta@vyatta-sl-tok# set protocols bgp 65001 neighbor 169.254.252.29 remote-as '10124'
[edit]
vyatta@vyatta-sl-tok# set protocols bgp 65001 neighbor 169.254.252.29 soft-reconfiguration 'inbound'
[edit]
vyatta@vyatta-sl-tok# set protocols bgp 65001 neighbor 169.254.252.29 timers holdtime '30'
[edit]
vyatta@vyatta-sl-tok# set protocols bgp 65001 neighbor 169.254.252.29 timers keepalive '30'
[edit]
```

## 設定の確定と保存

```text:設定の確定と保存
vyatta@vyatta-sl-tok# commit
[edit]
vyatta@vyatta-sl-tok# save
Saving configuration to '/config/config.boot'...
Done
[edit]
```

## IPSec接続の確認
少し時間を置いた後、IPSec接続が確立したことを確認する。

### SoftLayer東京DCのIPsec VPN接続の状態
ikeとipsecがupになっている。

```text:IPsec接続の確認
vyatta@vyatta-sl-tok# run show vpn ike sa
Peer ID / IP                            Local ID / IP               
------------                            -------------
103.246.151.29                          161.202.114.70                         

    Description: VPC tunnel 1

    State  Encrypt  Hash  D-H Grp  NAT-T  A-Time  L-Time
    -----  -------  ----  -------  -----  ------  ------
    up     aes128   sha1  2        no     1185    28800  

 
Peer ID / IP                            Local ID / IP               
------------                            -------------
103.246.151.39                          161.202.114.70                         

    Description: VPC tunnel 2

    State  Encrypt  Hash  D-H Grp  NAT-T  A-Time  L-Time
    -----  -------  ----  -------  -----  ------  ------
    up     aes128   sha1  2        no     1161    28800  

 
[edit]
vyatta@vyatta-sl-tok# run show vpn ipsec sa
Peer ID / IP                            Local ID / IP               
------------                            -------------
103.246.151.29                          161.202.114.70                         

    Description: VPC tunnel 1

    Tunnel  State  Bytes Out/In   Encrypt  Hash  NAT-T  A-Time  L-Time  Proto
    ------  -----  -------------  -------  ----  -----  ------  ------  -----
    vti     up     3.2K/3.1K      aes128   sha1  no     1163    3600    all

 
Peer ID / IP                            Local ID / IP               
------------                            -------------
103.246.151.39                          161.202.114.70                         

    Description: VPC tunnel 2

    Tunnel  State  Bytes Out/In   Encrypt  Hash  NAT-T  A-Time  L-Time  Proto
    ------  -----  -------------  -------  ----  -----  ------  ------  -----
    vti     up     2.9K/3.2K      aes128   sha1  no     845     3600    all

 
[edit]
```

### AWS東京リージョンのIPsec VPN接続の状態
SoftLayer東京DCをアンカーするカスタマーゲートウェイのステータスがUPになっている。

![aws_softlayer_vpn19.png](https://qiita-image-store.s3.amazonaws.com/0/37648/c53be945-62d4-76a1-8b45-f87144fb0a04.png)

# 接続テスト用インスタンスの作成
ここまでで各拠点がIPsec VPNで接続された。次に接続テスト用のインスタンスを立ち上げる。

## AWS東京リージョン
### 異なるAZでサブネットを作成
接続テスト用に、異なるAZでサブネットを立ち上げる。ap-northeast-1bに**192.168.10.0/24**、ap-northeast-1cに**192.168.11.0/24**を作成する。

### インターネットゲートウェイを作成しVPCにアタッチ
接続テスト用インスタンスにインターネット側からSSHできるように、インターネットゲートウェイを作成してVPCにアタッチする。

### ルートテーブルのアタッチ
自動的に作成されたルートテーブルを明示的に各サブネットにアタッチする。

![aws_softlayer_vpn20.png](https://qiita-image-store.s3.amazonaws.com/0/37648/1051bfcc-6cb9-478d-f66b-a3063811a017.png)

### ルートテーブルの修正
サブネットを関連付けたルートテーブルに、0.0.0.0/0をインターネットゲートウェイに向けるエントリを追加する。

![aws_softlayer_vpn21.png](https://qiita-image-store.s3.amazonaws.com/0/37648/b3722d65-8da4-6d66-b18e-a1a94dbace1f.png)

また仮想プライベートゲートウェイからのルート伝達（route propagation）を許可する。

![aws_softlayer_vpn22.png](https://qiita-image-store.s3.amazonaws.com/0/37648/7afada30-3902-f822-a487-665f7b1c90e8.png)

これにより、BGPによって交換されたルート情報が自動的にルートテーブルに登録される。

![aws_softlayer_vpn23.png](https://qiita-image-store.s3.amazonaws.com/0/37648/a3753615-d21d-2274-103c-8c741bac1ce8.png)

### 接続テスト用インスタンス起動
作成した二つのサブネットそれぞれに、以下のスペック接続テスト用インスタンスを立ち上げる。

* ap-northeast-1b
    * ami: ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-20150325 - ami-936d9d93
    * type: t2.micro
    * IPアドレス: **192.168.10.10**
    * セキュリティグループ: 
        * SSH: 0.0.0.0/0
        * 全てのトラフィック: 10.0.0.0/8
        * 全てのトラフィック: 192.168.0.0/16
    * Elastic IP: 52.68.111.129
* ap-northeast-1c
    * ami: ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-20150325 - ami-936d9d93
    * type: t2.micro
    * IPアドレス: **192.168.11.10**
    * セキュリティグループ: 
        * SSH: 0.0.0.0/0
        * 全てのトラフィック: 10.0.0.0/8
        * 全てのトラフィック: 192.168.0.0/16
    * Elastic IP: 52.68.136.205

## AWSシンガポールリージョン
### 異なるAZでサブネットを作成
接続テスト用に、異なるAZでサブネットを立ち上げる。ap-sourceeast-1aに**192.168.210.0/24**、ap-southeast-1bに**192.168.211.0/24**を作成する。

### ルートテーブルの作成とアタッチ
新たに作成したサブネット用にルートテーブルを作成し、各々のサブネットにアタッチする。

![aws_softlayer_vpn24.png](https://qiita-image-store.s3.amazonaws.com/0/37648/511284f2-2add-9166-d6aa-0f568dbbdd65.png)

![aws_softlayer_vpn25.png](https://qiita-image-store.s3.amazonaws.com/0/37648/7590b38c-4670-b897-3c00-81b373126c75.png)

### ルートテーブルの修正
サブネットを関連付けたルートテーブルに、0.0.0.0/0をインターネットゲートウェイに向けるエントリを追加する。

またこのルートテーブルにはBGPのルート情報を自動的に反映できないため、10.0.0.0/8と192.168.0.0/17をvyattaインスタンスのENIに振り向けるエントリも追加する。

![aws_softlayer_vpn26.png](https://qiita-image-store.s3.amazonaws.com/0/37648/222df6a0-46a1-b000-e490-105278498125.png)

### 接続テスト用インスタンス起動
作成した二つのサブネットそれぞれに、以下のスペック接続テスト用インスタンスを立ち上げる。

* ap-southeast-1a
    * ami: ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-20150325 - ami-96f1c1c4
    * type: t2.micro
    * IPアドレス: **192.168.210.10**
    * セキュリティグループ: 
        * SSH: 0.0.0.0/0
        * 全てのトラフィック: 10.0.0.0/8
        * 全てのトラフィック: 192.168.0.0/16
    * Elastic IP: 52.74.32.95
* ap-southeast-1b
    * ami: ubuntu/images/hvm-ssd/ubuntu-trusty-14.04-amd64-server-20150325 - ami-96f1c1c4
    * type: t2.micro
    * IPアドレス: **192.168.211.10**
    * セキュリティグループ: 
        * SSH: 0.0.0.0/0
        * 全てのトラフィック: 10.0.0.0/8
        * 全てのトラフィック: 192.168.0.0/16
    * Elastic IP: 52.76.54.224

## SoftLayer東京DCとシンガポールDC
### 接続テスト用インスタンス起動
各DCで、vyattaインスタンスと同じプライベートサブネットに所属するように接続テスト用インスタンスを立ち上げる。

* OS: Ubuntu 14.04 LTS (64 bit)
* CPU: 2.0GHz 1core
* RAM: 1GB RAM

### 静的ルートの設定
残念ながら、SoftLayerにはvyattaのBGPから得たルート情報をプライベートサブネットのデフォルトゲートウェイに自動反映する仕組みが無いため、AWSのプライベートIP宛のパケットは、vyattaのプライベートIPにルーティングするように静的ルートを設定する。

```text:東京DCの接続テスト用インスタンスへ静的ルート追加
root@test-sl-tok-01:~# ip route add 192.168.0.0/16 via 10.132.182.81 dev eth0
```

```text:シンガポールDCの接続テスト用インスタンスへ静的ルート追加
root@test-sl-sng-01:~# ip route add 192.168.0.0/16 via 10.117.212.51 dev eth0
```

# 接続テスト
接続テスト用インスタンスは、下記のIPアドレスで立ち上がっている。

|クラウド|AZまたはDC|パブリックIP|プライベートIP|
|:--|:--|:--|:--|
|AWS|ap-northeast-1b|52.68.111.129|192.168.10.10|
|AWS|ap-northeast-1c|52.68.136.205|192.168.11.10|
|AWS|ap-southeast-1a|52.74.32.95|192.168.210.10|
|AWS|ap-southeast-1b|52.76.54.224|192.168.211.10|
|SoftLayer|東京DC|161.202.114.72|10.132.182.82|
|SoftLayer|シンガポールDC|161.202.24.89|10.117.212.62|

各インスタンスから別のインスタンスへpingを打つことで、お互いがL3接続されていることを確認できる。

以下はSoftLayerシンガポールDCからの例。

```text:SoftLayerシンガポールDCからのping結果
root@test-sl-sng-01:~# ping -c 2 192.168.10.10
PING 192.168.10.10 (192.168.10.10) 56(84) bytes of data.
64 bytes from 192.168.10.10: icmp_seq=1 ttl=61 time=69.4 ms
64 bytes from 192.168.10.10: icmp_seq=2 ttl=61 time=68.7 ms

--- 192.168.10.10 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 68.763/69.111/69.459/0.348 ms
root@test-sl-sng-01:~# ping -c 2 192.168.11.10
PING 192.168.11.10 (192.168.11.10) 56(84) bytes of data.
64 bytes from 192.168.11.10: icmp_seq=1 ttl=61 time=71.7 ms
64 bytes from 192.168.11.10: icmp_seq=2 ttl=61 time=71.5 ms

--- 192.168.11.10 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 71.578/71.676/71.775/0.285 ms
root@test-sl-sng-01:~# ping -c 2 192.168.210.10
PING 192.168.210.10 (192.168.210.10) 56(84) bytes of data.
64 bytes from 192.168.210.10: icmp_seq=1 ttl=61 time=143 ms
64 bytes from 192.168.210.10: icmp_seq=2 ttl=61 time=143 ms

--- 192.168.210.10 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 143.378/143.380/143.382/0.002 ms
root@test-sl-sng-01:~# ping -c 2 192.168.211.10
PING 192.168.211.10 (192.168.211.10) 56(84) bytes of data.
64 bytes from 192.168.211.10: icmp_seq=1 ttl=61 time=144 ms
64 bytes from 192.168.211.10: icmp_seq=2 ttl=61 time=144 ms

--- 192.168.211.10 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 144.083/144.259/144.436/0.418 ms
root@test-sl-sng-01:~# ping -c 2 10.132.182.82
PING 10.132.182.82 (10.132.182.82) 56(84) bytes of data.
64 bytes from 10.132.182.82: icmp_seq=1 ttl=56 time=158 ms
64 bytes from 10.132.182.82: icmp_seq=2 ttl=56 time=75.0 ms

--- 10.132.182.82 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 75.059/116.531/158.003/41.472 ms
root@test-sl-sng-01:~# ping -c 2 10.117.212.62
PING 10.117.212.62 (10.117.212.62) 56(84) bytes of data.
64 bytes from 10.117.212.62: icmp_seq=1 ttl=64 time=0.022 ms
64 bytes from 10.117.212.62: icmp_seq=2 ttl=64 time=0.015 ms

--- 10.117.212.62 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.015/0.018/0.022/0.005 ms
```

またSoftLayerシンガポールDCからtracepathで確認したところ、AWS東京とは3ホップ、AWSシンガポールとは4ホップと、IPsec VPNのトンネル経由でつながっていることが確認できる。一方SoftLayer東京DCからとは9ホップを要しており、SoftLayerの内部ネットワークを経由してつながっているものと推測される。

```
root@test-sl-sng-01:~# tracepath 192.168.10.10
 1?: [LOCALHOST]                                         pmtu 1500
 1:  10.117.212.51                                         0.981ms 
 1:  10.117.212.51                                         0.207ms 
 2:  10.117.212.51                                         0.514ms pmtu 1436
 2:  no reply
 3:  192.168.10.10                                        70.033ms reached
     Resume: pmtu 1436 hops 3 back 4 
root@test-sl-sng-01:~# tracepath 192.168.210.10
 1?: [LOCALHOST]                                         pmtu 1500
 1:  10.117.212.51                                         0.553ms 
 1:  10.117.212.51                                         0.466ms 
 2:  10.117.212.51                                         0.498ms pmtu 1436
 2:  no reply
 3:  no reply
 4:  192.168.210.10                                      143.685ms reached
     Resume: pmtu 1436 hops 4 back 4 
root@test-sl-sng-01:~# tracepath 10.132.182.82 
 1?: [LOCALHOST]                                         pmtu 1500
 1:  10.117.212.3                                          1.068ms 
 1:  10.117.212.3                                          0.578ms 
 2:  no reply
 3:  10.0.30.214                                           1.055ms 
 4:  no reply
 5:  no reply
 6:  no reply
 7:  no reply
 8:  no reply
 9:  10.132.182.82                                        69.235ms reached
     Resume: pmtu 1500 hops 9 back 9 
```

## CDP:CloudHubパターン
AWSシンガポールリージョンとSoftLayerシンガポールDCは直接接続されれいないが、各拠点がBGPによって経路交換することで、AWS東京リージョン経由で通信することができている。

このアーキテクチャは、**Cloud Design Pattern**の**[CloudHubパターン](http://aws.clouddesignpattern.org/index.php/CDP:CloudHub%E3%83%91%E3%82%BF%E3%83%BC%E3%83%B3)**の一種と言っても良いだろう。

# まとめ
この手順が「簡単」かと言うと疑問が残るが、ともあれAWSのハードウェアVPN機能とvyattaを用い、各拠点の経路情報をBGPを用いて交換することで、AWSとSoftLayerの多拠点間IPsec VPN接続が確立できた。