SoftEtherでL2-VPN構築


一人暮らしをしているとサーバーの一部を実家に置いてVPNを構築しようというのは誰でも考えると思います。家でもRTX1200のVPNの機能を利用してVPNを構築しているのですが、1200は意外と非力で特に暗号化をするとCPUが100%に張り付いてしまいます。RTX1210を買えば解決しそうですが、まだまだ高い。それならソフトウェアでVPNを構築しようと考えました。OpenVPNとか色々と選択肢はありましたが、今回は比較的お手軽で高速と噂されているSoftEtherを使う事にしました。

tkp_zhxJzA.png

全体の概要は上の図の感じです。左が自宅(Server)、右が実家(Bridge)です。VPNはフレッツ閉域網を利用したL2トンネルになっていて、ここをタグ付きのパケットが通過します。そうする事で1つのVPNトンネルで複数のVLANを伝送できますし、VLANの追加と削除は両端のスイッチの設定を変更するだけで対応できます。L2スイッチはVLANに対応したものを利用します。両端のSoftEtherを直接eth0にブリッジしても良いのですが、LANの口をあんまり増やしたくなかったのでeth0とSoftEtherの間にOpenvSwitchを入れました。トンネルを通るVLANをサーバーで指定する事が可能となります。

今回の環境

実家側は既存のサーバーにSoftEtherをインストールする形で環境を用意しました。

自宅側の環境はVMware ESXi 6.5のサーバーの空きリソースにまだ余裕があったのでそこにVMを1つ新規に作成しました

スループット200Mbps程度でもこのスペックで余裕でした。

SoftEther VPN Serverのインストール

それでは自宅のサーバーにSoftEtherをインストールしましょう。自宅側はVMで新規にDebianをインストールします。この時VMwareのスイッチのポートグループは下記のように設定していないとうまく動かないので注意しましょう。セキュリティを気にするならVPN用のポートグループは専用に用意した方がいいかもしれません。VLAN ID 4095はuntagを意味し、タグ付きのまま転送します。ここで転送するVLAN IDは個別指定はできないようです。

tkp_njLEwZ.png

VMの用意ができたらDebian8をインストールして、その後SoftEtherをインストールします。今回はソースからコンパイルしてインストールします。

# sudo apt install build-essential git libreadline-dev libssl-dev libncurses5-dev
$ cd /usr/local/src
$ git clone https://github.com/SoftEtherVPN/SoftEtherVPN_Stable.git
$ cd SoftEtherVPN
$ ./configure
$ make
$ sudo make install

インストールが完了したら起動スクリプトを用意します。

$ sudo vi /etc/systemd/system/vpnserver.service

この内容は下記のようにしました。

[Unit]
Description=SoftEther VPN Server
After=network.target
 
[Service]
Type=forking
ExecStart=/usr/bin/vpnserver start
ExecStop=/usr/bin/vpnserver stop
 
[Install]
WantedBy=multi-user.target

ファイルを作成したら自動起動し、続けてvpnserverを起動させます。

$ sudo systemctl enable vpnserver
$ sudo systemctl start vpnserver

必要に応じてF/W等に設定を加えます。この環境ではufwを利用しているので5555/tcpを許可します。ポート番号は必要に応じて加えていきます。今回は制限の緩い環境なので全て5555番を使う事にしました。

 $ sudo ufw allow from XX.XX.XX.XX to any port 5555/tcp

後はWindowsから操作した方が楽です。WindowsのPCにVPN ServerManager をインストールして、そこから接続します。初回接続時には管理パスワードの設定が求められるのでそれを設定します。その後仮想ハブやユーザー等を作成していきます。最後にローカルブリッジを設定します。この機能を使うと仮想ハブと物理NICをブリッジさせる事ができます。今回は新規のtapとして設定しました。

tkp_LdLg-gVPW7.png

新規tapの場合、デバイス名の接頭語にtap_が付くので、「0」とするとVM側のデバイス名はtap_0となります。なおサーバー側でのVLANの制限等を気にしなくて良い場合既存のデバイスにブリッジさせた方が絶対いいです。SoftEther VPN Serverの設定はこれで終わりです。

OpenvSwitchの設定

次に仮想スイッチであるOpenvSwitchの設定です。パッケージは全てaptに揃っているので必要なものをaptからインストール。自動起動の設定をします。

$ sudo apt install openvswitch-switch
$ sudo systemctl enable openvswitch-switch
$ sudo systemctl restart openvswitch-switch

インストールが完了したらブリッジを作成して先ほど作成したSoftEtherのtapとeth0を追加していきます。この時tap_0はtrunkに設定してvlan 1201,1202に設定します。

$ sudo ovs-vsctl add-br br0
$ sudo ovs-vsctl add-port br0 eth0
$ sudo ovs-vsctl add-port br0 tap_0
$ sudo ovs-vsctl set port tap_0 trunks=1201,1202

サーバー側の設定はこれで完了です。

SoftEther VPN Bridgeの設定

VPN Serverとほとんど一緒です。ので割愛します。

スループットの測定

フレッツ閉域網で17ms程度の遅延がある環境ですが、測定すると200Mbps程度速度が出るようです。ipef3の結果は下記の通り。

$ iperf3 -c 192.168.1.10
Connecting to host 192.168.1.10, port 5201
[  4] local 192.168.1.11 port 57351 connected to 192.168.14.10 port 5201
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  31.2 MBytes   262 Mbits/sec    0   1.94 MBytes       
[  4]   1.00-2.00   sec  40.0 MBytes   335 Mbits/sec  337   1.04 MBytes       
[  4]   2.00-3.00   sec  39.9 MBytes   335 Mbits/sec    6    807 KBytes       
[  4]   3.00-4.00   sec  39.9 MBytes   335 Mbits/sec    0    855 KBytes       
[  4]   4.00-5.00   sec  37.4 MBytes   314 Mbits/sec   12    634 KBytes       
[  4]   5.00-6.00   sec  31.1 MBytes   261 Mbits/sec    0    681 KBytes       
[  4]   6.00-7.00   sec  33.6 MBytes   282 Mbits/sec    0    712 KBytes       
[  4]   7.00-8.00   sec  34.9 MBytes   292 Mbits/sec    0    732 KBytes       
[  4]   8.00-9.00   sec  36.2 MBytes   304 Mbits/sec    0    742 KBytes       
[  4]   9.00-10.00  sec  34.9 MBytes   292 Mbits/sec    0    746 KBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-10.00  sec   359 MBytes   301 Mbits/sec  355             sender
[  4]   0.00-10.00  sec   357 MBytes   299 Mbits/sec                  receiver
 
iperf Done.

再起動時に疎通しない問題

今回すんなりトンネルは構築できたのですが、再起動後SoftEtherが上がっていてtapデバイスもいるのにいざpingを投げると疎通しないという問題がありました。どうもSoftEtherのtapが準備できていない状態でOpenvSwitchを起動させるとそうなるようです。起動した後に下記のスクリプトを実行するようにした所改善しました。結構無理矢理な感じなのであまり良くない解決法かもしれません。ただしこの現象はVMwareだけで発生していて、物理デバイスの実家側では発生していませんでした。

filevpn_check_and_restart.sh_.txt

上のスクリプトはsystemdから起動させます。systemdの設定ファイルは下記のような感じになってます。

[Unit]
Description=SoftEther tap ceheking and restart OvS
After=network.target
 
[Service]
Type=forking
ExecStart=/usr/local/sbin/vpn_check_and_restart.sh
TimeoutSec=0
RemainAfterExit=yes
SysVStartPriority=99
 
[Install]
WantedBy=multi-user.target

あまりsystemdには慣れてないのでこれで正しいかわかりませんが、ひとまずうまく行っているようです。

OvSとSoftEtherどっちでブリッジするか

今回はSoftEtherで作成したtapデバイスをOvSに追加する形で作成しましたが、逆にOvSで作成したデバイスをSoftEtherでブリッジする方法があります。これだと再起動時に疎通しない問題は起きなかったのですが、実際にHTTP等で通信すると通信できないorものすごく遅いという事が起きました。どうも相性が悪いようです。

$ sudo ovs-vsctl add-br br0
$ sudo ovs-vsctl add-port br0 tap0 -- set Interface port tap0 type=internal
(この後SoftEtherからtap0とブリッジ)

ちなみに今回SoftEtherが作成したtapデバイスをOvSにポートとして追加しているのですが、実はこの構成ってOvS的には推奨はしないようです。

http://docs.openvswitch.org/en/latest/faq/issues/

このあたりから長々と書いてあるのですが、ごめんなさいまだ読んでないです。後で読んで確認してみます。

おわりに

無事L2-VPNをSoftEtherで構築できました。自宅ではまだテスト段階ですが速度もRTX1200に比べたら2倍近く出ています。CPUもまだ余裕があるので多分フレッツ網での通信の限界が300Mbps程度なんでしょう。今回使った実家側の物理サーバーがMicroATXのサイズのケースでちょっと大きいです。今後安定的に動くようなら、もう少し性能は低くて良いからBOX-PCのようなものでも構築できないか検討していこうかと思います。