AWSのVyOSとRTX1200をIPsecでつなぐ

# きっかけ
趣味のAWSで、VPGと家をIPsecでつないだことがあるが、趣味としては結構高くつくと感じ、廃止していた。ハードだし仕方ないな。
しかし、[本家マニュアル](http://docs.aws.amazon.com/ja_jp/AmazonVPC/latest/UserGuide/vpn-connections.html)に

>VPN アプライアンスを実行する VPC の Amazon EC2 インスタンスを使用して、リモートネットワークへの VPN 接続を作成できます。

という記載を発見。なるほど、これは試す価値があるのでは…。

# 構成要素

## VPNアプライアンス
言葉の意味はよくわからないが、EC2インスタンスなので、仮想ルータということだろう。
家で使っているSEIL/x86を使おうとも思ったが、AWSマーケットプレイスにあるVyOSならお手軽かも。
Vyatta時代に少し使っただけなので、進化も感じておきたい。

### AWSマーケットプレイスのVyOS
VyOSで検索しても、出てこない。
ググると、[ここ](https://aws.amazon.com/marketplace/pp/B00JK5UPF6)へのリンクがあるが、よく見ると

>This product is currently unavailable.

とのこと。さらにググると、コミュニティのAMIはある模様。
EC2->インスタンス->コミュニティAMI->検索でVyOS 1.1.7と入れると…

1. ami-5812e939
2. ami-69b26e08

の2つが出てくる。何が違うんだ…。勘で1.を選んでみる。

## 拠点ルータ
スマホとの間でL2TP/IPsecを使っている、RTX1200とつなぐことにする。
RTX1200のバージョンは、最新の10.01.71。

# 調査
ググると当然色々と情報があるが、2014年〜2015年ごろのものが多い。
また、AWS側をVyOSにする設定例が少ない気もする。
不安が残る。

## IKE
RTX1200側のAgressive Modeの関係で、IPIP上にIPsecを張る必要ありという[情報](https://www.idcf.jp/pdf/cloud/vyos_self.pdf)もある。
確かに[RTpro](http://www.rtpro.yamaha.co.jp/RT/manual/rt-common/ipsec/ipsec_chapter.html)にも

>一方のルーターしか固定のグローバルアドレスを持たないときにはアグレッシブモードを使用します。

とある。EC2インスタンスはDHCPでアドレスを取得し、Elastic IPが直接内部インターフェースに割り当たるわけではないので、NATになり、この条件に合いそう。
VyOSがメインモードのみだと、厳しそうだ。

しかし、[VyOS 1.1.0のリリースノート](http://wiki.vyos-users.jp/1.1.0/%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%83%8E%E3%83%BC%E3%83%88)を見ると、IKEv2に対応とある。
IKEv2ではアグレッシブモードは無くなったはずなので、上記情報はIKEv1の時の話か。
それでは、IKEv2にしてみたら、IPIPは不要にできるのでは。

## 参考にした設定

- RTX1200側: [RTproのIKEv2](http://www.rtpro.yamaha.co.jp/RT/docs/ipsec/ike2.html)
- VyOS側: [VyOS Wiki](https://wiki.vyos.net/wiki/User_Guide#Site-to-Site_IPsec)

など。

# 試行錯誤
いろいろ試したが、とにかくつながらなかった。
接続に必要と思われる条件で自分がはまったのは、

1. RTX1200のNAMEのtypeを`ipv4-addr`にする (おそらくVyOS側の`id`をIPアドレス表記にした場合)
2. VyOSの`ike-group`に`dh-group`を指定する

といった条件。正確に切り分けていないので、他の要素が問題だったかもしれないが…。

# 設定例

設定例は抜粋です。

## サブネット
192.168.100.0/24がRTX1200側のサブネット、
192.168.200.0/24がVyOS側のサブネット。

## IPアドレス
`aaa.aaa.aaa.aaa`はRTX1200側のグローバルIPアドレス、
`bbb.bbb.bbb.bbb`はVyOSインスタンスにマッピングされたAWSのElastic IPアドレス。
192.168.200.cccはDHCPで割り当てられるVyOSインスタンスのプライベートIPアドレス。

[こちらの情報](https://forums.aws.amazon.com/message.jspa?messageID=376179)によると、サブネットの範囲の一部アドレスを予約することはできないのはVPCの仕様の模様。
tunnelはunnumberedにできた。

## その他条件
VyOS側がイニシエータ。
EC2インスタンスのVyOSはグローバルIPを持たないので、NAT Traversal。
スタティックルート。

## RTX1200側

[RTpro](http://www.rtpro.yamaha.co.jp/RT/docs/ipsec/ike2.html)によると、IKEv2では、`local name`と`remote name`の設定は必須の模様。

`tuunel`のMTUは[デフォルトで1280](http://www.rtpro.yamaha.co.jp/RT/manual/rt-common/ip/ip_interface_mtu.html)? (詳細未確認)

```:RTX1200
ip route 192.168.200.0/24 gateway tunnel 1
:
tunnel select 1
 ipsec tunnel 101
  ipsec sa policy 101 1 esp aes-cbc sha-hmac
  ipsec ike version 1 2
  ipsec ike local name 1 aaa.aaa.aaa.aaa ipv4-addr
  ipsec ike nat-traversal 1 on
  ipsec ike pre-shared-key 1 SecretStrings
  ipsec ike remote address 1 any
  ipsec ike remote name 1 bbb.bbb.bbb.bbb ipv4-addr
 ip tunnel tcp mss limit auto
 tunnel enable 1
```

## VyOS側

手動で設定していない項目が`show config`で現れるようになった(何で?)が、それもそのまま記載。
`pfs`は気づいたら`enable`になっていた気がするので、手動で`disable`に。
`key-exchange`は[VyOS 1.1.0のリリースノート](http://wiki.vyos-users.jp/1.1.0/%E3%83%AA%E3%83%AA%E3%83%BC%E3%82%B9%E3%83%8E%E3%83%BC%E3%83%88)ではデフォルトがIKEv2とあるが、念のため`ikev2`を明示。

```:VyOS
set vpn ipsec esp-group ESP-AWS compression 'disable'
set vpn ipsec esp-group ESP-AWS lifetime '3600'
set vpn ipsec esp-group ESP-AWS mode 'tunnel'
set vpn ipsec esp-group ESP-AWS pfs 'disable'
set vpn ipsec esp-group ESP-AWS proposal 1 encryption 'aes128'
set vpn ipsec esp-group ESP-AWS proposal 1 hash 'sha1'
set vpn ipsec ike-group IKE-AWS ikev2-reauth 'no'
set vpn ipsec ike-group IKE-AWS key-exchange 'ikev2'
set vpn ipsec ike-group IKE-AWS lifetime '28800'
set vpn ipsec ike-group IKE-AWS proposal 1 dh-group '2'
set vpn ipsec ike-group IKE-AWS proposal 1 encryption 'aes128'
set vpn ipsec ike-group IKE-AWS proposal 1 hash 'sha1'
set vpn ipsec ipsec-interfaces interface 'eth0'
set vpn ipsec nat-networks allowed-network '192.168.0.0/16'
set vpn ipsec nat-traversal 'enable'
set vpn ipsec site-to-site peer aaa.aaa.aaa.aaa authentication id 'bbb.bbb.bbb.bbb'
set vpn ipsec site-to-site peer aaa.aaa.aaa.aaa authentication mode 'pre-shared-secret'
set vpn ipsec site-to-site peer aaa.aaa.aaa.aaa authentication pre-shared-secret 'SecretStrings'
set vpn ipsec site-to-site peer aaa.aaa.aaa.aaa authentication remote-id 'aaa.aaa.aaa.aaa'
set vpn ipsec site-to-site peer aaa.aaa.aaa.aaa connection-type 'initiate'
set vpn ipsec site-to-site peer aaa.aaa.aaa.aaa default-esp-group 'ESP-AWS'
set vpn ipsec site-to-site peer aaa.aaa.aaa.aaa ike-group 'IKE-AWS'
set vpn ipsec site-to-site peer aaa.aaa.aaa.aaa ikev2-reauth 'inherit'
set vpn ipsec site-to-site peer aaa.aaa.aaa.aaa local-address '192.168.200.ccc'
set vpn ipsec site-to-site peer aaa.aaa.aaa.aaa tunnel 1 allow-nat-networks 'disable'
set vpn ipsec site-to-site peer aaa.aaa.aaa.aaa tunnel 1 allow-public-networks 'disable'
set vpn ipsec site-to-site peer aaa.aaa.aaa.aaa tunnel 1 local prefix '192.168.200.0/24'
set vpn ipsec site-to-site peer aaa.aaa.aaa.aaa tunnel 1 remote prefix '192.168.100.0/24'
```

## VPCの設定
IKEv2とNAT Traversalが通るように、インバウンドのルールにUDPの500番と4500番を通す必要があるが、どうせ固定IPとの間なので、UDPを全部通すようにしてしまった。

# 宿題
- VyOS同士…最初これがうまくいかずRTX1200に移行…IKEバージョンが合ってなかった?
- OSPFを通す
- `show vpn ipsec sa`などでNAT-Tがnoになる謎の解明…ESP(50)通るようにしてたっけ?
- vtiへの移行