【図解】SoftEther VPNを使ってLinux上でVPNサーバの環境構築をする

# 1. はじめに

私が関わっているプロジェクトの中で、関係者だけが使える研究・開発環境が欲しいという要望があり、VPNを導入することにしました。
そこで今回はLinux上でVPNの環境を構築した手順を紹介していきます。
VPNについては、「[4-1. VPNについて](#4-1-vpnについて)」で説明します。

# 2. 環境
- Ubuntu 20.04.6 LTS

# 3. 手順

## 3-1. サーバ側

※権限がないと言われたらコマンドの一番最初に`sudo`をつけてください。

### 3-1-1. SoftEther VPNのインストール
まずはパッケージマネージャのアップデートを行う。
```bash
sudo apt update
```

次に、必要なパッケージをインストールする。
```bash
sudo apt install -y make gcc
```

次に、SoftEther VPN Serverのダウンロード先リンクを選択する。

以下のサイトから自分にあった環境を選択する。

https://www.softether-download.com/ja.aspx?product=softether

※SoftEther VPNで検索→「ダウンロード」を選択→「SoftEther VPNのダウンロード」を選択してこのページに行ける。

私は下の画像のような選択をした。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2906464/b74b4701-dfba-f749-c7e5-b741b4d6ac94.png)

ただし、「CPUを選択」の部分に関しては`uname -m`のコマンドを入力することで確認できる。

https://zenn.dev/k_kazukiiiiii/articles/b981c77e5ba83d

選択したら、一番上に出てきた最新ビルドと書かれたもののリンクを右クリックしてコピーしておく。

コピーしたリンク先のファイルを`wget`コマンドを使ってダウンロードする。
```bash
wget https://jp.softether-download.com/files/softether/v4.43-9799-beta-2023.08.31-tree/Linux/SoftEther_VPN_Server/64bit_-_Intel_x64_or_AMD64/softether-vpnserver-v4.43-9799-beta-2023.08.31-linux-x64-64bit.tar.gz
```
※URLは各自コピーしたものに置き換える。

ファイルのダウンロードが終わったら、そのファイルを解凍する。
```bash
tar -xzvf softether-vpnserver-v4.43-9799-beta-2023.08.31-linux-x64-64bit.tar.gz
```
※ファイルは各自のものに置き換える。

解答すると、`vpnserver`フォルダが作成される。

そのフォルダの中に入り、ビルドをする。
```bash
cd vpnserver/
```

```bash
make
```

ビルドが終わったらディレクトリを`/usr/local/`に移動する。
※パスについては[公式ドキュメント 7.3.1 推奨するオペレーションシステムの構成](https://ja.softether.org/4-docs/1-manual/7/7.3)に従った

```bash
cd ..
```
```bash
sudo mv vpnserver/ /usr/local/
```
これにより、`/usr/local/vpnserver`に移動した。

最後にファイルの所有者と権限を変更する。
```bash
cd /usr/local
```

```bash
sudo chown -R root:root vpnserver
```

```bash
cd vpnserver
```

```bash
sudo chmod 600 *
```

```bash
sudo chmod 700 vpncmd
```

```bash
sudo chmod 700 vpnserver
```

以下のように表示されればOK。
```bash
xxx@xxx:/usr/local/vpnserver$ ll
-rw------- 1 root root 20245 12ŒŽ 8 16:14 License_ReadMeFirst.txt
-rw------- 1 root root 20317 12ŒŽ 8 16:14 License_ReadMeFirstSjis.txt
-rw------- 1 root root 30210 12ŒŽ 8 16:14 License_ReadMeFirstUtf.txt
-rw------- 1 root root 609 12ŒŽ 8 16:14 Makefile
-rw------- 1 root root 4018399 12ŒŽ 8 16:14 hamcore.se2
-rw------- 1 root root 1942994 12ŒŽ 9 02:23 libcrypto.a
-rw------- 1 root root 336070 12ŒŽ 9 02:23 libssl.a
-rwx------ 1 root root 1814216 12ŒŽ 9 02:23 vpncmd*
-rw------- 1 root root 1630858 12ŒŽ 9 02:23 vpncmd.a
-rwx------ 1 root root 1814120 12ŒŽ 9 02:23 vpnserver*
-rw------- 1 root root 1630304 12ŒŽ 9 02:23 vpnserver.a
```

### 3-1-2. SoftEther VPN Serverの開始
systemdを用いた方法で行う。

```bash
sudo vi /etc/systemd/system/vpnserver.service
```

```/etc/systemd/system/vpnserver.service
[Unit]
Description=SoftEther VPN Server
After=network.target network-online.target

[Service]
ExecStart=/usr/local/vpnserver/vpnserver start
ExecStop=/usr/local/vpnserver/vpnserver stop
Type=forking
RestartSec=3s

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

ファイルの変更をsystemdに反映する。
```bash
sudo systemctl daemon-reload
```

vpnserverのサービスを開始する。
```bash
sudo systemctl start vpnserver
```

サービスの自動起動も有効にしておく。
```bash
sudo systemctl enable vpnserver
```

### 3-1-3. SoftEther VPN Serverの設定
```bash
sudo ./vpncmd
```
で対話式のユーザインタフェースで設定を始める。

下のように表示されたら1を選択する。
```bash
vpncmd command - SoftEther VPN Command Line Management Utility
SoftEther VPN Command Line Management Utility (vpncmd command)
Version 4.38 Build 9760   (English)
Compiled 2021/08/17 22:32:49 by buildsan at crosswin
Copyright (c) SoftEther VPN Project. All Rights Reserved.

By using vpncmd program, the following can be achieved.

1. Management of VPN Server or VPN Bridge
2. Management of VPN Client
3. Use of VPN Tools (certificate creation and Network Traffic Speed Test Tool)

Select 1, 2 or 3:
```

そのあとの2つの質問はそのまま何も入力せずにEnterを押す。
```bash
Specify the host name or IP address of the computer that the destination VPN Server or VPN Bridge is operating on.
By specifying according to the format 'host name:port number', you can also specify the port number.
(When the port number is unspecified, 443 is used.)
If nothing is input and the Enter key is pressed, the connection will be made to the port number 8888 of localhost (this computer).
Hostname of IP Address of Destination:

If connecting to the server by Virtual Hub Admin Mode, please input the Virtual Hub name.
If connecting by server admin mode, please press Enter without inputting anything.
Specify Virtual Hub Name:
Connection has been established with VPN Server "localhost" (port 443).

You have administrator privileges for the entire VPN Server.
```

#### 3-1-3-1. 仮想HUBの作成と選択
仮想HUBを作成する。
```bash
HubCreate main
```
※`main`が仮想HUBの名前

`HubList`と入力して、作成した仮想HUBの情報が表示されればOK。

作成した仮想HUBを選択し、設定を始める。
```bash
Hub main
```

以下のように表示されればOK。
```bash
VPN Server>Hub main
Hub command - Select Virtual Hub to Manage
The Virtual Hub "main" has been selected.
The command completed successfully.

VPN Server/main>
```

#### 3-1-3-2. ユーザの作成
ユーザを作成する。
```bash
UserCreate user1 /GROUP:none /REALNAME:none /NOTE:none
```
※`user1`の部分を変える。

ユーザのパスワードを設定する。
```bash
UserPasswordSet user1
```

`UserList`と入力して、作成したユーザの情報が表示されればOK。

ここで設定したユーザ名とパスワードは、クライアントがVPNに接続するとき必要であるためメモしておく。

#### 3-1-3-3. L2TP over IPsecの有効化

SoftEhter VPNがサポートするVPNプロトコルは色々ある[^1]が、iPhoneで使えるプロトコルがIKEv2、IPsec、L2TPの3つであったため今回はL2TP over IPsecを選択した。
[^1]: 筑波大学大学院研究プロジェクト SoftEther VPN. SoftEther VPN Serverがサポートする　VPN　プロトコル. https://ja.softether.org/3-spec

```bash
IPsecEnable /L2TP:yes /L2TPRAW:no /ETHERIP:no /DEFAULTHUB:main
```
事前共有キーを入力するように求められるので設定する。

設定した事前共有キーはクライアントがVPNに接続するとき必要であるためメモしておく。

#### 3-1-3-4. SecureNAT機能の有効化
SoftEther VPNのために独自に開発された[SecureNAT](https://ja.softether.org/4-docs/1-manual/3/3.7)機能というものがある

SecureNATについては、「[4-2. SecureNATについて](#4-2-securenatについて)」で解説している。

```bash
SecureNatEnable
```

#### 3-1-3-5. 仮想DHCPサーバの設定
以下のコマンドを入力する。
```bash
DhcpSet /START:192.168.30.10 /END:192.168.30.200 /MASK:255.255.255.0 /EXPIRE:7200 /GW:192.168.30.1 /DNS:192.168.30.1 /DNS2:none /DOMAIN:none /LOG:yes /PUSHROUTE:"xxx.xxx.xxx.xxx/yyy.yyy.yyy.yyy/192.168.30.1"
```
ただし、デフォルトゲートウェイなどの192で始まっているIPアドレスについては任意のものを設定できる。
しかし、クライアントの環境によってはWi-Fiに接続できなくなったりすることがあったため注意する。
今回は[公式ドキュメント](https://ja.softether.org/4-docs/1-manual/6/6.4_VPN_Server_%2F%2F_VPN_Bridge_Management_Command_Reference_(For_Virtual_Hub)#6.4.102_.22DhcpSet.22:_SecureNAT_.E6.A9.9F.E8.83.BD.E3.81.AE.E4.BB.AE.E6.83.B3_DHCP_.E3.82.B5.E3.83.BC.E3.83.90.E3.83.BC.E6.A9.9F.E8.83.BD.E3.81.AE.E8.A8.AD.E5.AE.9A.E3.81.AE.E5.A4.89.E6.9B.B4)に書かれていた例を参考にした。

また、`xxx.xxx.xxx.xxx/yyy.yyy.yyy.yyy`の部分を自身の環境に合わせて変える。
自身の環境の確認方法を紹介する。

まず、`net-tools`パッケージをインストールする。
```bash
sudo apt install -y net-tools
```

以下のコマンドを入力する。
```bash
route
```

例えば、以下のように表示されれば、`xxx.xxx.xxx.xxx/yyy.yyy.yyy.yyy`を`10.0.0.0/255.255.255.0`とする。

```bash
xxx@xxx:~$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         _gateway        0.0.0.0         UG    100    0        0 ens1s0
10.0.0.0        0.0.0.0         255.255.255.0   U     100    0        0 ens1s0
```

個人的にこのDhcpSetコマンドが一番ややこしかったため詳しく解説する。

まず、[DhcpSetコマンドのパラメータ引数](https://ja.softether.org/4-docs/1-manual/6/6.4_VPN_Server_%2F%2F_VPN_Bridge_Management_Command_Reference_(For_Virtual_Hub)#6.4.102_.22DhcpSet.22:_SecureNAT_.E6.A9.9F.E8.83.BD.E3.81.AE.E4.BB.AE.E6.83.B3_DHCP_.E3.82.B5.E3.83.BC.E3.83.90.E3.83.BC.E6.A9.9F.E8.83.BD.E3.81.AE.E8.A8.AD.E5.AE.9A.E3.81.AE.E5.A4.89.E6.9B.B4)を以下のテーブルにまとめる。
| パラメータ引数 | 説明 |
|:-:|:-:|
| /START | クライアントに対して配布するアドレス帯の開始点 |
| /ENT | クライアントに対して配布するアドレス帯の終了点 |
| /MASK | クライアントに対して指定するサブネットマスク |
| /EXPIRE | 有効期限(単位は秒) |
| /GW | デフォルトゲートウェイのIPアドレス |
| /DNS | DNSサーバのIPアドレス |
| /DNS2 | 2つ目のDNSサーバのIPアドレス |
| /DOMAIN | ドメイン名 |
| /LOG | セキュリティログを保存するかどうか |
| /PUSHROUTE | ルーティングの設定。<社内LANなどのネットワークアドレス>/<社内LANなどのサブネットマスク>/<デフォルトゲートウェイ>の形で設定できる。 |

つまり、上のコマンドによって下の画像のようなイメージの構成に設定している。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2906464/c8695cdc-dea6-827d-c833-5bb6d6338fd7.png)

#### 3-1-3-6. 終了
```bash
exit
```

> SoftEther VPN Server ではプログラム全体の構造が慎重に設計されており、どのような設定変更を行っても VPN Server のプロセス自体の再起動は一切必要ありません。[^2]
[^2]: 筑波大学大学院研究プロジェクト SoftEther VPN. 3.3 VPN Server 管理. https://ja.softether.org/4-docs/1-manual/3/3.3

### 3-1-4. ポートの開放
SoftEther VPNはデフォルトで、
- 443/tcp
- 992/tcp
- 5555/tcp

の3つのポートを使用する[^3]。
[^3]: 筑波大学大学院研究プロジェクト SoftEther VPN. 3.3.6 リスナーポート. https://ja.softether.org/4-docs/1-manual/3/3.3

また、L2TP/IPsecを使用するときには追加で、
- 500/udp
- 4500/udp

の2つのポートも使用する[^4]。
[^4]: 筑波大学大学院研究プロジェクト SoftEther VPN. VPN Server 側での L2TP/IPsec 機能の有効化方法. NAT が存在する場合の注意事項. https://ja.softether.org/4-docs/2-howto/L2TP_IPsec_Setup_Guide/1

今回はL2TP/IPsecを使用するため、計5つのポートを開放する必要がある。

mdxではポートの設定を独自のポータル画面で行うことができるため、今回はその画面でポートを開放した。

Ubuntuでポートの開放をしたい場合は以下の記事を参考にする。

https://qiita.com/siida36/items/be21d361cf80d664859c

## 3-2. クライアント側
Windowsの場合を説明する。

「設定」→「ネットワークとインターネット」→「VPN」と選択していく。
![スクリーンショット 2024-05-26 195542.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2906464/98a4a33a-07bd-2d79-cb81-7037d19595e0.png)

「VPN接続を追加する」を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2906464/951cb04f-e4c0-40ee-f6d6-94126c74d098.png)

以下のように入力する。
| 変数 | 入力する値 |
|:-:|:-:|
| VPNプロバイダー | Windows（ビルトイン） |
| 接続名 | 任意 |
| サーバ名またはアドレス | サーバのURLまたはIPアドレス |
| VPNの種類 | 事前共有キーを使ったL2TP/IPsec |
| 事前共有キー | IPsecEnableコマンドを入力したときに設定した事前共有キー |
| サインイン情報の種類 | ユーザー名とパスワード |
| ユーザ名（オプション） | UserCreateコマンドを入力したときに設定したユーザー名 |
| パスワード（オプション） | UserPasswordSetコマンドを入力したときに設定したパスワード |

設定したら保存を押す。

接続を押して接続済みと表示されればOK。

# 4. 解説
## 4-1. VPNについて

VPNとはVirtual Private Networkの略で、自宅にいながら社内LAN環境に接続したりするために使われる技術のことである。

それによって、外部に公開せず社内LAN内だけで動かしているサービスなどに自宅にいながらアクセスすることができたりする。

VPNにはプロトコルがいくつかあり、それぞれのプロトコルによって通信速度やセキュリティ性能、互換性などが異なる[^5]。
[^5]: VPNのプロトコルの種類の比較と選び方！おすすめのVPNプロバイダーの特徴とは. https://www.itscom.co.jp/forbiz/column/vpn/1976/

具体的には以下のようなプロトコルがある[^5]。
| VPNプロトコル | 特徴 |
|:-|:-|
| PPTP | 通信速度は速いが、安全性が低い。 |
| SSTP | セキュリティは高いがMicrosoftが所有するプロトコルでオープンソースではない。 |
| L2TP | 暗号化の機能はないためIPsecというセキュリティシステムとセットで使用する。互換性に優れているが速度が遅くなりがち。 |
| IKEv2 | 安全性が高く、通信速度も速いが、オープンソースではない。 |
| OpenVPN | 安全性や速度に優れていてオープンソースである。 |

また、VPNに接続することでグローバルIPアドレスが変わり、国で制限されているサービスなどにアクセスしたりすることもできる。

例えばVPNに接続していない状態だと、
```bash
C:\xxx>curl ifconfig.me
xxx.xxx.xxx.xxx
```
だったものが、VPNに接続すると、

```bash
C:\xxx>curl ifconfig.me
yyy.yyy.yyy.yyy
```
という風になる。

※ifconfig.meというネットワークの接続情報を表示してくれるWebサービスに`curl`をすることでグローバルIPアドレスを確認することができる。

https://qiita.com/hypermkt/items/0c9670f73c9cf63f55d3

## 4-2. SecureNATについて
[公式ドキュメント](https://ja.softether.org/4-docs/1-manual/3/3.7)によると、

> 「SecureNAT (セキュアナット) 」機能は、SoftEther VPN のために独自に開発された、これまでに存在しなかった画期的な機能です。SecureNAT を使用すると、セキュリティ的により安心なネットワークを構築することができます。

と紹介されている。

SecureNAT機能には、

- 仮想NAT機能
- 仮想DHCPサーバ機能

の2つが搭載されている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2906464/dc76b27d-a7e2-e929-216a-18b0287421aa.png)
*[3.7 仮想 NAT および仮想 DHCP サーバー](https://ja.softether.org/4-docs/1-manual/3/3.7)より*

この機能によって、上の図のようにSoftEther VPNを動かしているサーバコンピュータ自体の変更を加えることなく既存の社内LANなどに接続することができる。
また、サーバコンピュータ自体の変更を加えないため、システム管理者権限を必要としないことも1つのメリットである。

## 4-3. ダイナミックDNSについて
SoftEther VPNにはダイナミックDNSという機能がついている[^dns]。

この機能を使えば、VPNに接続しているときにだけそのURLにアクセスするといったことができる。

ドメインの確認は以下の手順で行う。
1. `sudo ./vpncmd`
1. `1`->`Enter`->`Enter`で管理画面に入る
1. `DynamicDnsGetStatus`

また、`DynamicDnsSetHostname {ドメイン名}`でドメインを設定できる。

[^dns]: 筑波大学大学院研究プロジェクト SoftEther VPN. ダイナミック DNS 機能および NAT トラバーサル機能. https://ja.softether.org/4-docs/2-howto/6.VPN_Server_Behind_NAT_or_Firewall/1.Dynamic_DNS_and_NAT_Traversal

# 5. Q&A
## 5-1. ログファイルってどこ？
実行可能ファイルが設置されているディレクトリ内の`server_log`, `security_log`, `packet_log`のディレクトリに入っている[^log]。

[^log]: 筑波大学大学院研究プロジェクト SoftEther VPN. 3.10 ロギングサービス. https://ja.softether.org/4-docs/1-manual/3._SoftEther_VPN_Server_%E3%83%9E%E3%83%8B%E3%83%A5%E3%82%A2%E3%83%AB/3.A_Logging_Service

```bash
xxx@xxx:/usr/local/vpnserver$ sudo ls -l ./*log
./packet_log:
total 4
drwx------ 2 root root 4096 Jun 18 19:47 main

./security_log:
total 4
drwx------ 2 root root 4096 Jun 18 19:47 main

./server_log:
total 45540
-rw------- 1 root root  3436732 May 25 23:51 vpn_20240525.log
```

# おわりに
Linux上でVPNの環境構築をする手順を紹介しました。
いいねとストック、よろしくお願いします。
また、間違っている点や質問があればぜひコメントお願いします。

# 参考文献

https://ja.softether.org/

https://qiita.com/katonux/items/beeef8b88e4be6698a34

https://qiita.com/clerk67/items/d31504e786fe4f8f9acf