Raspberry PiにSoftEther VPNをインストールしてVPNクライアントからVPNサーバー自身にアクセスする

Raspberry Pi(その他のLinuxサーバー)にSoftEther VPN Serverをインストールしても、「VPNクライアント側からVPNサーバーとして稼働しているRaspberry Pi自身のIPアドレスにアクセスできない」という公式HP記載の[既知の問題(3.6.11項)](https://ja.softether.org/4-docs/1-manual/3/3.6)を解決するための方法をSoftEther VPN Serverのインストール方法から書きました。

インストールをスキップする場合は[ブリッジの作成](#ブリッジの作成)から

この「VPNクライアント側からVPNサーバーとして稼働しているRaspberry Pi自身のIPアドレスにアクセスできない」という問題は、VPNサーバーとファイルサーバーなどを共存させた場合に、「VPNクライアントがファイルサーバーなどにアクセスできない」という問題の原因になります。

# 環境
ハード: Raspberry Pi 4B
OS: Raspberry Pi OS Lite (64-bit), debian_version11.3, リリース日時2022-04-04
Softether VPN Server: Ver 4.38, Build 9760, rtm
ネットワーク: Raspberry PiにはDHCPでIPアドレスを割り当てる
ユーザー名: pi
# SoftEther VPNのインストール
[公式ダウンロードページ](https://www.softether-download.com/ja.aspx?product=softether)にアクセスして以下を選択

- コンポーネント: SoftEther VPN Server
- プラットフォーム: Linux
- CPU: ARM 64bit (64bit)

ダウンロードリンクを右クリックしてコピー
![softether_dlpage.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705635/2e45336f-8dcf-1e59-59ef-4fcde140d2dd.png)

以下、Raspberry Piのターミナル

> ホームディレクトリにファイルをダウンロードする
> ```
> wget -P /home/pi [先ほどコピーしたダウンロードリンクのURL]
> ```

> ダウンロードしたファイルを解凍
> ```
> tar xzvf /home/pi/softether-vpnserver-[バージョンによって異なる]-linux-arm64-64bit.tar.gz -C /home/pi
> ```

> 解凍したディレクトリ内に移動
> ```
> cd /home/pi/vpnserver
> ```

> 実行可能ファイルの生成
> ```
> make
> ```

> ホームディレクトリに戻る
> ```
> cd /home/pi
> ```

> 配置
> ```
> sudo mv vpnserver /usr/local
> ```

> 配置先に移動
> ```
> cd /usr/local/vpnserver
> ```

> パーミッション変更
> ```
> sudo chmod 600 *
> sudo chmod 700 vpncmd
> sudo chmod 700 vpnserver
> ```

> 動作チェック(The command completed successfully.と出ればOK)
> ```
> ./vpncmd
> 3
> check
> exit
> ```

# 自動起動の設定
> スクリプト作成
> ```
> sudo vi /etc/systemd/system/vpnserver.service
> ```

> 以下を貼り付け
> ```/etc/systemd/system/vpnserver.service
> [Unit]
> Description=SoftEther VPN Server
> After=network.target network-online.target
> 
> [Service]
> User=root
> ExecStart=/usr/local/vpnserver/vpnserver start
> ExecStop=/usr/local/vpnserver/vpnserver stop
> Type=forking
> RestartSec=3s
> WorkingDirectory=/usr/local/vpnserver/
> ExecStartPre=/sbin/ip link set dev eth0 promisc on
> 
> [Install]
> WantedBy=multi-user.target
> ```

> サービスの自動起動を有効化
> ```
> sudo systemctl enable vpnserver.service
> ```

> 再起動
> ```
> sudo reboot
> ```

> 起動しているか確認
> ```
> systemctl status vpnserver
> ```
> 
> 正常に起動している場合の実行結果
> ```
> ● vpnserver.service - SoftEther VPN Server
>     Loaded: loaded <省略>
>     Active: active (running)<省略>
>     <省略>
> ```

# サーバーの設定
サーバー管理マネージャー(Softether VPN Server Manager for Windows OR Mac OS X)でサーバー管理画面に入る

> 新しいパスワードを聞かれるので設定

> リモートアクセスVPNサーバーにチェックして次へ
> ![softether_setting1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705635/a4379755-9972-2c9a-3263-6c33e7edf472.png)

> 仮想HUB名は適当に入力してOK
> ![softether_setting2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705635/22f26f9a-fcf9-5e9e-a16e-8728372a18e0.png)

> 色々聞かれるので必要なものは設定(VPN Azure 設定, IPsec / L2TP 設定など)

> この画面になったらユーザーを作成してください
> しかし、**ローカルブリッジの設定はまだしない**でください
> ![softether_setting3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705635/8e118134-659a-7e8b-919b-a5e44fa5d6e1.png)

# ブリッジの作成
> ブリッジインターフェースを作成するためのツールをインストール
> ```
> sudo apt install bridge-utils
> ```

> ブリッジインターフェースを作成
> ```
> sudo brctl addbr br0
> ```

以下、サーバー管理マネージャー

> 新しいtapデバイス(softether)の作成
> LANカードは**br0**
> ![softether_setting4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705635/8acbad3c-669b-801f-8d86-6b8e331b598b.png)
> ![softether_setting5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2705635/8133771a-ac35-897d-cd57-2ea0162d0943.png)

# ネットワークインターフェースの設定
> ネットワークインターフェースの設定ファイルを開く
> ```
> sudo vi /etc/network/interfaces
> ```

> 以下を追記
> ```
> auto eth0
> iface eth0 inet static
> address 0.0.0.0
> 
> auto br0
> iface br0 inet dhcp
> bridge_ports eth0
> ```

# 起動時に自動的にブリッジ接続する
vpnserverの起動後、tapデバイスをbr0に接続するサービスを作成していきます。

> ファイルを作成
> ```
> sudo vi /etc/systemd/system/bridge-softether.service
> ```

> 以下を貼り付け
> ```
> [Unit]
> Description=Bridge tap_softether to br0
> After=vpnserver.service
> 
> [Service]
> User=root
> Restart=on-failure
> RestartSec=3s
> ExecStart=/usr/sbin/brctl addif br0 tap_softether
> 
> [Install]
> WantedBy=multi-user.target
> ```

> サービスを有効化
> ```
> sudo systemctl enable bridge-softether
> ```

> 再起動
> ```
> sudo reboot
> ```

# 動作確認
> Q, br0とtap_softetherはありますか？
> ```
> ifconfig
> ```
> 
> A, 正常な実行結果
> ```
> br0:<省略>
> <省略>
> eth0:<省略>
> <省略>
> lo:<省略>
> <省略>
> tap_softether:<省略>
> <省略>
> ```

> Q, br0にeth0とtap_softetherがブリッジされていますか？
> ```
> brctl show br0
> ```
> 
> A, 正常な実行結果
> ```
> bridge name     bridge id               STP enabled     interfaces
> br0             <省略>                  no              eth0
>                                                         tap_softether
> ```

> Q, 起動時に自動的にブリッジ接続できていますか？
> ```
> systemctl status bridge-softether
> ```
> 
> A, 正常な実行結果
> ```
> ● bridge-softether.service - Bridge tap_softether to br0
>     Loaded: loaded <省略>
>     Active: inactive (dead) <省略>
>     <省略>
> ```

これで、VPNクライアント側からVPNサーバーとして稼働しているRaspberry Pi自身のIPアドレスにアクセスできるようになります。

# 参考資料
- [7.3 Linux へのインストールと初期設定 - SoftEther VPN プロジェクト](https://ja.softether.org/4-docs/1-manual/7/7.3)
- [Raspberry Piで作るSoftEther VPNの環境 | chibashi&#039;s note](https://chibashi.me/development/softether-vpn-server-201902/)
- [Softether on Raspberry Pi において、自分自身にアクセス  - show log include yuh](https://yunabe.hatenablog.com/entry/2019/06/01/201250)
- [SoftEtherで自分自身に接続する方法 · Nutty Niche Needs / N3](https://mosax.sakura.ne.jp/posts/self-connection-in-softether/)
- [ブリッジする時の /etc/network/interfaces 案 - みかづきの色々](https://mooa9.hatenablog.jp/entry/2014/07/14/134540)
- [vyattaラボ | ubuntuでブリッジを作成](http://vyattalab.blog.fc2.com/blog-entry-19.html)
- [自作したシェルスクリプトを Linux の systemd サービスとして起動する方法 | ゲンゾウ用ポストイット](https://genzouw.com/entry/2021/07/05/154156/2701/)