Raspberry Pi 上にSoftetherをつかってVPNを構築する

# 目的

- SoftEtherをつかってVPNを構築する。
- IPSecを使って接続できるようにする。
- ブリッジまでをいっきに設定する。
- [Raspberry PiでのVPNサーバ構築](https://qiita.com/tkyonezu/items/00311e2285366984891c)が**非常に**わかりやすいですが、VPNサーバーを一度立ててからブリッジ接続をしていたので自分がやりやすいように手順を~~並び替え~~まとめたい。

最近何度かRaspberry Pi上にSoftetherを使ってVPNを構築することがありました。いくつもサイトを回っていつも使う設定するのが面倒になったので自分用にまとめを作ります。

# 下準備

## 用意するもの（ハード）

- Raspberry Pi 3 Model B(以下raspi)
    - 本体
    - 初期設定などは済ませてあるものとします。
    - [Raspberry Pi　初期設定](https://qiita.com/sigma7641/items/995c7bb07eab408b9d0e)などを参考にしてください。
    - ただし、後で述べますが**ipアドレスは固定しないでください。**
- インターネット環境
    - EtherNet環境が必要です。
- PC
    - 細かい設定はWindows上で行います。
- ルータ
    - VPNできないものもあるそうです。

# Raspberry Pi上

## リンクの確認

- [SoftEtherのページ](https://www.softether-download.com/ja.aspx?product=softether)でダウンロードしたいソフトのリンクを確認します。  

|| これを選択 |
|:--|:--|
| ダウンロードするソフトウェアを選択 | SoftEther VPN (Freeware) |
| コンポーネントを選択 | SoftEther VPN Server |
| プラットフォームを選択 | Linux |
| CPUを選択 | ARM EABI(32bit) |

画像の下にちらっと映っているページのリンクを右クリックの`リンクのアドレスをコピー`などでコピーしてください。

![figure1.png](https://qiita-image-store.s3.amazonaws.com/0/308715/14f6536b-de0f-7de6-e041-63f9604359fb.png)

## ファイルのダウンロード

上で確認したリンクのファイルを`wget`を使ってダウンロードします。下のコマンドをうつとダウンロード＆解凍されるので適宜場所を移動して行ってください。

```bash
wget https://xxx #上でコピーしたリンクを貼り付け
tar zxvf softether-vpnserver-xxx.tar.gz #ダウンロードしたファイルを解凍する
```
# インストール

解凍したディレクトリに移動して、`make`をします。いろいろ同意を求められるので良ければ`1`を何度か押してください。
また、最後の方で環境チェックをしてくれます。すべて`pass`しているか確認してください。

```bash
cd vpnserver
make
```

`vpnserver`ディレクトリをコピーしたり、権限を調節したりします。

```bash
cd ..
sudo rsync -av vpnserver /usr/local
cd /usr/local
sudo chmod 700 vpnserver
cd vpnserver
find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;
chmod 700 vpncmd vpnserver
```

# 自動起動の設定

このままだと、毎回`/usr/local/vpnserver/vpnserver start`しなければいけないので自動で起動するようにします。

```bash
sudo vim /usr/lib/systemd/system/vpnserver.service
```
新しいファイルができるので以下の内容で作ってください。

```vim
[Unit]
Description=SoftEther VPN Server
After=network.target

[Service]
Type=forking
ExecStart=/usr/local/vpnserver/vpnserver_start
ExecStop=/usr/local/vpnserver/vpnserver stop
KillMode=process
Restart=on-failure

[Install]
WantedBy=multi-user.target
```

上記の`/usr/local/vpnserver/vpnserver_start`を作ります。

```bash
vim /usr/local/vpnserver/vpnserver_start
```

自動で`tapデバイス`の名前を選んできてブリッジに追加するスクリプトです。

```vim
#!/bin/bash
/usr/local/vpnserver/vpnserver start

tap=$(/sbin/ifconfig -a| awk '$1 ~ /^tap/ {print $1}')
/sbin/brctl addif br0 $tap
```
権限を変更します。

```bash
sudo chmod 755 /usr/local/vpnserver/vpnserver_start
```

# ブリッジ

bridge-utilsをインスト―ルします。

```bash
sudo apt-get install -y bridge-utils
```

ブリッジのipアドレスを設定。ここがあるため、`/etc/dhcpcd.conf`に固定の内容を書いてはいけない。

```bash
sudo vim /etc/network/interfaces
```
以下の内容を追記してください。

```vim
# loopback
auto lo
iface lo inet loopback

# Ethernet port
auto eth0
iface eth0 inet manual

# Bridge interface
auto br0
iface br0 inet static
address 192.168.xxx.yyy #固定のipアドレスを指定
netmask 255.255.255.0
network 192.168.xxx.0 #ネットワークのアドレスを指定
broadcast 192.168.xxx.255 #ブロードキャストアドレスを指定
gateway 192.168.xxx.zzz # ルータのアドレスを入れる
bridge_ports eth0

#その他
auto wlan0
allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp
```
設定を適用させるために、一度リブートします。

```bash
sudo reboot
sudo /usr/local/vpnserver/vpnserver start
```
また、ここでvpnserverの起動登録をします。

```bash
sudo systemctl enable vpnserver.service
```

# Windows上

## VPN Server Managerのインストール

ここからは、windows上での設定になります。

Windowsパソコン上に、`VPN Server Manager`をダウンロードします。また、[ここ](http://www.softether-download.com/ja.aspx)からです。

|| これを選択 |
|:--|:--|
| ダウンロードするソフトウェアを選択 | SoftEther VPN (Freeware) |
| コンポーネントを選択 | SoftEther VPN  Server Manager for Windows |
| プラットフォームを選択 | Windows |
| CPUを選択 | Intel (x86 and x64) |

一番上のダウンロードできるファイルを選べば大丈夫でしょう。これをインストールします。できたら、`SE-VPN サーバー管理 (ツール)`を立ち上げてください。

## SoftEther VPN サーバ管理マネージャ

### SoftEther VPN Server への接続設定

`新しい接続設定`を押します。`接続設定名`に、任意のわかりやすい名前を設定。`ホスト名`に`raspberrypi.local`など自分のRasbeppyPiのホスト名を入れます。先程固定したipアドレスで直接指定してもかまいません。`管理者パスワード`を設定します。

### raspberrypi.localへのログイン

先程作った接続名をクリックし、接続を押します。
なにも入力せずに`OK`を押してください。
新しい管理者パスワードを設定してください。

### SoftEther VPN Server/Bridge 簡易セットアップ

`リモートアクセスVPNサーバ`にチェックを入れて次へ。
よろしいですかと聞かれるので`はい`を押してください。

### 簡易セットアップ　仮想HUB名の決定

HUB名を決めるように言われるので任意の名前を入れて`OK`を押して下さい。

### ダイナミックDNS機能

ダイナミックDNSホスト名の変更から、「３文字以上３１文字以内の半角英数字およびハイフン'-'」の範囲で任意のホスト名を決めることができます。大文字も入力できますが自動で小文字に変換されるようです。
決めた**ダイナミックDNSホスト名**とグローバルIPv4アドレスはメモをしておいてください。スマートフォンでは名前解決ができないことがあるようで直接ipアドレスを指定しないといけないことがあります。

`閉じる`で次へ進みしばらく待ちます。

### IPSec/L2TP/EtherIP/L2TPv3　設定

- [x] L2TPサーバ機能を有効にする(L2TP over IPSec)

チェックが入っていることを確認し、`IPSec事前共有鍵`に任意の事前共有鍵を指定してください。

`OK`を押す。10文字以上の鍵を指定すると、鍵の長さが9文字以下推奨と出てくるが、セキュリティ的に長い方がいいのと、滅多にそのバグに出会わないので設定を見直さなくてよい。~~駄目だったら、戻ってこよう。~~`いいえ`を押す。

### VPN Azure サービスの設定

今回は使わない予定なので`VPN Azureを無効にする`をチェックが入っていることを確認し、`OK`を押す。

### 簡易セットアップの実行

`ユーザを制作する`->`新規作成`->`ユーザー名`と`パスワード`、`パスワードの確認入力`を適宜設定する。

`OK`を押す。ユーザーを作ったと教えてくれるので感謝の気持ちを込めて`OK`を押す。
`閉じる`->`閉じる`を押し`VPN Server "raspberrypi.local"の管理`の場面まで戻る。

### ローカルブリッジの設定

左下の、`ローカルブリッジ設定`を押す。

0. `新しいローカルブリッジの定義`の仮想HUBのプルダウンから作った仮想HUBを選ぶ。
1. `新しいtapデバイスとのブリッジ接続`にチェックを入れる。
2. `新しいtapデバイス名`に任意の名前を入れる。
3. `ローカルブリッジを追加`をクリック。
4. `OK`を押す。
5. `閉じる`

これで、SoftEther VPN サーバ管理マネージャの設定は終了となるのですべて閉じる。

# Rasberry Piを再起動

```bash
sudo reboot
```
再起動してください。

# ポートフォワーディング

RaspberryPiはNATの内側に守られているため、外からVPNにアクセスするためにはポートフォワーディングという「このポートに送られてきたらRaspberryPiのこのポートに転送して！」というシステムを使わなければいけません。
この設定は、慣れない人にはかなり面倒ですが使っているルータによって設定方法が異なるので自分の使っているルータの名前をインターネットで調べて方法を見つけてください。
[VPN Server 側での L2TP/IPsec 機能の有効化方法](https://ja.softether.org/4-docs/2-howto/L2TP_IPsec_Setup_Guide/1)にもありますがポートフォワーディングするポートはUDPの500と4500です。

#　他はまったところ

- ルータによっては同一ネットワーク内からVPN繋げないということがあるようです。
- ルータによってはVPNを使うためにはポートフォワーディング以外にも設定が必要なようです。
- 何度かraspiを再起動すると上手く行くようになることがあります。
- 極稀に何度も失敗した後だとクライアント側を再起動させるとうまくいくことがあります。
- 上でも挙げましたが、[Raspberry PiでのVPNサーバ構築](https://qiita.com/tkyonezu/items/00311e2285366984891c)がわかりやすいです。うまく行かない場合は、VPNの構築とブリッジの構築を別々に行い、それぞれできているか確認して下さい。