ラズパイ4からL2TP/IPsecでVPNを張ってリモデ接続

ラズパイ4を購入したが、その使い道としてはシンクライアントが妥当だろうと考えた。
私の会社はテレワークがパーマネントになったので、社内にある自分のWindowsマシンにラズパイ4からリモデ接続して仕事ができるようにしようと言うことである。

# 環境

- Raspberry Pi 4B (8GB RAM)
- Raspbian GNU/Linux 10 (buster)

# インストールしたもの

- ike-scan 1.9.4-2
- StrongSwan 5.7.2-1
- xl2tpd 1.3.12-1.1
- Remmina 1.3.3

# VPN設定

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

```
$ sudo apt install ike-scan strongswan xl2tpd
```

## StrongSwan (ipsec) の設定

先ずは接続先（a.b.c.d：VPNサーバー）の暗号化方式を調べる。

```
$ sudo systemctl stop ipsec xl2tpd
$ sudo ike-scan a.b.c.d
Starting ike-scan 1.9.4 with 1 hosts (http://www.nta-monitor.com/tools/ike-scan/)
a.b.c.d	Main Mode Handshake returned HDR=(CKY-R=***) SA=(Enc=3DES Hash=SHA1 Auth=PSK Group=2:modp1024 LifeType=Seconds LifeDuration(4)=0x00007080) VID=*** (KAME/racoon)

Ending ike-scan 1.9.4: 1 hosts scanned in 0.082 seconds (12.26 hosts/sec).  1 returned handshake; 0 returned notify
```

取得したSAの内容（3DES/SHA1/PSK/modp1024）にしたがって、ipsecの設定を行う。

```
$ sudo vim /etc/ipsec.conf
```

```text:/etc/ipsec.confの末尾に追記
conn %default
	keyingtries=0

conn myvpn
	keyexchange=ikev1
	authby=secret
	right=a.b.c.d
	rightid=e.f.g.h
	ike=3des-sha1-modp1024!
	esp=3des-sha1
	leftfirewall=yes
	auto=add
	left=%defaultroute
	leftprotoport=17/1701
	rightprotoport=17/1701
	type=transport
```

参照：https://wiki.strongswan.org/projects/strongswan/wiki/ConnSection

上記myvpnには好きな名前を付ける。
PSK（Pre Shared Key）なので上記authbyにはsecretを指定する。
上記rightidはそれが未定義のときに以下のメッセージが下記接続確認時に出力された場合に記述する。

```
IDir 'e.f.g.h' does not match to 'a.b.c.d'
```

また、下記の通り、PSKを設定する。

```
$ sudo vim /etc/ipsec.secrets
```

```text:/etc/ipsec.secretsの末尾に追記
a.b.c.d : PSK "PSKの値"
```

一旦、ipsec接続が可能かを確認する。
成功すると、以下のようなメッセージが表示される。

```
$ sudo systemctl start ipsec
$ sudo ipsec up myvpn
...
connection 'myvpn' established successfully
$ sudo ipsec status
Security Associations (1 up, 0 connecting):
       myvpn[1]: ESTABLISHED 41 seconds ago, i.j.k.l[i.j.k.l]...a.b.c.d[e.f.g.h]
       myvpn{1}:  INSTALLED, TRANSPORT, reqid 1, ESP in UDP SPIs: xxxxxxxx_i xxxxxxxx_o
       myvpn{1}:   i.j.k.l/32[udp/l2f] === a.b.c.d/32[udp/l2f]
$ sudo ipsec down myvpn
```

上記i.j.k.lはラズパイ4側のIPアドレスである。

## xl2tpdの設定

以下のようにxl2tpdの設定を行う。

```
$ sudo vim /etc/xl2tpd/xl2tpd.conf
```

```text:/etc/xl2tpd/xl2tpd.confの末尾に追記
[lac myvpn]
lns = a.b.c.d
pppoptfile = /etc/ppp/options.l2tpd.client
length bit = yes
autodial = no
redial = yes
redial timeout = 10
max redials = 6
```

参照：https://linux.die.net/man/5/xl2tpd.conf

以下のようにPPP（Point-to-Point Protocol）の設定を行う。

```
$ sudo vim /etc/ppp/options.l2tpd.client
```

```text:/etc/ppp/options.l2tpd.client
name DOMAIN\\USER
password PASSWORD
noauth
```

上記DOMAIN、USER、PASSWORDはそれぞれ自分のアカウントに合わせる。
他のサイトを参照すると、name、password、noauth以外にも多くの設定項目が存在するが、削っていったところ、最小の設定で接続できた。

ここでVPN接続が可能かを確認する。
成功すると、以下のようなログが/var/log/syslogに出力され、ネットワークインターフェースとしてppp0が追加される。

```
$ sudo systemctl start xl2tpd
$ sudo up myvpn
$ sudo xl2tpd-control connect myvpn
$ less /var/log/syslog
...
www dd hh:mm:ss raspberrypi ipsec[2601]: 07[KNL] interface ppp0 activated
...
$ ifconfig ppp0
ppp0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST>  mtu 1400
        inet l.m.n.o  netmask 255.255.255.255  destination p.q.r.s
        ppp  txqueuelen 3  (Point-to-Pointプロトコル)
        RX packets 89  bytes 14054 (13.7 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 326  bytes 39274 (38.3 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
```

## ルート設定

現時点では、ルートが通っていないので、まだ社内にアクセスできない。

```
$ route
カーネルIP経路テーブル
受信先サイト    ゲートウェイ    ネットマスク   フラグ Metric Ref 使用数 インタフェース
default         xxxxxxxx        0.0.0.0         UG    303    0        0 wlan0
p.q.r.s         0.0.0.0         255.255.255.255 UH    0      0        0 ppp0
t.u.v.0         0.0.0.0         255.255.255.0   U     303    0        0 wlan0
```

上記p.q.r.sをもとに、ルートを追加する。

```
$ sudo ip route add p.q.0.0/16 via p.q.r.s dev ppp0
$ route
カーネルIP経路テーブル
受信先サイト    ゲートウェイ    ネットマスク   フラグ Metric Ref 使用数 インタフェース
default         xxxxxxxx        0.0.0.0         UG    303    0        0 wlan0
p.q.0.0         p.q.r.s         255.255.0.0     UG    0      0        0 ppp0
p.q.r.s         0.0.0.0         255.255.255.255 UH    0      0        0 ppp0
t.u.v.0         0.0.0.0         255.255.255.0   U     303    0        0 wlan0
```

これで社内のマシンにPINGが通るようになるはず。

xl2tpdによるppp0の追加と同時にルートを追加するには、以下のシェルスクリプトを作成する。

```
$ sudo vim /etc/ppp/ip-up.d/0001myvpn
```

```sh:/etc/ppp/ip-up.d/0001myvpn
#!/bin/sh -e
dev=$1
gw=$5
if [ `echo $dev | grep ppp` ]; then
	mask=`echo $gw | sed 's/\([0-9]\+\)\.\([0-9]\+\)\.[0-9]\+\.[0-9]\+/\1.\2.0.0/'`
	ip route add $mask/16 via $gw dev $dev
fi
exit 0
```

上記シェルスクリプトには実行属性を追加しておく必要がある。

```
$ sudo chmod +x /etc/ppp/ip-up.d/0001myvpn
```

## その他

好きな名前のシェルスクリプトを作成し、VPN接続と切断を行えるようにしておくと良い。

```sh:/usr/local/bin/conn-myvpn
#!/bin/sh
ipsec up myvpn
while true
do
	stat=`ipsec status | grep INSTALLED`
	if [ "$stat" != "" ]; then
		xl2tpd-control connect myvpn
		exit
	fi
	sleep 1
done
```

```sh:/usr/local/bin/disc-myvpn
#!/bin/sh
xl2tpd-control disconnect myvpn
ipsec down myvpn
```

上記いずれも chmod +x で実行属性を付ける必要がある。

# リモデ設定

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

```
$ sudo apt install remmina reminna-plugin-rdp
```

## Remminaの設定

- Application menu＞インターネット＞Remminaで起動
- Remmina＞左上のcreate a new connection profileをクリック
- 名前は適宜、グループは任意で入力、プロトコルはRDPを選択
- サーバー、ユーザー名、User passwordを入力
- 他の項目は適宜設定し、Saveボタンをクリック
- Remminaのメイン画面のリストに追加されたプロファイルをダブルクリックで接続

# 所感

残念ながら、VPN上の通信は遅くてリモデが使い物にならなかった。
多段階SSH接続でリモデ接続ポートを通した方が圧倒的に速かった。
しかし、多段階SSH接続の最初の一歩として、社内のLinuxマシンにSSH接続する分には使えるので、それはそれとして良かった点である。