SoftEtherでL2-VPN構築

一人暮らしをしているとサーバーの一部を実家に置いて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をインストールする形で環境を用意しました。

  • NEC Express5800 GT110b
  • 標準構成のCeleron
  • Intel NIC 2口(1つ目はオンボード、2つ目はPCIx1)
  • Debian 8

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

  • VMware ESXi 6.5
  • CPU 2コア / メモリ 512MB
  • HDD 20GB
  • Debian 8

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

SoftEther VPN Serverのインストール

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

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

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

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

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

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

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

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

OpenvSwitchの設定

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

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

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

SoftEther VPN Bridgeの設定

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

スループットの測定

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

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

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

vpn_check_and_restart.sh

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

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

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

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

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

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

Q: I created a tap device tap0, configured an IP address on it, and added it to a bridge, like this:

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

おわりに

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