SoftEtherVPNServerをRaspberry Pi 3B+とRaspberry Pi OSで構築したのでそのメモ

VPNサーバを立てるとき、定期的にメンテナンスができるように必ずローカルブリッジを作成し、直接乗り込めるようにすることを考えていた
最終的な目標としては、もちろん遠隔メンテナンスをするためだ
地方の実家のネットワークをある程度遠隔でメンテナンスしたいと考えた時、実家に災害対策用バックアップストレージを設置しようと思った時などが該当するだろう
(普通の人間は必要ないとか言わないの)

以前、自宅用にRaspberry Pi 4B+ 8GBRAMとUbuntu 20.04で構築をしたときは、WindowsのGUI Managerを利用してセットアップしたが、今回はコマンドでセットアップした
また、`/etc/network/interface`を今回は直接セットアップしたため、その辺りの情報をまとめる
今のところ、全部を網羅的に記載しているものはなかったので、そのメモとして記す

誰かの役に立つといいなと思う

# OS
```
root@raspberrypi:/usr/local/vpnserver# cat /etc/issue
Raspbian GNU/Linux 10 \n \l
```

# Raspbian側の設定

## ソフトウェアのインストール

どのサイトでも説明がある通り、ローカルブリッジの設定をするために、`bridge-utils`をインストールする

```
sudo apt install bridge-utils
```

## ローカルブリッジの作成

Ubuntuではここで、netplan配下を編集するが、Raspbianでは`/etc/network/interface`を編集する
ここの情報をどうすればいいんだっけがいまいち掴めなかったので、最終的な状態をまとめる

```
auto lo br0
iface br0 inet static
  address [設定する固定IPアドレスを記載]
  netmasck 255.255.255.0 # サブネットマスクは必要に応じて変えてください。
  gateway [DHCPサーバをするルータのIPアドレス]
  dns-nameserver 8.8.8.8 1.1.1.1 #GoogleのDNSを設定しているだけなのでどちらでも
  bridge_ports eth0 # 有線のイーサネットの物理をブリッジ
```

この後、`systemctl`への登録などがあるが、それはSoftEtherをインストールして、起動できる状態になってからとする

# SoftEther VPN Serverのダウンロードとセットアップ

## ダウンロード

以下の内容で絞り込んで、安定板をダウンロードしてください
https://www.softether-download.com/en.aspx?product=softether

```
Select Software: SoftWther VPN (Freeware)
Select Component: SoftWther VPN Server
Select Platform: Linux
Select CPU: ARM EABI (32bit)
```

## コンパイル・ビルド・起動テスト

1. ダウンロードしたら、Raspbianへ転送しtarコマンドで任意のフォルダに解凍する
2. 解凍後、ディレクトリに入ったら`make`コマンドでモジュールを作成する
3. `usr/local/`に`vpnserver`ディレクトリを全て移動させ、`root:root`に権限を全て変更
4. さらに、`vpnserver`と`vpncmd`に`755`の権限を付与
5. 起動してみる

ざっくり以下のコマンドで実行

```
cd ~/vpnserver
make
chmod 755 vpnserver vpncmd
cd ..
sudo mv vpmserver /usr/local
cd /usr/local
sudo chown root:root -r vpnserver
cd vpnserver
./vpnserver start
```

正常に起動できればOK

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

必要な情報は、接続するときのユーザが属する仮想HUBの名前と、ローカルブリッジに接続するTAPの名前
なので、以下の設定を行う前に、あらかじめ以下の情報を設定した
* 仮想HUBの作成
* 仮想HUBに所属するUserの作成
* DynamicDnsを有効化
* IPsecを有効化

これで必要な情報は揃ったので、以下の通りコマンドを実行する。

```
VPN Server>BridgeCreate [仮想HUB名] /TAP:yes
BridgeCreate コマンド - ローカルブリッジ接続の作成
ブリッジ先のデバイス名: [tap_hogehogeのhogehoge部分としてつける名前]

物理的な LAN カードに対してブリッジを行う場合、新しいブリッジ接続を作成した直後の状態では、一部の LAN カードでは仮想ネットワーク内のコンピュータからブリッジ接続に使用している LAN カード自身に対する TCP/IP 通信が正しく行えない場合があります。
(特に、Intel や Broadcom 製 LAN カードなどでこの現象が発生する場合があります。)


その場合は、一度 VPN Server / Bridge が動作しているコンピュータを再起動してください。コンピュータの再起動後に正しく通信することができるようになります。


また、大半の無線 LAN アダプタはプロミスキャスモードでのパケットの送受信に対応していない場合が多いため、ローカルブリッジに使用できない場合があります。このような場合は、無線 LAN アダプタではなく通常の LAN カードの使用を検討してください。

コマンドは正常に終了しました。
```

作ったら確認をする

```
VPN Server>BridgeList
BridgeList コマンド - ローカルブリッジ接続の一覧の取得
番号|仮想 HUB 名|ブリッジ先 LAN カードまたは tap デバイス名|状態
----+-----------+------------------------------------------+------
1   |****       |hogehoge                                 |動作中
コマンドは正常に終了しました。
```

一旦これでSoftEther側のブリッジの設定は完了

SoftEther内の設定は、コマンドを用いてか、Windows GUI Managerを使ってか、好きな方で設定してほしい
コマンドで設定する場合、ローカルブリッジ設定以外は以下のサイトを参考に実施したのでそちらをどうぞ
https://nautilus-code.jp/articles/reinstall-softether-vpn-server-to-raspberry-pi-3b

## Systemctlへの登録と自動起動

この辺りも大体説明されている方法でOK
まず、`/etc/systemd/system`に`vpnserver.service`を作成する
`/usr/local/`コンパイルしたSoftEtherVPNを全て入れることを前提とした場合、内容は以下の通り

```
[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
```

そしたら、`systemctl`コマンドで設定する

```
sudo chown root:root ./vpnserver.service
sudo chmod 755 ./vpnserver.service
sudo systemctl daemon-reload
sudo systemctl enable vpnserver.service
sudo systemctl start vpnserver.service
```

これで、systemctlで見れるようになったかなどを確認するため、一旦マシンをRebootする
SSH接続でセットアップしていた場合、IPアドレスの設定ミスっているとアクセスできなくなるので、遠隔でこれを頑張らないこと。。。
割り振った固定IPアドレスとその重複がないこと、そのときのGateway設定を間違えていなければ多分大丈夫

rebootしたら、以下のコマンドを実行して再起動後自動起動できているかを確認する

```
systemctl status vpnserver.service
```

以下のような形で起動されて入ればOK

```
# systemctl status vpnserver
● vpnserver.service - SoftEther VPN Server
   Loaded: loaded (/etc/systemd/system/vpnserver.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2022-05-06 20:46:09 JST; 1h 33min ago
 Main PID: 570 (vpnserver)
    Tasks: 38 (limit: 2059)
   CGroup: /system.slice/vpnserver.service
           ├─570 /usr/local/vpnserver/vpnserver execsvc
           └─571 /usr/local/vpnserver/vpnserver execsvc
```

# ローカルブリッジの接続

`brctl`コマンドにより、作成した`tap_hogehoge`をあらかじめ作っていたローカルブリッジ`br0`に参加させる

1. `ip tuntap`を実行すると`tap_hogehoge: tap`と、tapのブリッジが作られているか確認する。
1. ついでに、`ifconfig -a`でローカルブリッジもtapも作れているか確認する。
1. ローカルブリッジの`br0`に`tap_hogehoge`を参加させる
1. 確認する

まず以下の通りになっているか確認
```
# ip tuntap
tap_hogehoge: tap
```

そして、ipconfigを実行
`tap_hogehoge`が作られていればOK

```
ifconfig -a
br0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.0.40  netmask 255.255.255.0  broadcast 192.168.0.255
        inet6 ****::****:****:****:****  prefixlen 64  scopeid 0x20<link>
        ether **:**:**:**:**:**  txqueuelen 1000  (イーサネット)
        RX packets 76042  bytes 15089719 (14.3 MiB)
        RX errors 0  dropped 224  overruns 0  frame 0
        TX packets 65591  bytes 16561668 (15.7 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether **:**:**:**:**:**  txqueuelen 1000  (イーサネット)
        RX packets 105947  bytes 27300443 (26.0 MiB)
        RX errors 0  dropped 178  overruns 0  frame 0
        TX packets 86315  bytes 20449839 (19.5 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1000  (ローカルループバック)
        RX packets 301  bytes 145218 (141.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 301  bytes 145218 (141.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

tap_hogehoge: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 ****::****:****:****:***  prefixlen 64  scopeid 0x20<link>
        ether **:**:**:**:**:**  txqueuelen 1000  (イーサネット)
        RX packets 27315  bytes 4330533 (4.1 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 49111  bytes 15316110 (14.6 MiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

wlan0: flags=4098<BROADCAST,MULTICAST>  mtu 1500
        ether **:**:**:**:**:**  txqueuelen 1000  (イーサネット)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
```

ローカルブリッジに`tap_hogehoge`を参加させ、参加したかの確認をする。

```
# brctl addif br0 tap_hogehoge
# brctl show br0
bridge name     bridge id               STP enabled     interfaces
br0             8000.5e5fa1de0b89       no              eth0
                                                        tap_hogehoge
```

# 接続確認

iPhoneやMacから接続することを考えていたため、IPsecで接続する

以下の内容で設定
* タイプ : L2TP
* サーバ : ダイナミックDNS
* アカウント : `UserName@仮想Hub名`
* RSA SecurID : OFF
* パスワード : アカウントのUserPassword
* シークレット : IPsecを設定する際に設定したキー
* すべての信号を送信 : とりあえずON
* プロキシ : 必要に応じて設定してください

接続できました

# おまけ調査「Ubuntuのnetplanとは？」

[netplan](https://netplan.io)とは、The network configuration abstraction rendererである
`yaml`で簡単にネットワークの構成を定義したら、`/etc/network/interface`に定義する内容などをレンダリングして構成してくれる

yamlで構造を書くのって整理しやすいから、確かにこちらの方がわかりやすかった
ubuntuの18.04以降で採用されており、Raspbianには入っていなかった
もしかしたらインストールして設定できるのかもしれないが、今回はそこは調査していない

おわり