VyOSでUbuntu16.04から接続可能なL2TP over IPSec Serverを構築する


# 初めに

![スクリーンショット 2018-05-23 20.44.45.png](https://qiita-image-store.s3.amazonaws.com/0/128123/f2c3e34d-50d7-9c51-7b70-9e563f7990e9.png)

急遽、「複数の拠点間で手軽に暗号化通信したい」というニーズが出てきた為、VyOSを活用してL2TP over IPSec Serverを構築しました。この記事では、VyOSを使ってL2TP over IPSecのサーバーを構築する方法及びUbuntuをVPNクライアントとして使う方法をご紹介します。

# 必要なモノ

- VyOSインスタンス
  - 要グローバルIP
  - 本記事では、VyOS 1.1.8をさくらクラウドから利用しています
- 参加するUbuntuノード
  - 多分NAT配下にあっても大丈夫です


# 環境構築手順

## 必要なインスタンスの準備

今回の構築では、さくらクラウドを利用してVyOS及びUbuntuのVMを作成しました。
VyOS・Ubuntuのベースイメージがある為、簡単に構築が出来ます。
※AWSでもVyOSのAMIとかあるので、AWS上でも同様に構築可能です

### VyOSインスタンスの準備
![スクリーンショット_2018-05-23_20_49_43.png](https://qiita-image-store.s3.amazonaws.com/0/128123/e73acc8d-fa3b-d2f2-0295-e9f01caefb57.png)

### クライアント用Ubuntuインスタンスの用意
![スクリーンショット_2018-05-23_20_49_46.png](https://qiita-image-store.s3.amazonaws.com/0/128123/6438f5df-d423-2e93-d694-f1acce90c55c.png)


## VyOSの設定

configureモードに入り、L2TP over IPSecのサーバーとしての機能を設定します。
XXX.XXX.XXX.XXXは、VMのグローバルアドレスをいれてください。nexthopのアドレスには
ゲートウェイアドレスを入力が必要です。
今回、L2TPの認証にmschap-v2を利用しています。環境によって変更してください。

IPSec PSK: i_am_psk
L2TP Username: i_am_user
L2TP Password: i_am_password
L2TP Auth: mschap-v2

クライアントIPプールやDNSサーバーも環境によって変更してください。
commit,saveを入力することで設定の反映・保存をすることができます。
(saveを忘れると再起動した時に設定が吹き飛びますのでご注意ください)

```bash

vyos@vyos-server:~$ configure
vyos@vyos-server:~# set service ssh disable-password-authentication
vyos@vyos-server:~# set vpn ipsec ipsec-interfaces interface eth0
vyos@vyos-server:~# set vpn ipsec nat-traversal enable
vyos@vyos-server:~# set vpn ipsec nat-networks allowed-network 0.0.0.0/0
vyos@vyos-server:~# set vpn l2tp remote-access outside-address XXX.XXX.XXX.XXX
vyos@vyos-server:~# set vpn l2tp remote-access outside-nexthop 【デフォルトGWのアドレス】
vyos@vyos-server:~# set vpn l2tp remote-access client-ip-pool start 192.168.100.100
vyos@vyos-server:~# set vpn l2tp remote-access client-ip-pool stop 192.168.100.200
vyos@vyos-server:~# set vpn l2tp remote-access dns-servers server-1 8.8.8.8
vyos@vyos-server:~# set vpn l2tp remote-access dns-servers server-2 8.8.4.4
vyos@vyos-server:~# set vpn l2tp remote-access ipsec-settings authentication mode pre-shared-secret
vyos@vyos-server:~# set vpn l2tp remote-access ipsec-settings authentication pre-shared-secret i_am_psk
vyos@vyos-server:~# set vpn l2tp remote-access authentication mode local
vyos@vyos-server:~# set vpn l2tp remote-access authentication local-users username i_am_user password i_am_password
vyos@vyos-server:~# set vpn l2tp remote-access authentication require mschap-v2
vyos@vyos-server:~# set nat source rule 999 outbound-interface eth0
vyos@vyos-server:~# set nat source rule 999 translation address masquerade
vyos@vyos-server:~# set interfaces dummy dum0 address 192.168.100.1/24
vyos@vyos-server:~# commit
vyos@vyos-server:~# save
Saving configuration to '/config/config.boot'...
Done
vyos@vyos-server:~# exit
```

これで、L2TP over IPSecのサーバー機能としての設定は以上になります。
次からはクライアントであるUbuntu側の設定に入ります。

## クライアント側(Ubuntu）の設定


### 必要なパッケージのインストール

```bash

ubuntu@vyos-client:~$ apt update
ubuntu@vyos-client:~$ apt install strongswan xl2tpd
```

### /etc/ipsec.confの編集

IPSecに関する設定を記述します。大体コメントアウトされています。
下記を最終行に追加してください。
※ `XXX.XXX.XXX.XXX`はVyOSのグローバルIPを入力してください。

```bash

ubuntu@vyos-client:~$ sudo vim /etc/ipsec.conf
conn %default
	ikelifetime=60m
	keylife=20m
	rekeymargin=3m
	keyingtries=1
	keyexchange=ikev1
	authby=secret
	ike=aes128-sha1-modp1024,3des-sha1-modp1024!
	esp=aes128-sha1-modp1024,3des-sha1-modp1024!

conn IPSEC
	keyexchange=ikev1
	left=%defaultroute
	auto=add
	authby=secret
	type=transport
	leftprotoport=17/1701
	rightprotoport=17/1701
	right=XXX.XXX.XXX.XXX
```

### /etc/ipsec.secretsの編集
```bash

ubuntu@vyos-client:~$ sudo vim /etc/ipsec.secrets
# This file holds shared secrets or RSA private keys for authentication.

# RSA private key for this host, authenticating it to any other host
# which knows the public part.
%any XXX.XXX.XXX.XXX : PSK "i_am_psk"
```


### /etc/xl2tpd/xl2tpd.confの編集

L2TPに関する設定を記述します。こちらも同様に大体コメントアウトされています。
下記を最終行に追加してください。

下記の設定では、クライアント側に ` 192.168.100.10 ` というアドレスが静的に割り振られます。
２台以上のクライアントノードを運用するときは、こちらを変更してください。
(サーバー側から自動でIP割り振ることも可能ですが、運用を考えて一旦静的にアドレス指定をしています）
※ `XXX.XXX.XXX.XXX`はVyOSのグローバルIPを入力してください。

```
ubuntu@vyos-client:~$ sudo vim /etc/xl2tpd/xl2tpd.conf
[lac vpn-connection]
lns = XXX.XXX.XXX.XXX
local ip = 192.168.100.10
ppp debug = yes
pppoptfile = /etc/ppp/options.l2tpd.client
length bit = yes
```

### /etc/ppp/options.l2tpd.clientの作成

VPN接続時にpppdというデーモンが動きます。このデーモン用のパラメータを設定します。
認証でmschap-v2を選択していますが、VyOS側の認証設定と合わせる必要性があります。
MTUは一旦小さめに1400と設定しています。

```bash
ubuntu@vyos-client:~$ sudo vim /etc/ppp/options.l2tpd.client
ipcp-accept-local
ipcp-accept-remote
refuse-eap
#refuse-pap
#refuse-chap
#refuse-mschap
require-mschap-v2
noccp
noauth
idle 1800
mtu 1400
mru 1400
defaultroute
usepeerdns
debug
lock
connect-delay 5000
name i_am_user
password i_am_password
logfile /var/log/xl2tpd.log
```

ここまでで、デーモンの設定は以上になります。


# 動作確認の実施
実際に接続する前に、はデーモンの立ち上げとエラーがないかの確認を行います。
​
## Strongswanとxl2tpdのデーモン起動
```
ubuntu@vyos-client:~$ sudo systemctl start strongswan.service
ubuntu@vyos-client:~$ sudo systemctl start xl2tpd.service
```

## Strongswanが起動している事の確認
```bash

ubuntu@vyos-client:~$ sudo journalctl -u strongswan.service
-- Logs begin at Wed 2018-05-23 17:41:31 JST, end at Wed 2018-05-23 17:54:08 JST. --
May 23 17:41:32 vyos-client systemd[1]: Starting strongSwan IPsec services...
May 23 17:41:32 vyos-client ipsec[640]: Starting strongSwan 5.3.5 IPsec [starter]...
May 23 17:41:32 vyos-client ipsec_starter[640]: Starting strongSwan 5.3.5 IPsec [starter]...
May 23 17:41:32 vyos-client systemd[1]: Started strongSwan IPsec services.
May 23 17:41:32 vyos-client charon[700]: 00[DMN] Starting IKE charon daemon (strongSwan 5.3.5, Linux 4.4.0-116-generic, x86_64)
May 23 17:41:32 vyos-client charon[700]: 00[CFG] loading ca certificates from '/etc/ipsec.d/cacerts'
May 23 17:41:32 vyos-client charon[700]: 00[CFG] loading aa certificates from '/etc/ipsec.d/aacerts'
May 23 17:41:32 vyos-client charon[700]: 00[CFG] loading ocsp signer certificates from '/etc/ipsec.d/ocspcerts'
May 23 17:41:32 vyos-client charon[700]: 00[CFG] loading attribute certificates from '/etc/ipsec.d/acerts'
May 23 17:41:32 vyos-client charon[700]: 00[CFG] loading crls from '/etc/ipsec.d/crls'
May 23 17:41:32 vyos-client charon[700]: 00[CFG] loading secrets from '/etc/ipsec.secrets'
May 23 17:41:32 vyos-client charon[700]: 00[CFG]   loaded IKE secret for %any XXX.XXX.XXX.XXX
May 23 17:41:32 vyos-client charon[700]: 00[LIB] loaded plugins: charon test-vectors aes rc2 sha1 sha2 md4 md5 random nonce x509 revocation constraints pu
May 23 17:41:32 vyos-client charon[700]: 00[LIB] dropped capabilities, running as uid 0, gid 0
May 23 17:41:32 vyos-client charon[700]: 00[JOB] spawning 16 worker threads
May 23 17:41:32 vyos-client ipsec_starter[699]: charon (700) started after 80 ms
May 23 17:41:32 vyos-client charon[700]: 10[CFG] received stroke: add connection 'IPSEC'
May 23 17:41:32 vyos-client charon[700]: 10[CFG] added configuration 'IPSEC'
```
​
## xl2tpdデーモンが起動している事の確認
```bash

ubuntu@vyos-client:~$ sudo journalctl -u xl2tpd.service
-- Logs begin at Wed 2018-05-23 17:41:31 JST, end at Wed 2018-05-23 17:57:33 JST. --
May 23 17:41:32 vyos-client systemd[1]: Starting LSB: layer 2 tunelling protocol daemon...
May 23 17:41:32 vyos-client xl2tpd[647]: setsockopt recvref[30]: Protocol not available
May 23 17:41:32 vyos-client xl2tpd[625]: Starting xl2tpd: xl2tpd.
May 23 17:41:32 vyos-client xl2tpd[681]: xl2tpd version xl2tpd-1.3.6 started on vyos-client PID:681
May 23 17:41:32 vyos-client xl2tpd[681]: Written by Mark Spencer, Copyright (C) 1998, Adtran, Inc.
May 23 17:41:32 vyos-client xl2tpd[681]: Forked by Scott Balmos and David Stipp, (C) 2001
May 23 17:41:32 vyos-client xl2tpd[681]: Inherited by Jeff McAdams, (C) 2002
May 23 17:41:32 vyos-client xl2tpd[681]: Forked again by Xelerance (www.xelerance.com) (C) 2006
May 23 17:41:32 vyos-client xl2tpd[681]: Listening on IP address 0.0.0.0, port 1701
May 23 17:41:32 vyos-client systemd[1]: Started LSB: layer 2 tunelling protocol daemon.
```

ここまでで記述エラー等があると、デーモンが起動せずエラーが記録されます。

# 実際に接続する

## 手動で接続

```bash
# IPSec 接続 (successfullyが出てればOK)
ubuntu@vyos-client:~$ sudo ipsec up IPSEC
initiating Main Mode IKE_SA IPSEC[2] to XXX.XXX.XXX.XXX
(省略)
connection 'IPSEC' established successfully

# L2TP 接続 (OKが出ればよし）
ubuntu@vyos-client:~$ sudo xl2tpd-control connect vpn-connection
00 OK
```

## VPN用NIC(ppp0)の確認
うまく接続できると、下記のようにppp0インターフェースが作成され指定したIPアドレスが割り振られます。
もしppp0が出来ない場合は、前述の手順でデーモンのログを確認してください。

```bash

ubuntu@vyos-client:~$ ifconfig ppp0
ppp0      Link encap:Point-to-Point Protocol
          inet addr:192.168.100.10  P-t-P:10.255.255.0  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1400  Metric:1
          RX packets:22 errors:0 dropped:0 overruns:0 frame:0
          TX packets:22 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:1576 (1.5 KB)  TX bytes:1576 (1.5 KB)
```

## ルーティング情報の登録
忘れがちですが、非常に大事な作業。
これがないとパケットがうまくルーティングされません。

```bash

ubuntu@vyos-client:~$ sudo route add -net 192.168.100.0 netmask 255.255.255.0 dev ppp0
```

## Ping疎通テスト

```bash

ubuntu@vyos-client:~$ ping 192.168.100.1
PING 192.168.100.1 (192.168.100.1) 56(84) bytes of data.
64 bytes from 192.168.100.1: icmp_seq=1 ttl=64 time=0.473 ms
64 bytes from 192.168.100.1: icmp_seq=2 ttl=64 time=0.552 ms
64 bytes from 192.168.100.1: icmp_seq=3 ttl=64 time=0.478 ms
64 bytes from 192.168.100.1: icmp_seq=4 ttl=64 time=0.646 ms
^C
--- 192.168.100.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 2999ms
rtt min/avg/max/mdev = 0.473/0.537/0.646/0.072 ms
```

VyOS内の仮想NICにPingが飛べば、環境構築に成功です。