Raspberry PiにSoftEther VPN Bridgeをインストールして常時VPN接続されたネットワークを作成する

**【注意】今のところ実用性はかなり低いです…（遅いため）**
もしかしたら国内同士だと速いかも？

# 作りたいネットワーク

![VPN.png](https://qiita-image-store.s3.amazonaws.com/0/143240/f2f2370b-e41c-ba47-514d-f98b2507cf67.png)


# 用意したもの

## サーバー側（日本）

すでに構築済みになりますが、SoftEther VPN Serverが入っているマシンと、インターネット環境を用意しました。

* インターネット回線（NTTフレッツ光、固定IPがもらえる某プロバイダ）
* ルーター（中古の[RTX1100](https://network.yamaha.com/products/routers/rtx1100/index)）
* 自作PC（Linux）

## ブリッジ側（海外）

しばらく使われずに眠ってたものを集めました。

* インターネット回線（[AIS Fibre HomeBOADBAND](http://www.ais.co.th/fibre/en/package_homebroadband.html) 50/20Mbps ※英語ページ）599THB/month（2,000円強/月）
* Raspberry Pi (余ってたModel 2B）
* USB-LANアダプタ（余ってた[Logitec LAN-GTJU3](http://logitec.co.jp/products/lan/langtju3/index.php)）
* スイッチングハブ（余ってた[NETGEAR ProSAFE GS108E](https://www.jp.netgear.com/business/products/switches/web-managed/GS108E.aspx)）
* 無線LAN中継器（余ってた[TP-Link RE450](https://www.tp-link.com/jp/products/details/cat-10_RE450.html)）

# SoftEther VPN Bridgeのセットアップ

まずは、Raspberry Piを普通にLANに接続します。
（本体のLANポートに、普段使用中のルーターやハブからのケーブルを挿します）
今回はIPアドレスが `192.168.1.105` になりました。

## ビルド

ダウンロードするファイルのURLは[ここ](https://www.softether-download.com/ja.aspx?product=softether)からコピーしました。

SSHでRaspberry Piにログインしてから、

```bash
cd Downloads/
wget https://github.com/SoftEtherVPN/SoftEtherVPN_Stable/releases/download/v4.28-9669-beta/softether-vpnbridge-v4.28-9669-beta-2018.09.11-linux-arm_eabi-32bit.tar.gz
tar zxvf softether-vpnbridge-v4.28-9669-beta-2018.09.11-linux-arm_eabi-32bit.tar.gz
cd vpnbridge/
make
```

使用許諾契約書に同意したら、ビルドが開始されます。

私の場合、何かしらソフトウェアが古かったらしく、

```
make[1]: Entering directory '/home/pi/Downloads/vpnbridge'
Preparing SoftEther VPN Bridge...
ranlib lib/libcharset.a
ranlib lib/libcrypto.a
ranlib lib/libedit.a
ranlib lib/libiconv.a
ranlib lib/libncurses.a
ranlib lib/libssl.a
ranlib lib/libz.a
ranlib code/vpnbridge.a
gcc code/vpnbridge.a -O2 -fsigned-char -pthread -lm -ldl -lrt -lpthread -L./ lib/libssl.a lib/libcrypto.a lib/libiconv.a lib/libcharset.a lib/libedit.a lib/libncurses.a lib/libz.a -o vpnbridge || gcc -no-pie code/vpnbridge.a -O2 -fsigned-char -pthread -lm -ldl -lrt -lpthread -L./ lib/libssl.a lib/libcrypto.a lib/libiconv.a lib/libcharset.a lib/libedit.a lib/libncurses.a lib/libz.a -o vpnbridge
/usr/lib/arm-linux-gnueabihf/libpthread_nonshared.a: file not recognized: File format not recognized
collect2: error: ld returned 1 exit status
/usr/lib/arm-linux-gnueabihf/libpthread_nonshared.a: file not recognized: File format not recognized
collect2: error: ld returned 1 exit status
Makefile:18: recipe for target 'i_read_and_agree_the_license_agreement' failed
make[1]: *** [i_read_and_agree_the_license_agreement] Error 1
make[1]: Leaving directory '/home/pi/Downloads/vpnbridge'
```

というエラーが出てしまいました。
これを解決するために`libc6-dev`を再インストールしました。

```bash
sudo apt-get --reinstall install libc6-dev
```

## 自動起動の設定

ビルドが完了したら、ビルドで使用したディレクトリごと、移動させます。

```bash
cd ~/Downloads/
sudo mv vpnbridge /opt/
```

systemdで使用するファイルを作成します。
`nano`や`vi`などで以下のファイルを作成します。

```ini:/etc/systemd/system/vpnbridge.service
[Unit]
Description=SoftEther VPN Bridge
After=network.target

[Service]
Type=forking
User=root
ExecStartPre=/sbin/ip link set dev eth0 promisc on
ExecStart=/opt/vpnbridge/vpnbridge start
ExecStop=/opt/vpnbridge/vpnbridge stop
Restart=on-abort
WorkingDirectory=/opt/vpnbridge

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

作成ができたら、自動起動の設定をしてから、起動します。

```bash
sudo chmod 0755 /etc/systemd/system/vpnbridge.service
sudo systemctl daemon-reload
sudo systemctl enable vpnbridge
sudo systemctl start vpnbridge
```

# 管理用ポートの開放

制御のための`iptables`をインストールします。

```bash
sudo apt-get install iptables-persistent
```

途中、質問にはYesで答えます。
インストールができたら、ルールファイルにVPN Bridgeの管理用ポートを開放するための設定を追加します。

元のファイル

```:/etc/iptables/rules.v4
# Generated by iptables-save v1.6.0 on Tue Feb 19 17:45:45 2019
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
# Completed on Tue Feb 19 17:45:45 2019
```

変更後のファイル

```:/etc/iptables/rules.v4
# Generated by iptables-save v1.6.0 on Tue Feb 19 17:45:45 2019
*filter
:INPUT ACCEPT [0:0]
-A INPUT -m tcp -p tcp --dport 5555 -j ACCEPT
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT
# Completed on Tue Feb 19 17:45:45 2019
```

以下のコマンドで反映させます。

```bash
sudo netfilter-persistent reload
```

以下のコマンドで確認します。

```
$ sudo iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:5555

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination 
```

# 管理ツールの起動

SoftEtherのサイトから、Windows用とMac用の管理ツールがダウンロードできるので、インストールします。
今回はWindows用を使いました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/143240/f2157b4f-df28-71d0-19a8-806f7a194dea.png)

## 接続設定の作成

「新しい接続設定」から、Raspberry Piに接続する設定を作成します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/143240/dde267aa-7fb9-8b90-b0d0-6fd2d3471088.png)

「OK」をクリックすると、追加されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/143240/ebfa9057-d118-540c-4aca-20dcf38fa06b.png)

「接続」をクリックすると、まずはパスワードを設定する画面になりますので、好みのパスワードを設定します。
設定が完了すると、接続後に以下のダイアログが表示されます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/143240/78b4ac7f-25c5-d946-41c4-98dc0e12b0b5.png)

今回はVPN Bridgeをセットアップしたので、選択肢は一つだけです。
そのまま「次へ」をクリックします。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/143240/f1649f91-dc2c-b676-a42f-6bc84ddad258.png)

## VPN Serverへの接続

「接続先のVPN Serverへの接続設定を行う」から、あらかじめ用意しているVPN Serverへの接続を行います。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/143240/bf666c08-493f-5ef0-72be-76e3225b3cc0.png)

設定が完了して、一覧画面で「オンライン」になっていれば成功です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/143240/e554286e-746b-f9bf-53db-88eca09550c3.png)

## ローカルブリッジ設定

簡易セットアップ画面に戻って、「ローカルブリッジの設定」欄から、VPN接続が有効となるLANインターフェイスを選択します。

今回は、増設したUSB-LANアダプタ（eth1）を指定しました。
Windowsだとデバイス名が表示されたりしますが、Linuxではそうでもないので、間違えないように選択します。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/143240/2cb3c1d2-e6f6-eb53-080c-dc7ae9a43b47.png)

完了したら「閉じる」をクリックします。

# 有線での接続確認

USB-LANアダプタ側に、適当なノートPC（Surface）を接続してみました。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/143240/4be0cff7-dea0-da30-b6d9-9fe48c29258a.png)

IPアドレスがVPN Server側になっています。

# 遅いです

**遅い。**
ダウンロードがかなり遅いです。
20年前のダイアルアップ接続も真っ青のレベルです。

無線でつないだAndroid端末の速度がこちらです。

## Android 9 - Xperia XZ Premium G8142、タイ版Dual SIMモデル

![android9.png](https://qiita-image-store.s3.amazonaws.com/0/143240/eac6dd62-1ccd-6c12-6402-5f04702327dc.png)

## Android 8 - Xperia XA1 Ultra Dual G3226、香港版Dual SIMモデル

![Screenshot_20190303-202024.png](https://qiita-image-store.s3.amazonaws.com/0/143240/42a2155d-e3e7-e3b2-07b9-675c8c54de20.png)

## Android 7 - Xperia X Compact SO-02J、日本docomo版Single SIMモデル

![android7.png](https://qiita-image-store.s3.amazonaws.com/0/143240/5656521e-7e9e-1db4-88ba-8c2584439d53.png)

## 【参考】OpenVPNでの結果（Android 9 - Xperia XZ Premium G8142、タイ版Dual SIMモデル）

最上部の図のオレンジ色のルートでの結果もひどいものでした。

![Screenshot_20190303-210825.png](https://qiita-image-store.s3.amazonaws.com/0/143240/bb06df6b-dcb3-cc22-f982-2839013812cc.png)

これを見ると、Raspberry Piのところはあまりネックになってなさそうです。

しかし、これはちょっと耐え難いので、どうやったら下りが早くなるかは考えないとです。


## 【参考】通常の回線では以下の速度がちゃんと出ます。

私は下り50M/上り20Mの契約ですが、ほぼ公称どおりの速度が出てます

![422.jpg](https://qiita-image-store.s3.amazonaws.com/0/143240/44ad392f-c44c-dd13-94c8-d06388298746.jpeg)

# 遅い原因の考察

遅い要因として考えられそうなものとしては、

## 日本側ネットワークの問題

* ~~上りが異様に遅い~~
  ![image.png](https://qiita-image-store.s3.amazonaws.com/0/143240/9a6a12ef-9eb8-9511-2eda-c9319aa8b6fc.png)
  **速いです。**

## 国をまたいでいることでの問題

* 物理的に遠い

## 海外側ネットワークの問題

* ~~Raspberry Piがそもそもネック~~
  ![image.png](https://qiita-image-store.s3.amazonaws.com/0/143240/6a886485-73bb-c520-3045-7db917cdfa1e.png)
  **速いです。**
* 国外への接続容量が少ない
（ベトナム・ホーチミンシティにいた時は実際こういう問題ありました。法人向け回線でどれだけ高額な料金を払っても、ベトナム国外への通信は遅いままだそうで…）  
というわけで、**VPNを通さずに** Raspberry Piから速度を測ってみました。  
対象国はベトナム、日本、シンガポール、香港、台湾。  
![image.png](https://qiita-image-store.s3.amazonaws.com/0/143240/6680b7e2-34a7-8c22-f6d3-f70a050e29a8.png)
**日本への速度は問題なさそう（下りはベトナムを除く周りのIT先進諸国よりちょっと遅いけど、これはタイミングなのか地理的な問題なのか…）**
* 誰かがVPNに速度規制している（下りだけ規制するものかな？）
   * …あまり書くとアレなので…。
   * 一時的なものだとしたら、直近の総選挙（[ニュース](https://www.nikkei.com/article/DGXMZO40356550T20C19A1FF8000/)）の影響とか？

## 要・追加検証

ちょっと切り分けポイントが多いので、時間があるときにインフラが整っているアジア圏のどこか（香港、台湾、シンガポールあたりがいいのかな？）と、日本でいろいろ試してみます。