IPsecの基礎知識を身につけつつ、AWSのVPN接続設定を読む

## 概要
1. IPv4におけるIPsecについて調べる
2. AWSのVPNサービスで提供されているルータの設定テンプレートを読み解く

## IPsecについて
### 概要
 * Security Architecture for the Internet Protocol
   * IPsecとは特定のプロトコルを指すものではない。いくつかの要素をもとに成り立つ、IPのセキュリティ設計。
     * AH, ESP, IKE, SA(それぞれ後述)
 * IP通信を透過的にセキュア化する
   * アプリケーションプロトコル（HTTPなど）を変更することなしに利用できる
   * cf. SSL/TLS
 * IPsecは「トンネリング」と「暗号化」の機能をもつため、VPNで利用される

### RFC
 * RFCを読むなら、まずこれに目を通したほうがいい. IPsec関連のRFCの見通しをよくするための"Road Map"
   * https://tools.ietf.org/html/rfc6071
   * IPsecは複数の要素から成り立つと述べたが、それぞれについてRFCが存在し、IPsecのバージョンも複数あるため、全部合わせるとかなりの量になっている
     * http://www.tatsuyababa.com/RFC-ipsec.html 

### バージョン
 * IPsec-v1, IPsec-v2, IPsec-v3がある
 * 現在使われているのは. IPsec-v2とIPsec-v3
   * https://tools.ietf.org/html/rfc6071#section-2.2
 * ただし、これらのバージョンはIETF的には非公式とのこと。(wikipediaより)

### IPsecの２つのモード
#### トランスポートモード
 * ホスト間で使用される
 * パケットのIPヘッダは変更しない
 * 既存のIPヘッダの後ろにAH/ESPヘッダを挿入する

#### トンネルモード
 * ルータ間（セキュリティゲート間）で使用される
 * AWSのVPN接続はこちらのモード
 * もとのパケットに新たにIPヘッダを付加してパケットを転送する
 * ホスト(PC)はIPsecを意識しない

### 構成する要素
#### AH（Authentication Header）
 * 認証機能

#### ESP(Encapsulated Security Payload)
 * ペイロード部の暗号化
 * 改ざん防止のAHか機密性保護のESPかを選択する。現在広く使われているのはESPらしい。
 * VPNでは暗号化が必須なのでESPを使う

#### IKE(Internet Key Exchange)
 * 鍵交換
 * 動的なSAの構築で利用される
   * 詳細は『3分間ネットワーク』へ
      * http://www5e.biglobe.ne.jp/aji/3min/ex/sup24.html
   * SAの構築のために、セキュアにパラメータを交換するためのSAを別に構築する。（ISKAMP SA）
      * IKEフェーズ１でISKAMP SAを構築し、IKEフェーズ2でSA(IPsec SA)を構築する

#### SA(Security Association)
 * VPNゲートウェイ（ルータ）間のコネクション（仮想的な通信路）
 * 詳細は『3分間ネットワーク』へ
   * http://www5e.biglobe.ne.jp/aji/3min/ex/sup22.html

#### それぞれの関連
 * rfc6071のFigure 1を見るとイメージがつきやすいかもしれない
   * https://tools.ietf.org/html/rfc6071#section-2.1

### AWSのVPN設定用テンプレート
 * AWSのマネジメントコンソールにおけるVPCサービスの画面より「VPN接続」を設定すると、自分の環境に合わせた機器(ルータのOS)の設定テンプレートがダウンロードできる。
    * 基本的にはそのままコピペすれば設定が完了するくらい出来上がったもの
 * そのうち、vyatta用のテンプレートをダウンロードし、一つ一つの設定を見ていく。
    * もともとあったコメントは大きく削除し、解説用のコメント私のほうで追加した
       * NW詳しくないので、ある程度疑いの目で見て欲しい
    * 一部の情報（主に環境に依存しているIPアドレス）はマスクした


```
! --------------------------------------------------------------------------------
! IPSec Tunnel #1 (トンネル1と2を設定する必要がある)
! --------------------------------------------------------------------------------

! #1: Internet Key Exchange (IKE) Configuration
! もともとのコメント文にも書いてあったが、「AES128, SHA1, and DH Group 2」の最小限の要求を満たす設定のため、適宜修正すること。そしてNATトラバーサルを利用するには、UDP PORT 4500を開放しておくこと。

! IKEフェーズ1で作成されたキーの持続期間を28800sec(8時間)にする. これを超えるとIKE フェーズ1のネゴシエーションが発生する
! "AWS"はグループ化された設定の識別名
set vpn ipsec ike-group AWS lifetime '28800'

! フェーズ１のネゴシエーション時に使用する、Diffie-Hellman交換のパラメータ。DHグループ２を指定している
! "proposal 1"は、IPsecの接続を開始するイニシエータにおいて、IKEフェーズ１で使用するパラメータのうち最も優先度の高い「提案」
set vpn ipsec ike-group AWS proposal 1 dh-group '2'

! AES128の暗号方式を使用する(AWSというIKE設定グループのプロポーザル1において)
set vpn ipsec ike-group AWS proposal 1 encryption 'aes128'
! 説明は省略
set vpn ipsec ike-group AWS proposal 1 hash 'sha1'

! 対向のVPNゲートウェイの認証方式にpre-shared-secret(事前共有秘密)を使用する。
! "xxx.xxx.xxx.xxx"は対向のVPNゲートウェイのアドレス
set vpn ipsec site-to-site peer xxx.xxx.xxx.xxx authentication mode 'pre-shared-secret'

! pre-shared-secretの内容（マスクしている）
set vpn ipsec site-to-site peer xxx.xxx.xxx.xxx authentication pre-shared-secret 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

! 対向のVPNゲートウェイの説明文
set vpn ipsec site-to-site peer xxx.xxx.xxx.xxx description 'VPC tunnel 1'

! 対向のVPNゲートウェイと'AWS'IKE設定グループをひもづける
set vpn ipsec site-to-site peer xxx.xxx.xxx.xxx ike-group 'AWS'

! 対向のVPNゲートウェイに送られるパケットの送信元IPアドレス(yyy.yyy.yyy.yyy) を指定する
set vpn ipsec site-to-site peer xxx.xxx.xxx.xxx local-address 'yyy.yyy.yyy.yyy'

! IPsecのVPNトンネルを仮想トンネルインタフェースにバインドする
set vpn ipsec site-to-site peer xxx.xxx.xxx.xxx vti bind 'vti0'

! IPsecのVPNトンネルに設定するESP設定グループを指定する
set vpn ipsec site-to-site peer xxx.xxx.xxx.xxx vti esp-group 'AWS'


! #2: IPSec Configuration
! eth0でIPsec VPNを有効にする
set vpn ipsec ipsec-interfaces interface 'eth0'

! 説明は省略
set vpn ipsec esp-group AWS compression 'disable'

! 3600sec(1時間)を超えるとIKEフェーズ２のネゴシエーションが行われる
set vpn ipsec esp-group AWS lifetime '3600'

! (トランスポートモードではなく、)IPsecのトンネルモードを使用する
set vpn ipsec esp-group AWS mode 'tunnel'

! PFS(Perfect Forward Secrecy)というものがあるらしい
set vpn ipsec esp-group AWS pfs 'enable'

! 説明は省略
set vpn ipsec esp-group AWS proposal 1 encryption 'aes128'
! 説明は省略
set vpn ipsec esp-group AWS proposal 1 hash 'sha1'

! VPNトンネルが到達不能になったときに、VPNトンネルをリスタートする
set vpn ipsec ike-group AWS dead-peer-detection action 'restart'
! IKEキープアライブの送信間隔(sec)
set vpn ipsec ike-group AWS dead-peer-detection interval '15'
! 対向ゲートウェイが応答しない場合に、actionが実行される期間(sec)
set vpn ipsec ike-group AWS dead-peer-detection timeout '30'


! #3: Tunnel Interface Configuration
! vtiインタフェース（vti0）の設定。IPアドレス、説明文、MTU
set interfaces vti vti0 address 'zzz.zzz.zzz.zzz/zz'
set interfaces vti vti0 description 'VPC tunnel 1'
set interfaces vti vti0 mtu '1436'

! #4: Border Gateway Protocol (BGP) Configuration
! AS番号６５０００（自分のAS）に、BGPネイバー(nnn.nnn.nnn.nnn)のAS番号１０１２４を指定
set protocols bgp 65000 neighbor nnn.nnn.nnn.nnn remote-as '10124'
set protocols bgp 65000 neighbor nnn.nnn.nnn.nnn soft-reconfiguration 'inbound'
set protocols bgp 65000 neighbor nnn.nnn.nnn.nnn timers holdtime '30'
set protocols bgp 65000 neighbor nnn.nnn.nnn.nnn timers keepalive '10'

! アドバタイズするネットワーク。AWSのテンプレートのデフォルトは下記の通りだが、自身が所属するNWを指定するほうがよいと思われる
set protocols bgp 65000 network 0.0.0.0/0


! --------------------------------------------------------------------------------
! IPSec Tunnel #2
! --------------------------------------------------------------------------------
! ここからTunnel2の設定になるが、内容はTunnel1とほとんど変わらないので割愛する。
```
 
## 参考にしたサイト
 * http://www5e.biglobe.ne.jp/aji/3min/ex/sup21.html
 * https://ja.wikipedia.org/wiki/IPsec
 * http://www.tatsuyababa.com/RFC-ipsec.html
 * http://www.infraexpert.com/study/study10.html