一人暮らしをしているとサーバーの一部を実家に置いてVPNを構築しようというのは誰でも考えると思います。家でもRTX1200のVPNの機能を利用してVPNを構築しているのですが、1200は意外と非力で特に暗号化をするとCPUが100%に張り付いてしまいます。RTX1210を買えば解決しそうですが、まだまだ高い。それならソフトウェアでVPNを構築しようと考えました。OpenVPNとか色々と選択肢はありましたが、今回は比較的お手軽で高速と噂されているSoftEtherを使う事にしました。
全体の概要は上の図の感じです。左が自宅(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をインストールしましょう。自宅側はVMで新規にDebianをインストールします。この時VMwareのスイッチのポートグループは下記のように設定していないとうまく動かないので注意しましょう。セキュリティを気にするならVPN用のポートグループは専用に用意した方がいいかもしれません。VLAN ID 4095はuntagを意味し、タグ付きのまま転送します。ここで転送するVLAN IDは個別指定はできないようです。
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として設定しました。
新規tapの場合、デバイス名の接頭語にtap_が付くので、「0」とするとVM側のデバイス名はtap_0となります。なおサーバー側でのVLANの制限等を気にしなくて良い場合既存のデバイスにブリッジさせた方が絶対いいです。SoftEther VPN Serverの設定はこれで終わりです。
次に仮想スイッチである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
サーバー側の設定はこれで完了です。
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だけで発生していて、物理デバイスの実家側では発生していませんでした。
上のスクリプトは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には慣れてないのでこれで正しいかわかりませんが、ひとまずうまく行っているようです。
今回は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のようなものでも構築できないか検討していこうかと思います。