Arch Linux に SoftEther をインストール (TAP接続あり)

この項では、Arch Linuxの環境にSoftEtherを導入する方法について解説します。

SoftrEtherはローカルブリッジを行うことでNICと接続しますが、直接NICとブリッジした時に、通信速度が3Mbpsほどしか出なかったため、TAPインターフェイスを使った方法で接続する方法を模索しました。

その記事がどこにもなかったので、備忘録がてら書いていきます！！

## SoftEtherのインストール
Arch Linuxのコミュニティリポジトリには、SoftEtherのエントリがあります。
今回は、それを使ってインストールしていきましょう。
Aurヘルパーは `paru` を使っていますが、yayの人は各自置き換えてください。

:::note info
paruはyayに代わる新しいAURヘルパーです。
:::

``` console
# paru -S softethervpn
```
ビルドに時間が掛かりますが、待ちましょう。
インストールが完了したら、起動＆自動起動を設定します。
``` console
 # systemctl start softethervpn-server
 # systemctl enable softethervpn-server
```

以下のコマンドを打って動作を確認します。
Activeになっていることを確認して下しさい。
``` console
 # systemctl status softethervpn-server

 ● softethervpn-server.service - SoftEther VPN Server
     Loaded: loaded (/usr/*****)
     Active: active (running) since Wed 2024-01-24 02:35:42 JST 8h ago
```

## GUIでサーバーをセットアップする
以下のページにアクセスして、ServerManagerをインストールします。

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

インストール出来たら、左下の New Setting　からサーバーに接続します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174160/f6f7802b-3546-071d-3b15-4bdf27f4cbbb.png)

適当な名前を決め、HostNameにサーバーのIPを入力してください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174160/c96bc70d-6f7e-d0b5-fa71-779a1f1ef5cd.png)

:::note warn
ポートはデフォルトで443を使っていますが、WEBサーバーなどですでに使っている場合は1194 5555などを試すことが出来ます。
:::

OKを押すと、新しくパスワードを決めるように要求されるので入力してください。
すると、初期セットアップが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174160/b0350e85-cf66-bda0-dc2e-ae7c6751bee7.png)

この画面は一番上だけチェックをつける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174160/8e89c991-d441-f791-052f-f3a51aee4599.png)

DDNSの設定です。こだわりがなければこのままExitを押して閉じます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174160/caeb8548-f083-ce84-4c93-44ed65e08104.png)

ここでは、一番上のL2TP over IPsecにチェックをつけ、一番したのkeyにパスワードを設定します。
これは、OpenVPNなどで利用する事前共有鍵なので、メモしておいてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174160/bd4e7e4d-6879-3d30-23ea-70a7972a56ad.png)

AzureはDisableにしてOK
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174160/e8b661c0-4974-2014-835f-b59fe807a31e.png)

セットアップは続きます。
次に、Userをセットアップする必要があるので、
名前、パスワードを決めてＯＫを押します。

このアカウントは、この後実際にデバイスからの接続の際に使うものです。
必要であれば、後でいくらでも追加できます。今回はtestという名前で生成しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174160/39b1b739-4b10-e923-93cb-68b8e7e6e4a8.png)

完了したら、一通りWindowは閉じて大丈夫です。

さて、この状況ですでにローカルで接続が出来るはずです。
iPhoneや、PCを使ってローカルのアドレスで接続が出来ることを確認しましょう。

以下の例はiPhoneの設定例です。

```
説明: (任意の名前)
サーバー: (サーバーのIP)
アカウント: (設定したユーザーネーム)
RSA SecureID: オフ
パスワード: (設定したパスワード)
シークレット: (設定した事前共有鍵)
すべての信号を送信: オン
```
この時点で正しく接続が出来ることを確認しましょう。

## TAPインターフェイスにブリッジする
外部からアクセスできるように設定すればこの時点でVPNサーバーとして利用できますが、二点問題があります。
- Linuxの制約により、自身への通信が出来ません。つまり、VPNを使って、SoftEtherをインストールしているマシンへのアクセスが出来ません。
- Arch固有の問題かもしれませんが、通信速度が著しく下がります。 私の環境では2-3mbpsしか出ませんでした。

これを回避するために、TAPインターフェイス（仮想のインターフェイス）を生成し、SoftEtherはそこを経由して通信するようにします。

まずは必要なものをインストールします。

``` console
# pacman -S bridge-utils net-tools netctl dhcpcd
```

:::note warn
これからの作業は、間違えた場合通信が出来なくなる可能性があります。
よって遠隔地のマシンをセットアップする際には十分に注意してください。
:::

まずは、`ip a`を実行して、通信に利用しているNICを特定し、必要な情報は以下の通りです

- インターフェイス名 (eth0とかenp5s0とかそういうやつ)
- デフォルトゲートウェイ

次に、仮想ブリッジを生成します。
br0というコンフィグファイルを `/etc/netctl/`以下に生成します
``` console
cd /etc/netctl/
# touch br0
```

内容は以下のようにします。
``` shell:/etc/netctl/br0
Description="Bridge connection"
Interface=br0
Connection=bridge

#先ほどしらべたインターフェイスの名前を入れる※()かっこ必要
BindsToInterfaces=(enp5s0)

IP=dhcp
```
次に、インターフェイスへが自動的にセットアップされることを無効化し、br0にIPアドレスを割り当てるようにします。

``` console
# nano /etc/dhcpcd.conf
```
書かれているコンフィグの先頭に #をつけてコメントアウトします。
そして、以下を追記。

``` shell:/etc/dhcpcd.conf
# インターフェイスの名前
denyinterfaces enp5s0

# ブリッジの名前
interface br0

# サーバーのIP
static ip_address=192.168.100.44/24

# デフォルトゲートウェイ
static routers=192.168.100.1

# DNSサーバーを指定（なぜか自動取得がうまくいかなかったので）
static domain_name_servers=192.168.100.2
```

できたら、Windowsから設定画面を開いて。
Local Bridge Settingsを開く。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/174160/1d36a6c5-fe2c-3ce1-a619-a169567fa1dd.png)
すでの存在している物理NICを選択してDeleteする。
そのあと、下の画面から Bridge with New Tap Deviceを選択。
device name は適当に。(今回はsoftether)にしました。

出来たら、これらの設定がSoftEtherが立ち上がる過程でセットアップされるようにします。

SoftEtherのコンフィグを変える
``` console
# nano /usr/lib/systemd/system/softethervpn-server.service
```
その中の[Service]にExecStartPostとExecStartPreの二行を足す。
``` :/usr/lib/systemd/system/softethervpn-server.service
[Service]
Type=forking
ExecStart=/usr/bin/vpnserver start

# 追記
ExecStartPost=/bin/sleep 5 ; brctl addif br0 tap_softether

# 追記
ExecStartPre=/usr/bin/netctl start br0

ExecStop=/usr/bin/vpnserver stop
Restart=on-failure
```

完了したら`systemctl restart softethervpn-server`で再起動。
問題がなければ、reboot しましょう！

あとは、ルーターの設定を変えて ポートフォワードすれば外部からアクセスできます。
お疲れ様でした！