Linux: フリーソフト「SoftEther VPN」を使用してテレワーク用VPNサーバを構築してみる

 SoftEther VPN を用いて会社のテレワーク用VPNサーバを構築する機会があったので、今後同様の構築が必要となった場合に備えてメモしておきます。

###### 使用したディストリビューション：

CentOS 8-Stream
ベース環境：サーバー(GUI使用)
選択した環境用のその他のソフトウェア：なし

# 0.  SoftEther VPN とは

 SoftEther VPN は、筑波大学で開発されたオープンソースのVPNソフトウェアです。

[SoftEther VPN プロジェクト] (https://ja.softether.org)

 SoftEther VPN には「Server」「Client」「Bridge」の3つのソフトウェアがありますが、今回は「Server」をLinuxサーバにインストールしてVPNサーバを構築します。

なお、本記事は SoftEther VPN の細かい設定については記載しません。
 SoftEther VPN がサーバ上で正常に稼働するところまでを目指します。

# 1. 準備

 SoftEther VPN をインストールする前に、インストール先のサーバの状態を確認します。

まずは、OS/CPU/メモリ/ディスクが適切な状態かを確認します。
動作条件は以下の通りです。

[SoftEther VPN プロジェクト - 仕様] (https://ja.softether.org/3-spec)

下記の例だと、

* OS：Linux 4.18.0

* CPU：Intel 64bit

* 空きメモリ：1.1G

* 空きディスク：66G

であるため、 SoftEther VPN の動作条件を満たします。

```Linux:Linux
[root@testhost ~]# uname -a
Linux testhost 4.18.0-331.el8.x86_64 #1 SMP Thu Aug 19 16:49:03 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux
[root@testhost ~]# grep "model name" /proc/cpuinfo
model name      : Intel(R) Core(TM) i5 CPU       U 560  @ 1.33GHz
model name      : Intel(R) Core(TM) i5 CPU       U 560  @ 1.33GHz
model name      : Intel(R) Core(TM) i5 CPU       U 560  @ 1.33GHz
model name      : Intel(R) Core(TM) i5 CPU       U 560  @ 1.33GHz
[root@testhost ~]# getconf LONG_BIT
64
[root@testhost ~]# free -h
               total        used        free      shared  buff/cache   available
Mem:           1.6Gi       217Mi       1.1Gi       9.0Mi       339Mi       1.3Gi
Swap:          3.8Gi          0B       3.8Gi
[root@testhost ~]# df -h /usr/local
Filesystem                    Size  Used Avail Use% Mounted on
/dev/mapper/cs_testhost-root   70G  4.9G   66G   7% /
```

次に、必要なパッケージをインストールします。
対象は以下の通りです。

[SoftEther VPN プロジェクト - 7.3 Linuxへのインストールと初期設定] (https://ja.softether.org/4-docs/1-manual/7/7.3)

上記のリストにはパッケージ名が記載されていないものがいくつかあります。
それらは、それぞれ次のパッケージ名に対応します。

* パッケージファイル展開用の tar や gzip などのソフトウェア
→ tar , gzip

* cat や cp などの基本的なファイル操作ユーティリティ
→ coreutils

* 日本語環境で使用するための EUC-JP や UTF-8 などのコードページテーブル
→ glibc-langpack-ja

また、下記のパッケージは今回は不要です。

* chkconfig システムユーティリティ
→ 今回は systemd を用いて自動起動を設定するため不要

* pthread ライブラリ
→  glibc に含まれるため不要

加えて、上記リストには記載されていませんが、ビルドに使用するため次のパッケージも必要となります。

* make

まずは、以下のコマンドを入力して各パッケージがインストール済みかどうかを確認します。

```Linux:Linux
[root@testhost ~]# dnf list installed | grep -wE "(gcc|binutils|tar|gzip|coreutils|glibc|zlib|openssl|readline|ncurses|make)"
binutils.x86_64                                    2.30-108.el8                                  @baseos
coreutils.x86_64                                   8.30-12.el8                                   @baseos
coreutils-common.x86_64                            8.30-12.el8                                   @baseos
glibc.x86_64                                       2.28-162.el8                                  @baseos
glibc-common.x86_64                                2.28-162.el8                                  @baseos
glibc-langpack-en.x86_64                           2.28-162.el8                                  @baseos
glibc-langpack-ja.x86_64                           2.28-162.el8                                  @baseos
gzip.x86_64                                        1.9-12.el8                                    @baseos
ncurses.x86_64                                     6.1-9.20180224.el8                            @baseos
ncurses-base.noarch                                6.1-9.20180224.el8                            @baseos
ncurses-libs.x86_64                                6.1-9.20180224.el8                            @baseos
openssl.x86_64                                     1:1.1.1k-4.el8                                @baseos
openssl-libs.x86_64                                1:1.1.1k-4.el8                                @baseos
openssl-pkcs11.x86_64                              0.4.10-2.el8                                  @baseos
readline.x86_64                                    7.0-10.el8                                    @baseos
tar.x86_64                                         2:1.30-5.el8                                  @baseos
xmlsec1-openssl.x86_64                             1.2.25-4.el8                                  @appstream
zlib.x86_64                                        1.2.11-17.el8                                 @baseos
```

上記の例だと、「gcc」「make」の2つが不足しています。
 dnf コマンドを用いて、上記2つのパッケージをインストールします。
また、インストール済みパッケージの最新化も同時に行っておきます。


```Linux:Linux
[root@testhost ~]# dnf update
Last metadata expiration check: 0:23:18 ago on Tue 24 Aug 2021 02:58:34 AM EDT.
Dependencies resolved.
Nothing to do.
Complete!
[root@testhost ~]# dnf -y install gcc make
Last metadata expiration check: 0:26:58 ago on Tue 24 Aug 2021 02:58:34 AM EDT.
Dependencies resolved.
--------------- ( 省略 ) ---------------

Complete!
[root@testhost ~]# dnf list installed | grep -wE "(gcc|binutils|tar|gzip|coreutils|glibc|zlib|openssl|readline|ncurses|make)"
binutils.x86_64                                    2.30-108.el8                                  @baseos
coreutils.x86_64                                   8.30-12.el8                                   @baseos
coreutils-common.x86_64                            8.30-12.el8                                   @baseos
gcc.x86_64                                         8.5.0-3.el8                                   @appstream
glibc.x86_64                                       2.28-162.el8                                  @baseos
glibc-common.x86_64                                2.28-162.el8                                  @baseos
glibc-debel.x86_64                                 2.28-162.el8                                  @baseos
glibc-header.x86_64                                2.28-162.el8                                  @baseos
glibc-langpack-en.x86_64                           2.28-162.el8                                  @baseos
glibc-langpack-ja.x86_64                           2.28-162.el8                                  @baseos
gzip.x86_64                                        1.9-12.el8                                    @baseos
make.x86_64                                        1:4.2.1-10.el8                                @baseos
ncurses.x86_64                                     6.1-9.20180224.el8                            @baseos
ncurses-base.noarch                                6.1-9.20180224.el8                            @baseos
ncurses-libs.x86_64                                6.1-9.20180224.el8                            @baseos
openssl.x86_64                                     1:1.1.1k-4.el8                                @baseos
openssl-libs.x86_64                                1:1.1.1k-4.el8                                @baseos
openssl-pkcs11.x86_64                              0.4.10-2.el8                                  @baseos
readline.x86_64                                    7.0-10.el8                                    @baseos
tar.x86_64                                         2:1.30-5.el8                                  @baseos
xmlsec1-openssl.x86_64                             1.2.25-4.el8                                  @appstream
zlib.x86_64                                        1.2.11-17.el8                                 @baseos
```

これで、 SoftEther VPN Server をインストールする準備が整いました。

# 2. ソフトウェアのダウンロード

以下のサイトから、ソフトウェアをダウンロードします。

[SoftEther ダウンロード センター] (https://www.softether-download.com/ja.aspx?product=softether)

選択項目は以下の通りです。

* ダウンロードするソフトウェア：SoftEther VPN (Freeware)

* コンポーネント：SoftEther VPN Server

* プラットフォーム：Linux

* CPU：項番1で確認したもの。今回は Intel x64 / AMD64 (64bit) を選択。

上記項目を選択して、先頭に出てきた最新版のソフトウェアをダウンロードします。
今回は SoftEther VPN Server (Ver 4.38, Build 9760, rtm) でした。

# 3. ソフトウェアのビルド

項番2でダウンロードしたファイルを構築予定のサーバ上に配置して、いよいよ構築を初めます。
今回は root ユーザのホームディレクトリである /root に配置しました。

まずは、配置した .tar.gz ファイルを展開してください。 vpnserver というディレクトリが出来ればOKです。

```Linux:Linux
[root@testhost ~]# ls -l
total 7364
-rw-------. 1 root     root        1128 Aug 24 01:33 anaconda-ks.cfg
-rw-r--r--. 1 root     root        1409 Aug 24 01:51 initial-setup-ks.cfg
-rw-rw-r--. 1 testuser testuser 7529219 Aug 24 01:59 softether-vpnserver-v4.38-9760-rtm-2021.08.17-linux-x64-64bit.tar.gz
[root@testhost ~]# tar xzf softether-vpnserver-v4.38-9760-rtm-2021.08.17-linux-x64-64bit.tar.gz
[root@testhost ~]# ls -l
total 7364
-rw-------. 1 root     root        1128 Aug 24 01:33 anaconda-ks.cfg
-rw-r--r--. 1 root     root        1409 Aug 24 01:51 initial-setup-ks.cfg
-rw-rw-r--. 1 testuser testuser 7529219 Aug 24 01:59 softether-vpnserver-v4.38-9760-rtm-2021.08.17-linux-x64-64bit.tar.gz
drwxrwxrwx. 4 root     root         265 Aug 17 09:38 vpnserver
```

次に、作成された vpnserver ディレクトリに移動して、ソフトウェアのビルドを行います。
 Makefile ファイルは既に存在するため、 make コマンドを入力するだけでビルドは完了します。
ここでエラーが出るようなら、項番1の項目について何か不足がないかを再度確認してみてください。

```Linux:Linux
[root@testhost ~]# cd vpnserver
[root@testhost vpnserver]# ls -l Makefile
-rwxrwxrwx. 1 root root 3577 Aug 17 09:38 Makefile
[root@testhost vpnserver]# make
--------------------------------------------------------------------

SoftEther VPN Server (Ver 4.38, Build 9760, Intel x64 / AMD64) for Linux Build Utility
Copyright (c) SoftEther Project at University of Tsukuba, Japan. All Rights Reserved.
--------------- ( 省略 ) ---------------

make[1]: Leaving directory '/root/vpnserver'
```

# 4. ソフトウェアの配置

項目3でビルドしたソフトウェアを、適当な箇所に配置します。
公式では /usr/local ディレクトリが推奨されていますので、今回はそれに従います。

```Linux:Linux
[root@testhost vpnserver]# cd ..
[root@testhost ~]# ls -ld vpnserver
drwxrwxrwx. 5 root root 4096 Aug 24 07:09 vpnserver
[root@testhost ~]# mv vpnserver /usr/local
[root@testhost ~]# ls -ld /usr/local/vpnserver
drwxrwxrwx. 5 root root 4096 Aug 24 07:09 /usr/local/vpnserver
```

# 5. ソフトウェアの権限修正

項目4の配置後、一般ユーザの無用なアクセスを防ぐために各ファイル及びディレクトリのパーミッションを修正します。
この際、 vpncmd 及び vpnserver は実行コマンドなので、実行権限が不足しないように 700 で修正してください。
その他のファイルは 600 で、ディレクトリは 700 で修正します。
オーナー及びグループについては今回は修正していませんが、 root 以外の値の場合は root に修正してください。

```Linux:Linux
[root@testhost ~]# cd /usr/local/vpnserver
[root@testhost vpnserver]# ls -lR
.:
total 12656
-rwxrwxrwx. 1 root root      82 Aug 17 09:38 Authors.txt
drwx------. 2 root root       6 Aug 24 07:09 chain_certs
drwxrwxrwx. 2 root root      41 Aug 24 07:09 code
-rwxrwxrwx. 1 root root 2009248 Aug 17 09:38 hamcore.se2
-rw-------. 1 root root     867 Aug 24 07:09 lang.config
drwxrwxrwx. 2 root root     170 Aug 24 07:09 lib
-rwxrwxrwx. 1 root root    3577 Aug 17 09:38 Makefile
-rwxrwxrwx. 1 root root   32256 Aug 17 09:38 ReadMeFirst_Important_Notices_cn.txt
-rwxrwxrwx. 1 root root   37747 Aug 17 09:38 ReadMeFirst_Important_Notices_en.txt
-rwxrwxrwx. 1 root root   52554 Aug 17 09:38 ReadMeFirst_Important_Notices_ja.txt
-rwxrwxrwx. 1 root root    3587 Aug 17 09:38 ReadMeFirst_License.txt
-rwxr-xr-x. 1 root root 5400688 Aug 24 07:09 vpncmd
-rwxr-xr-x. 1 root root 5400760 Aug 24 07:09 vpnserver

./chain_certs:
total 0

./code:
total 8972
-rwxrwxrwx. 1 root root 4591850 Aug 24 07:09 vpncmd.a
-rwxrwxrwx. 1 root root 4591452 Aug 24 07:09 vpnserver.a

./lib:
total 7944
-rwxrwxrwx. 1 root root    7288 Aug 24 07:09 libcharset.a
-rwxrwxrwx. 1 root root 5030594 Aug 24 07:09 libcrypto.a
-rwxrwxrwx. 1 root root  278022 Aug 24 07:09 libedit.a
-rwxrwxrwx. 1 root root  990842 Aug 24 07:09 libiconv.a
-rwxrwxrwx. 1 root root   30606 Aug 24 07:09 libintelaes.a
-rwxrwxrwx. 1 root root  631542 Aug 24 07:09 libintelaes.a
-rwxrwxrwx. 1 root root  987510 Aug 24 07:09 libssl.a
-rwxrwxrwx. 1 root root  120698 Aug 24 07:09 libz.a
-rwxrwxrwx. 1 root root   40585 Aug 17 09:38 License.txt
[root@testhost vpnserver]# chmod 600 *
[root@testhost vpnserver]# chmod 700 vpncmd vpnserver chain_certs code lib
[root@testhost vpnserver]# chmod 600 code/*
[root@testhost vpnserver]# chmod 600 lib/*
[root@testhost vpnserver]# ls -lR
.:
total 12656
-rw-------. 1 root root      82 Aug 17 09:38 Authors.txt
drwx------. 2 root root       6 Aug 24 07:09 chain_certs
drwx------. 2 root root      41 Aug 24 07:09 code
-rw-------. 1 root root 2009248 Aug 17 09:38 hamcore.se2
-rw-------. 1 root root     867 Aug 24 07:09 lang.config
drwx------. 2 root root     170 Aug 24 07:09 lib
-rw-------. 1 root root    3577 Aug 17 09:38 Makefile
-rw-------. 1 root root   32256 Aug 17 09:38 ReadMeFirst_Important_Notices_cn.txt
-rw-------. 1 root root   37747 Aug 17 09:38 ReadMeFirst_Important_Notices_en.txt
-rw-------. 1 root root   52554 Aug 17 09:38 ReadMeFirst_Important_Notices_ja.txt
-rw-------. 1 root root    3587 Aug 17 09:38 ReadMeFirst_License.txt
-rwx------. 1 root root 5400688 Aug 24 07:09 vpncmd
-rwx------. 1 root root 5400760 Aug 24 07:09 vpnserver

./chain_certs:
total 0

./code:
total 8972
-rw-------. 1 root root 4591850 Aug 24 07:09 vpncmd.a
-rw-------. 1 root root 4591452 Aug 24 07:09 vpnserver.a

./lib:
total 7944
-rw-------. 1 root root    7288 Aug 24 07:09 libcharset.a
-rw-------. 1 root root 5030594 Aug 24 07:09 libcrypto.a
-rw-------. 1 root root  278022 Aug 24 07:09 libedit.a
-rw-------. 1 root root  990842 Aug 24 07:09 libiconv.a
-rw-------. 1 root root   30606 Aug 24 07:09 libintelaes.a
-rw-------. 1 root root  631542 Aug 24 07:09 libintelaes.a
-rw-------. 1 root root  987510 Aug 24 07:09 libssl.a
-rw-------. 1 root root  120698 Aug 24 07:09 libz.a
-rw-------. 1 root root   40585 Aug 17 09:38 License.txt
```

上記で変更したのは Linux の通常のパーミッションですが、それとは別に SELinux のパーミッションにも注意が必要です。
特にホームディレクトリでビルド作業を行なっていたりした場合、 SELinux のパーミッションがホームディレクトリ向けとなっており、権限不足で正常にサービスが起動できないことがあります。
そのような場合は、 restorecon コマンドを使用してパーミッションを最適化してください。
上手くいかない場合は SELinux 自体を無効化するという方法もありますが、 VPN サーバは外部に開かれるサーバですので、安全性を考えると有効なままにしておきたいところです。

```Linux:Linux
[root@testhost vpnserver]# ls -ZR
.:
unconfined_u:object_r:admin_home_t:s0 Authors.txt  unconfined_u:object_r:admin_home_t:s0 ReadMeFirst_Important_Notices_cn.txt
unconfined_u:object_r:admin_home_t:s0 chain_certs  unconfined_u:object_r:admin_home_t:s0 ReadMeFirst_Important_Notices_en.txt
unconfined_u:object_r:admin_home_t:s0 code         unconfined_u:object_r:admin_home_t:s0 ReadMeFirst_Important_Notices_ja.txt
unconfined_u:object_r:admin_home_t:s0 hamcore.se2  unconfined_u:object_r:admin_home_t:s0 ReadMeFirst_License.txt
unconfined_u:object_r:admin_home_t:s0 lang.config  unconfined_u:object_r:admin_home_t:s0 vpncmd
unconfined_u:object_r:admin_home_t:s0 lib          unconfined_u:object_r:admin_home_t:s0 vpnserver
unconfined_u:object_r:admin_home_t:s0 Makefile  

./chain_certs:

./code:
unconfined_u:object_r:admin_home_t:s0 vpncmd.a  unconfined_u:object_r:admin_home_t:s0 vpnserver.a

./lib:
unconfined_u:object_r:admin_home_t:s0 libcharset.a unconfined_u:object_r:admin_home_t:s0 libiconv.a    unconfined_u:object_r:admin_home_t:s0 libssl.a
unconfined_u:object_r:admin_home_t:s0 libcrypto.a  unconfined_u:object_r:admin_home_t:s0 libintelaes.a unconfined_u:object_r:admin_home_t:s0 libz.a
unconfined_u:object_r:admin_home_t:s0 libedit.a    unconfined_u:object_r:admin_home_t:s0 libintelaes.a unconfined_u:object_r:admin_home_t:s0 License.txt
[root@testhost vpnserver]# restorecon -R .
[root@testhost vpnserver]# ls -ZR
.:
unconfined_u:object_r:usr_t:s0 Authors.txt  unconfined_u:object_r:usr_t:s0 ReadMeFirst_Important_Notices_cn.txt
unconfined_u:object_r:usr_t:s0 chain_certs  unconfined_u:object_r:usr_t:s0 ReadMeFirst_Important_Notices_en.txt
unconfined_u:object_r:usr_t:s0 code         unconfined_u:object_r:usr_t:s0 ReadMeFirst_Important_Notices_ja.txt
unconfined_u:object_r:usr_t:s0 hamcore.se2  unconfined_u:object_r:usr_t:s0 ReadMeFirst_License.txt
unconfined_u:object_r:usr_t:s0 lang.config  unconfined_u:object_r:usr_t:s0 vpncmd
unconfined_u:object_r:lib_t:s0 lib          unconfined_u:object_r:usr_t:s0 vpnserver
unconfined_u:object_r:usr_t:s0 Makefile  

./chain_certs:

./code:
unconfined_u:object_r:usr_t:s0 vpncmd.a  unconfined_u:object_r:usr_t:s0 vpnserver.a

./lib:
unconfined_u:object_r:lib_t:s0 libcharset.a unconfined_u:object_r:lib_t:s0 libiconv.a    unconfined_u:object_r:lib_t:s0 libssl.a
unconfined_u:object_r:lib_t:s0 libcrypto.a  unconfined_u:object_r:lib_t:s0 libintelaes.a unconfined_u:object_r:lib_t:s0 libz.a
unconfined_u:object_r:lib_t:s0 libedit.a    unconfined_u:object_r:lib_t:s0 libintelaes.a unconfined_u:object_r:lib_t:s0 License.txt
```

# 6. 動作チェック

SoftEther VPN Server の check コマンドを実行して、動作チェックを行います。

```Linux:Linux
[root@testhost vpnserver]# ./vpncmd /tools /cmd check
vpncmd command - SoftEther VPN Command Line Management Utility
SoftEther VPN Command Line Management Utility (vpncmd command)
--------------- ( 省略 ) ---------------

The command completed successfully.

```

 SoftEther VPN Server が正常に動作できる状態であることが確認できました。

以上で、 SoftEther VPN Server の基本的な構築は完了となります。

# 7. 起動/停止

それでは、実際に SoftEther VPN Server を起動と停止を行ってみます。
起動/停止はそれぞれ、 vpnserver コマンドに引数 start / stop を与えることで実行できます。

```Linux:Linux
[root@testhost vpnserver]# ps -ef | grep -v "grep" | grep "vpnserver"
[root@testhost vpnserver]# ./vpnserver start
The SoftEther VPN Server service has been started.

Let's get started by accessing to the following URL from your PC: 

--------------- ( 省略 ) ---------------
A TLS certificate warning will appear because the server uses self signed certificate by default. That is natural. Continue with ignoring the TLS warning.

[root@testhost vpnserver]# ps -ef | grep -v "grep" | grep "vpnserver"
root        2466       1  0 07:39 ?        00:00:00 /usr/local/vpnserver/vpnserver execsvc
root        2467    2466  0 07:39 ?        00:00:00 /usr/local/vpnserver/vpnserver execsvc
[root@testhost vpnserver]# ./vpnserver stop
Stopping the SoftEther VPN Server service ...
SoftEther VPN Server service has been stopped.
[root@testhost vpnserver]# ps -ef | grep -v "grep" | grep "vpnserver"
[root@testhost vpnserver]#
```

起動/停止が実施できました。

# 8. 自動起動設定

サーバ起動時に SoftEther VPN Server が自動的に起動するようにします。
公式ページには SysVinit による自動起動登録の方法が記載されていますが、最近のLinuxにおけるサービス管理の主流は systemd ですので、今回はそちらを採用します。

まずは設定ファイルを作成します。

```Linux:Linux
[root@testhost vpnserver]# cd /usr/lib/systemd/system
[root@testhost system]# vi vpnserver.service
```

設定ファイルの記載例を以下に示します。
あくまで一例ですので、ファイル名や細かい設定は多少変更することも可能です。

```Linux:vpnserver.service
[Unit]
Description = SoftEther VPN Server
After       = network.target

[Service]
Type      = forking
ExecStart = /usr/local/vpnserver/vpnserver start
ExecStop  = /usr/local/vpnserver/vpnserver stop
Restart   = always

[Install]
WantedBy = default.target
```

作成完了後、設定ファイルの再読み込みを実行して新しい設定を反映し、 systemctl コマンドから起動/停止を実施してみます。
正常に起動/停止ができない場合は、設定ファイルの内容やコマンドの権限に誤りがないかを確認してみてください。

```Linux:Linux
[root@testhost system]# systemctl daemon-reload
[root@testhost system]# systemctl is-active vpnserver.service
inactive
[root@testhost system]# ps -ef | grep -v "grep" | grep "vpnserver"
[root@testhost system]# systemctl start vpnserver.service
[root@testhost system]# systemctl is-active vpnserver.service
active
[root@testhost system]# ps -ef | grep -v "grep" | grep "vpnserver"
root        2817       1  0 07:53 ?        00:00:00 /usr/local/vpnserver/vpnserver execsvc
root        2818    2817  3 07:53 ?        00:00:00 /usr/local/vpnserver/vpnserver execsvc
[root@testhost system]# systemctl stop vpnserver.service
[root@testhost system]# systemctl is-active vpnserver.service
inactive
[root@testhost system]# ps -ef | grep -v "grep" | grep "vpnserver"
[root@testhost system]#
```

 systemctl コマンドで起動/停止が実施できることが確認できました。

それでは、いよいよ自動起動の登録を行います。

```Linux:Linux
[root@testhost system]# systemctl enable vpnserver.service
Created symlink /etc/systemd/system/default.target.wants/vpnserver.service → /usr/lib/systemd/system/vpnserver.service.
[root@testhost system]# systemctl is-enabled vpnserver.service
enabled
```

 SoftEther VPN Server が自動起動に登録できました。
サーバを再起動して、 SoftEther VPN Server が自動的に起動することを確認してください。

```Linux:Linux
[root@testhost ~]# systemctl is-active vpnserver.service
active
[root@testhost ~]# ps -ef | grep -v "grep" | grep "vpnserver"
root        1071       1  0 00:57 ?        00:00:00 /usr/local/vpnserver/vpnserver execsvc
root        1072    1071  0 00:57 ?        00:00:00 /usr/local/vpnserver/vpnserver execsvc
```

# 9. ログ関連

SoftEther VPN Server は定期的にログを出力しますが、その出力先はコマンドが配置されているディレクトリ(今回は /usr/local/vpnserver )の配下です。
SoftEther VPN Server は設定によってはログを大量に出力するので、ディスク容量が枯渇するリスクを考えると、できれば /var の配下に出力先を移動したいです。

ところが、SoftEther VPN Server にはログ出力先を変更する機能がありません。
ではどうすればよいかというと、 /var 配下のディレクトリにリンクを貼れば、出力先が実質的に /var 配下に変更された状態にできます。
なお、変更作業の際は、 SoftEther VPN Server は一旦停止してください。

```Linux:Linux
[root@testhost ~]# cd /var/log
[root@testhost log]# mkdir -m 700 vpnserver
[root@testhost log]# ls -ld vpnserver
drwx------. 2 root root 6 Aug 24 09:31 vpnserver
[root@testhost log]# cd /usr/local/vpnserver
[root@testhost vpnserver]# ls -ld *_log
drwx------. 2 root root  6 Aug 24 07:39 packet_log
drwx------. 3 root root 21 Aug 24 07:39 security_log
drwx------. 2 root root 30 Aug 24 07:39 server_log
[root@testhost vpnserver]# systemctl is-active vpnserver.service
active
[root@testhost vpnserver]# systemctl stop vpnserver.service
[root@testhost vpnserver]# systemctl is-active vpnserver.service
inactive
[root@testhost vpnserver]# mv *_log /var/log/vpnserver
[root@testhost vpnserver]# ls -l /var/log/vpnserver
drwx------. 2 root root  6 Aug 24 07:39 packet_log
drwx------. 3 root root 21 Aug 24 07:39 security_log
drwx------. 2 root root 30 Aug 24 07:39 server_log
[root@testhost vpnserver]# ln -s /var/log/vpnserver/packet_log packet_log
[root@testhost vpnserver]# ln -s /var/log/vpnserver/security_log security_log
[root@testhost vpnserver]# ln -s /var/log/vpnserver/server_log server_log
[root@testhost vpnserver]# ls -l *_log
lrwxrwxrwx. 1 root root 29 Aug 24 09:38 packet_log -> /var/log/vpnserver/packet_log
lrwxrwxrwx. 1 root root 31 Aug 24 09:38 security_log -> /var/log/vpnserver/security_log
lrwxrwxrwx. 1 root root 29 Aug 24 09:38 server_log -> /var/log/vpnserver/server_log
[root@testhost vpnserver]# ls -Z /var/log/vpnsrever
unconfined_u:object_r:usr_t:s0 packet_log  unconfined_u:object_r:usr_t:s0 security_log  unconfined_u:object_r:usr_t:s0 server_log
[root@testhost vpnserver]# restorecon -R /var/log/vpnserver
[root@testhost vpnserver]# ls -Z /var/log/vpnsrever
unconfined_u:object_r:var_log_t:s0 packet_log  unconfined_u:object_r:var_log_t:s0 security_log  unconfined_u:object_r:var_log_t:s0 server_log
[root@testhost vpnserver]# systemctl is-active vpnserver.service
inactive
[root@testhost vpnserver]# systemctl start vpnserver.service
[root@testhost vpnserver]# systemctl is-active vpnserver.service
active
```

もう1点ログ関連で注意すべきは、 SoftEther VPN Server にはログを定期的に削除する機能が存在しないことです。
そのため、一定期間が過ぎたログを定期的に削除する処理を cron 等で別途作成する必要があります。
以下の例では、毎日 01:00 に1年前のログを削除しています。

```Linux:/etc/crontab
--------------- ( 前略 ) ---------------
# *  *  *  *  * user-name  command to be executed
  0  1  *  *  *      root  /usr/bin/find /var/log/vpnserver -type f -mtime +365 | xargs -r rm -f
--------------- ( 後略 ) ---------------
```

# 10. ファイアウォール関連

 SoftEther VPN Server 自体は上記の作業を行えば動作します。
ですが、いくら構築しても肝心のサーバへの接続が通らないとせっかく起動したプロセスに通信できません。

これでは意味がないので、VPNサーバ上でファイアウォールが起動しているかを確認し、起動している場合は SoftEther VPN Server が使用するポートに穴を開けるように変更します。
ポート番号は SoftEther VPN Server の設定で変更できますが、今回はデフォルトのポート番号の1つである 443/tcp に対して穴を開けるように設定を変更し、リロードしてその設定を反映します。

```Linux:Linux
[root@testhost ~]# systemctl is-active firewalld
active
[root@testhost ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s25
  sources:
  services: cockpit dhcpv6-client ssh
  ports:
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
[root@testhost ~]# firewall-cmd --zone=public --add-port=443/tcp --permanent
success
[root@testhost ~]# firewall-cmd --reload
success
[root@testhost ~]# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: enp0s25
  sources:
  services: cockpit dhcpv6-client ssh
  ports: 443/tcp
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
```

ルータ等のネットワーク機器がある場合は、そちらの設定にも注意してください。

なお、IPアドレスでのフィルタリングは今回は設定しておりません。
無論 firewalld で設定することも可能ですが、 SoftEther VPN Server の機能にもIPアドレスによるフィルタリングは存在するため、必ずしも firewalld 側でフィルタを行う必要はありません。
どのようにアクセス制限を行うかについては、サーバの利用想定やネットワークの構成等、様々な要素を勘案して総合的に判断してください。