AWS EC2のVPNクライアント設定方法

# やりたいこと
ec2インスタンスをvpnクライアントにして、社内vpnサーバーに接続して、社内LANのリソースにアクセスしたい。

# はじめに
- 社内vpnサーバーが、IPsecのIKE(秘密鍵認証）で構築されているため、L3プロトコルはIPsecのopenswan、L2プロトコルはxl2tpdを使用します。
- 各インストール方法は割愛します。概念と設定ファイル及びコネクション方法を整理のためにまとめます。

# 概念
![スクリーンショット 0002-11-06 17.37.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/9884/dd98f5d4-8ff3-233b-03fa-d84436967a71.png)

- ec2と社内vpnサーバーはインターネットのグローバルIP経由で通信をしているので、先に図の青のトンネル（L3）をIPsecでセキュアにつなぎます。
- ただそれだけだと、グローバルIP間で暗号化されているだけなので、その中に肌色のトンネル（L2)をxl2tpdで通してブロードキャストドメインでの通信を可能にさせます。要は社内DHCPサーバーから発行されたプライベートアドレスでの通信となり、社内リソースにアクセスすることが可能になります。
- xl2tpd(l2tp)は、データリンクレイヤーでの疎通を可能にしますが、暗号化をしてくれるわけではないので、暗号化はIPSecにお任せます。
- 拠点間はIPsecで暗号化トンネルをはり、その中を社内LANデータ通信が通るイメージです。

# IPsecの設定
IPsecの設定ファイルは以下です。

```/etc/ipsec.conf
# /etc/ipsec.conf - Openswan IPsec configuration file
version	2.0

# basic configuration
config setup
	protostack=netkey
	nat_traversal=yes
	oe=off

# 個別の設定ファイルをインクルード
include /etc/ipsec.d/*.conf
```

```/etc/ipsec.d/connection.conf
# ec2とVPNのコネクション設定
conn HOGE #接続名（好きな名前）
  authby=secret
  pfs=no
  rekey=no
  keyingtries=3
  type=transport
  
  # ec2サイド
  left=%defaultroute
  leftprotoport=17/1701

  # vpnサーバーサイド
  right=xxx.xxx.xxx.xxx # vpnサーバーのグローバルIP
  rightid=192.168.0.1   # vpnサーバーのプライベートアドレス
  rightprotoport=17/1701

  auto=add
```

```/etc/ipsec.d/ipsec.secrets 
#共有キーファイル
: PSK "vpnサーバーから配布されている共有キー"
```

# IPsecトンネルの開通
ここまで設定できたら、以下のコマンドを実行しIPsecトンネル(図の青い部分)をはります。

```
  $ sudo service ipsec start
  $ sudo ipsec auto --add HOGE # 追加したい接続名

  # 成功するとこの様な表示が出る
  ipsec_setup: Starting Openswan IPsec U2.6.37/K4.14.193-113.317.amzn1.x86_64...
  ipsec_setup: /usr/libexec/ipsec/addconn Not able to open /proc/sys/crypto/fips_enabled, returning 
  non-fips mode
  /usr/libexec/ipsec/addconn Not able to open /proc/sys/crypto/fips_enabled, returning non-fips mode
```

これで、拠点間のIPSec(L3)でのトンネルがはれました。

# さらにl2tp(L2)のトンネルを貼る
xl2tpdの設定ファイルは以下です。

```/etc/xl2tpd/xl2tpd.conf
# lac(L2TP Access Concentrator:クライアント側)をディレクティブで複数設定できます。今回はuser1の設定のみ

[lac user1] # vpnサーバーから配布されている接続ユーザー名
lns = xxx.xxx.xxx.xxx # vpnサーバーのグローバルIP
require chap= yes
refuse pap = yes
require authentication = yes

pppoptfile = /etc/ppp/options.xl2tpd.user1.client # 接続user個別の設定ファイル

redial = yes
redial timeout = 10
max redials = 6

ppp debug = yes
length bit = yes
```

```/etc/ppp/options.xl2tpd.user1.client
# 接続ユーザー個別の設定ファイル

name user1

noauth

crtscts

mtu 1410
mru 1410

nodefaultroute
lock
proxyarp

logfile /var/log/ppp/xl2tpd.conn-1.log
```


```
# /etc/ppp/chap-secrets
# ユーザー認証ファイル

"user1" * "配布されているパスワード" *
```

# l2tpトンネルの開通
ここまで設定できたら、以下のコマンドを実行しl2tpトンネル(図の肌色の部分)をIPSecトンネル内にはります。

```
$ sudo service xl2tpd start
$ sudo ipsec auto --up HOGE         # 接続名でトンネルをはる
$ sudo xl2tpd-control connect user1 #user1の認証

# 成功するとこの様に表示される
Starting xl2tpd:                                           [  OK  ]
104 "HOGE" #1: STATE_MAIN_I1: initiate
003 "HOGE" #1: received Vendor ID payload [RFC 3947] method set to=109
106 "HOGE" #1: STATE_MAIN_I2: sent MI2, expecting MR2
003 "HOGE" #1: NAT-Traversal: Result using RFC 3947 (NAT-Traversal): i am NATed
108 "HOGE" #1: STATE_MAIN_I3: sent MI3, expecting MR3
004 "HOGE" #1: STATE_MAIN_I4: ISAKMP SA established {auth=OAKLEY_PRESHARED_KEY cipher=aes_128 prf=oakley_sha group=modp2048}
117 "HOGE" #2: STATE_QUICK_I1: initiate
003 "HOGE" #2: NAT-Traversal: received 2 NAT-OA. ignored because peer is not NATed
003 "HOGE" #2: our client peer returned protocol id does not match my proposal - us17 vs them: 0
003 "HOGE" #2: Allowing questionable proposal anyway [ALLOW_MICROSOFT_BAD_PROPOSAL]
003 "HOGE" #2: our client peer returned port doesn't match my proposal - us:1701 vs them:0
003 "HOGE" #2: Allowing bad L2TP/IPsec proposal (see bug #849) anyway
003 "HOGE" #2: peer client peer returned protocol id does not match my proposal - us17 vs them: 0
003 "HOGE" #2: Allowing questionable proposal anyway [ALLOW_MICROSOFT_BAD_PROPOSAL]
003 "HOGE" #2: peer client peer returned port doesn't match my proposal - us:1701 vs them:0
003 "HOGE" #2: Allowing bad L2TP/IPsec proposal (see bug #849) anyway
004 "HOGE" #2: STATE_QUICK_I2: sent QI2, IPsec SA established transport mode {ESP=>0xe557d871 <0xea1efddf xfrm=AES_128-HMAC_SHA1 NATOA=none NATD=none DPD=none}
```

これにて、図の肌色の部分のトンネルも開通しました。

`ifconfig`コマンドで、`pppN`と出ていれば成功です。今回は社内のDHCPサーバーから、`192.168.0.70`が割り振られていました。このアドレスを使って社内LANのプライベートIPのリソースにアクセスが可能となりました。

```
ppp0      Link encap:Point-to-Point Protocol
          inet addr:192.168.0.70  P-t-P:192.168.0.1  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1410  Metric:1
          RX packets:182 errors:0 dropped:0 overruns:0 frame:0
          TX packets:17 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:17872 (17.4 KiB)  TX bytes:120 (120.0 b)
```