softetherをubuntu18.04にインストールする

# はじめに
Softether VPN Server を ubuntu 18.04 にインストールするときのメモ。

# 環境

- ubuntu 18.04.2 Server (64bit)
- Softether VPN Server Version 4.29 Build 9680

# インストールまでの流れ

VPN Server で作成した仮想HUBとOSで作成したブリッジI/Fをブリッジ(接続)できることを最終目的とする。
通常は最後の5の手順は不要である。

1. パッケージをインストールする
2. systemd サービスに登録する
3. ネットワークのブリッジを設定する
4. 仮想HUBを作成する
5. ソースからビルドして再インストールする(オプション)

## 設定する項目

| 設定 | 内容 |
|:--|:--|
| インストール場所(prefix) | /usr/local/vpnserver/ |
| systemdサービス名称 | vpnserver |
| 仮想HUB | TEST |
| [Softether] TAPデバイス名 | tap_test |
| [OS] ブリッジデバイス名 | br_test |

# 1. パッケージをインストールする

ダウンロードURLは下記からできる。

- [Softether ダウンロードセンター](https://www.softether-download.com/ja.aspx?product=softether)
- [Git Hub SoftEtherVPN/SoftEtherVPN_Stable](https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/releases)

```terminal:パッケージのインストール
$ mkdir -p ~/src/vpnserver/
$ cd ~/src/vpnserver/
$ wget https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/releases/download/v4.29-9680-rtm/softether-vpnbridge-v4.29-9680-rtm-2019.02.28-linux-x64-64bit.tar.gz
$ tar zxvf softether-vpnserver-v4.29-9680-rtm-2019.02.28-linux-x64-64bit.tar.gz
$ cd vpnserver
$ yes 1 | make
$ find . -type f | chmod 600
$ find . -type d | chmod 700
$ chmod u+x .install.sh vpncmd vpnserver
$ sudo cp -rp vpnserver /usr/local/
$ sudo chown -R root:root /usr/local/vpnserver/
```

# 2. systemd サービスに登録する

ubuntuには、サービスを登録する方法が2種類用意されている。

- init.d に起動スクリプトを登録する方法 
- systemdにサービスとして登録する方法

どちらの方法で登録しても systemd のサービスとして取り扱うことができるので問題ない。

## init.d に起動スクリプトを登録する方法

`/etc/init.d/vpnserver`として以下のファイルを設定する。
(他の記事でよくある起動スクリプトから br0 に対する処理を削除している。)

```sh:/etc/init.d/vpnserver
#!/bin/sh
### BEGIN INIT INFO
# Provides:                     vpnserver
# Required-Start:               $local_fs $network
# Required-Stop:                $local_fs $network
# Default-Start:                2 3 4 5
# Default-Stop:                 0 1 6
# Short-Description:            SoftEther VPN RTM
# Description:                  Start vpnserver daemon SoftEther VPN Server
### END INIT INFO

DAEMON=/usr/local/vpnserver/vpnserver
LOCK=/var/lock/vpnserver

# load tun/tap module
sudo modprobe tun

. /lib/lsb/init-functions

test -x $DAEMON || exit 0

case "$1" in
start)
sleep 3
log_daemon_msg "Starting SoftEther VPN Server" "vpnserver"
$DAEMON start >/dev/null 2>&1
touch $LOCK
log_end_msg 0
sleep 3
;;

stop)
log_daemon_msg "Stopping SoftEther VPN 1.0 Server" "vpnserver"
$DAEMON stop >/dev/null 2>&1
rm $LOCK
log_end_msg 0
sleep 2
;;

restart)
$DAEMON stop
sleep 2

$DAEMON start
sleep 5
;;

status)
    if [ -e $LOCK ]
    then
        echo "vpnserver is running."
    else
        echo "vpnserver is not running."
    fi
;;
*)

echo "Usage: $0 {start|stop|restart|status}"
exit 1
esac
exit 0
```

```terminal:サービスの登録
$ sudo systemctl daemon-reload
$ sudo systemctl enable vpnserver
```

```terminal:サービスの起動
$ sudo systemctl start vpnserver
```

```terminal:サービスの終了
$ sudo systemctl stop vpnserver
```

## systemd にサービスを登録する方法

`/etc/systemd/system/vpnserver.service`として以下のファイルを設置する。

```text:/etc/systemd/system/vpnserver.service
[Unit]
Description=SoftEther VPN Server
After=network.target auditd.service
ConditionPathExists=!/usr/local/vpnserver/do_not_run

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

# Hardening
PrivateTmp=yes
ProtectHome=yes
ProtectSystem=full
ReadOnlyDirectories=/
ReadWriteDirectories=-/usr/local/vpnserver
CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_BROADCAST CAP_NET_RAW CAP_SYS_NICE CAP_SYS_ADMIN CAP_SETUID

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

```terminal:サービスの登録
$ sudo systemctl daemon-reload
$ sudo systemctl enable vpnserver
```

```terminal:サービスの起動
$ sudo systemctl start vpnserver
```

```terminal:サービスの終了
$ sudo systemctl stop vpnserver
```

# 3. ネットワークのブリッジを設定する

VPN Server で作成する仮想HUBとブリッジ(接続)するために、ブリッジI/Fを作成する。

```terminal:事前準備
$ sudo apt install bridge-utils
```

VPN Server 向けのネットワーク設定を独立させるために、ここでは`/etc/netplan/99-vpnserver.yaml` に設定を書き出すことにする。ここでは、物理NICを`ens192`、割当IPアドレスを`192.168.123.123/24`として設定する。
また、TAPデバイスの `tap_test` は、VPN Server 側でTAPデバイスとしてブリッジ設定を有効にするとUPすることを想定し、事前に設定しておく。

```yaml:/etc/netplan/99-vpnserver.yaml&nbsp;(物理NICとブリッジする場合の例)
network:
    ethernets:
        ens192:
            dhcp4: false
            dhcp6: false
        tap_test:
            dhcp4: false
            dhcp6: false
    bridges:
        br_test:
            interfaces: [ens192, tap_test]
            addresses: [192.168.123.123/24]
            dhcp4: false
    version: 2
```

設定したら、ネットワークを反映させる。ブリッジI/FがUPしていることが確認できた。

```terminal:ネットワーク設定の反映と確認
$ sudo netplan apply
$ brctl show
bridge name     bridge id               STP enabled     interfaces
br_test         8000.3ed6f7a16a27       no
  → 注意: この時点では tap_test はUPしていない。
$ ip a
...(snip)...
36: br_test: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
```

# 4. 仮想HUBを作成する

VPN Serverは、vpncmdコマンドによるCLI設定と、windowsやmacで提供されている管理ツールでGUIでの設定が可能だ。
GUIでの設定は、Windowsで管理ツール(SoftEther VPN サーバー管理マネージャ)が用意されているので、それをインストールする。

SoftEther VPN サーバー管理マネージャのインストール手順は、以下のページが参考になった。
[SoftEther VPN Server Manager for Windows](https://qiita.com/naoyoshinori/items/aab1b3cc0a31dfc3557b)

ここでは、仮想HUB「TEST」を作成し、TAPデバイスとブリッジさせることにする。

ローカルブリッジ設定から新しいローカルブリッジの定義のフォームで、仮想HUB「TEST」を選択、「新しい tap デバイスとのブリッジ接続」を選択し、「新しい tap デバイス名」に「test」を入力し、「ローカルブリッジを追加」をする。

![fig1.png](https://qiita-image-store.s3.amazonaws.com/0/287776/e7cf6437-f06d-8597-bbd2-03c3d03ae445.png)

追加されるtap デバイスは、ubuntuから `tap_test` のように、`tap_`+「新しい tap デバイス名」ですぐに認識される。

```terminal:tapデバイスの確認
$ brctl show
bridge name     bridge id               STP enabled     interfaces
br_test         8000.3ed6f7a16a27       no              tap_test
```

これで、br_test のブリッジI/Fと仮想HUB「TEST」を接続することができた。

# 5. ソースからビルドして再インストールする (オプション)

オープンソース版のSoftetherでは、以下のURLに記載があるようにエンタープライズ向けの機能が制限されている。

[Softether 現在の制限事項](https://ja.softether.org/3-spec/cureent_limitations)

- DoS 攻撃防御機能
- RADIUS / NT ドメインでのユーザー認証
- RSA 証明書認証
- 詳細なパケットログ機能
- 接続元 IP アクセス制御リスト機能
- syslog 転送機能

しかしながら、自己責任となるが、ソースを修正してビルドすれば、これらの機能を利用することができる。(ソースにそのような記載がある。)

すでにインストールしてあるRTM版softetherの同バージョンのソースコード(Source Code)を取得する。
[Git Hub (SoftEtherVPN_Stable)](https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/releases)

```terminal:ビルドに必要なパッケージのインストール
$ sudo apt install build-essential
$ sudo apt install libreadline-dev libssl-dev libncurses-dev libz-dev
```

```terminal:softetherのソースコードのダウンロード
$ mkdir -p ~/src/vpnserver/
$ cd ~/src/vpnserver/
$ wget https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/archive/v4.29-9680-rtm.tar.gz
$ tar zxvf v4.29-9680-rtm.tar.gz
$ cd SoftEtherVPN_Stable-4.29-9680-rtm
```

ここで`src/Cedar/Server.c.`を修正して、制限を解除する。

```diff:diff&nbsp;-up&nbsp;src/Cedar/Server.c.orig&nbsp;src/Cedar/Server.c
--- src/Cedar/Server.c.orig     2019-02-28 20:13:45.000000000 +0900
+++ src/Cedar/Server.c  2019-03-24 05:44:02.344012456 +0900
@@ -10854,7 +10854,7 @@ bool SiIsEnterpriseFunctionsRestrictedOn

        if (StrCmpi(region, "JP") == 0 || StrCmpi(region, "CN") == 0)
        {
-               ret = true;
+//             ret = true;
        }

        return ret;
```

ビルドする。

```terminal:softetherの再ビルド
$ ./configure
$ make
```

置き換えに必要なファイルが出来上がったので、置き換え前にvpnserverのバックアップをしておく。

```terminal:softetherのバックアップ
$ sudo su -
# systemctl stop vpnserver
# cd /usr/local
# cp -rp vpnserver vpnserver.bak
# cd /usr/local/vpnserver
```

OSにインストールしてあるライブラリを使えるように、RTM版vpnserverの`Makefile`を修正する。

```diff:diff&nbsp;-up&nbsp;Makefile.orig&nbsp;Makefile
--- Makefile.orig       2019-03-24 04:21:24.946774797 +0900
+++ Makefile    2019-03-24 19:01:07.428996308 +0900
@@ -14,7 +14,7 @@ else
        NO_PIE_OPTION=
 endif

-OPTIONS=$(NO_PIE_OPTION) -O2 -fsigned-char -pthread -m64 -lm -ldl -lrt -lpthread -L./ lib/libssl.a lib/libcrypto.a lib/libiconv.a lib/libcharset.a lib/libedit.a lib/libncurses.a lib/libz.a lib/libintelaes.a
+OPTIONS=$(NO_PIE_OPTION) -O2 -fsigned-char -pthread -m64 -lm -ldl -lrt -lpthread -lssl -lcrypto -lreadline -lncurses -lz

 default:
        @./.install.sh
@@ -25,14 +25,6 @@ default:

 i_read_and_agree_the_license_agreement:
        @echo "Preparing SoftEther VPN Server..."
-       -ranlib lib/libcharset.a
-       -ranlib lib/libcrypto.a
-       -ranlib lib/libedit.a
-       -ranlib lib/libiconv.a
-       -ranlib lib/libintelaes.a
-       -ranlib lib/libncurses.a
-       -ranlib lib/libssl.a
-       -ranlib lib/libz.a
        -ranlib code/vpnserver.a
        $(CC) code/vpnserver.a $(OPTIONS) -o vpnserver
        -ranlib code/vpncmd.a
```

修正したRTM版vpnserverを再ビルド(リンク)する。

```terminal:ライブラリの置き換え
$ cd ~/src/vpnserver/SoftEtherVPN_Stable-4.29-9680-rtm/
$ sudo cp -rp tmp/as/vpnserver.a /usr/local/vpnserver/code
$ sudo cp -rp tmp/as/vpncmd.a /usr/local/vpnserver/code
$ sudo cp -rp bin/vpncmd/hamcore.se2 /usr/local/vpnserver/
$ sudo su -
# cd /usr/local/vpnserver/
# make
# find . -type f | chmod 600
# find . -type d | chmod 700
# chmod u+x .install.sh vpncmd vpnserver
# chown -R root:root /usr/local/vpnserver/
# systemctl start vpnserver
```

# 最後に

インストール後の設定についてもメモを投稿しているので、リンクしておく。

[softetherのちょっとしたセキュリティ向上設定](https://qiita.com/rimksky/items/ea62876bc154b9bfca76#%E3%83%A6%E3%83%BC%E3%82%B6%E8%AA%8D%E8%A8%BC%E3%81%A7%E7%BD%B2%E5%90%8D%E6%B8%88%E3%81%BF%E8%A8%BC%E6%98%8E%E6%9B%B8%E8%AA%8D%E8%A8%BC%E3%82%92%E6%9C%89%E5%8A%B9%E3%81%AB%E3%81%99%E3%82%8B)

以上