EdgeRouter X – 番外編1. Mac と SoftEther で拠点間 L2 VPN を構築する

さてここまで色々やってきましたが、どうしてももう1つチャレンジしてみたかったのが、 VPN ファンの誰もが憧れる2拠点のレイヤー2接続による完全同一 LAN 化です。最近かなり力づくですがその設定ができたので、同じ悩みを抱えたの人のためにここに設定例を載せてみます。 対象ファームウェアは 1.9.1 です。また使った macOS のバージョンは macOS Sierra 10.12.3 で、ソフトイーサは 4.22 beta です。

レイヤー2接続とは

レイヤー2接続とは、ものすごく乱暴に言えば2拠点が同じ Ethernet (= LAN) に接続されている状態にするということです。

以前の記事の第8項でやった設定では、2拠点は TCP/IP のレベルで接続されているので、レイヤー3接続ということになります。2拠点間がレイヤー2接続されるとなにがいいかというと、 VPN を通じて Ethernet フレームが行き来できるようになります。これにより通常の IP パケット以外の AFP や Bonjour 、そしてマルチキャストやブロードキャスト等が相互に行き来できるようになり、 iTunes / ホームシェアリングや DLNA とかも2拠点を通じて動きます。

この離れた拠点のレイヤー2接続は、昔は大変に難しいことでした。が、近年は VPN の技術が進み、 GRE-bridge や OpenVPN (tap) 、 L2TPv3 、 VPLS 等のレイヤー2 VPN を利用すれば可能です。が、 ルーター等でレイヤー2 VPN を使ってレイヤー2接続する場合には、必ず物理インターフェースである Ethernet のポートと、 ルーター内の VPN のトンネル端を「ブリッジ接続」する必要が出てきます。

ブリッジとは、乱暴に言うと Ethernet フレームをあるインターフェースからあるインターフェースへと全部横流しすることです。しかし EdgeRouter はブリッジが大変に苦手で、スピードがものすごく遅いです。かつブリッジ接続を使う場合は、そのブリッジ接続に関わりのあるすべてのインターフェースで速度が遅くなってしまうというオマケつきで、普通にインターネットする場合のスピードもついでに遅くなってしまいます。ハードウェアオフロードもオフになってしまいます。

自分も試しに GRE-bridge で自宅と実家をレイヤー2接続してみましたが、実家のインターネットが如実に遅くなり苦情が出ました。また GRE は小さい MTU の扱いが苦手と聞きます。レイヤー2接続は速度と遅延の少なさが非常に重要なので、この方法はどうも最適解ではなさそうです。しかし、どうしてもレイヤー2接続は諦められない。でも遅いのはイヤだ。私はしばらく悩みました。

じゃあどうするか

如何せん EdgeRouter がブリッジが不得意なので、プライドを捨てブリッジの得意な人にやってもらうことにしました。というわけで、世界で1番ブリッジ接続が得意なことで有名な ソフトイーサ でやってみることにしました。 EdgeRouter のフォーラムなんかを見ると、 Debian 用にコンパイルして EdgeRouter にインストールしちゃっている人もいるようですが、かなり CPU パワーの必要な処理なので、残念ながらあまり EdgeRouter 上ではパフォーマンスが出ないようです。 Rasberry Pi もしかり。というわけで素直に Mac mini を実家と自宅に用意して、そこにソフトイーサをインストールすることにしました。

SoftEther とは

ものすごく簡単にものすごく高度な VPN が構築できるソフトウェアです。ほとんどのファイアウォールを通過してしまう強力な接続性、世の中のほぼ全ての競合 VPN を上回るスピード、高スループットのブリッジ、 DDNS や NAT 回避機能 (APN Azure) まで内蔵し、かつフリーウェアとは驚異でしかありません。ただ Mac 版や Linux 版は以前までローカルブリッジがつかえない等フル機能でなく、またドキュメントや管理アプリケーションが手薄なのがネックでした。しかし去年あたりから、ようやく最近ほぼフル機能の Mac 版や Linux 版が出るようになり、そこそこの環境が整いました。(まだドキュメント等は大幅に手薄ですが・・)

概要

今回やることはこんな感じです。

各拠点にそれぞれ Mac mini をソフトイーサ駆動用に設置します。 Mac mini にはそれぞれ Thunderbolt Ethernet アダプタ接続して Ethernet ポートが1台につき2つとなるようとします。ソフトイーサは各拠点でそれぞれ仮想 HUB を作成し、 Thunderbolt Ethernet ポートとそれぞれローカルブリッジ接続します。拠点1のソフトイーサはサーバーとなり、仮想 HUB にアクセスしていいユーザーアカウントを作成します。拠点2でのソフトイーサはブリッジ用となり、拠点2の仮想 HUB から拠点1の仮想 HUB へ作成したアカウントでカスケード接続(つまり仮想 HUB 同士をまたブリッジ接続すること)を行います。ものすごく乱暴に概略図を書くとこんな感じです。

以上のようなやり方で、拠点1と拠点2の LAN がブリッジでレイヤー2接続され、晴れて Ethernet フレームが拠点間を同一の LAN として行き来するようになります。

用意したもの

  1. Mac mini x2
  2. Apple Thunderbolt – ギガビット Ethernet アダプタ x2
  3. LAN ケーブル x4

レイヤー2接続は速度や遅延が重要なので、今回は極力有線にします。ソフトイーサをローカルブリッジを用いた拠点間接続 VPN で使う場合は、通常の Ethernet ポートの他にローカルブリッジ用の Ethernet ポートを増設するのが推奨されるようなので、 Thunderbolt Ethernet アダプタを追加しました。

ちなみに、下記の方法をとれば、 Mac でも内蔵 Ethernet ポートのみでローカルブリッジが実現できるようです。

SoftEther VPNをMacでローカルブリッジする

下準備

各拠点に1台ずつ Mac mini を設置します。 Thunderbolt – ギガビット Ethernet アダプタを接続し、内蔵の Ethernet ポートとアダプタの Ethernet ポートをそれぞれ EdgeRouter の、同じ switch0 に属してる Ethernet ポートに接続します。

EdgeRouter のポートが足りない場合はスイッチングハブを使ってポートを増やすとよいでしょう。Mac mini は基本的な設定を済ませておいて、管理者ユーザーが画面共有で遠隔地からリモートで操作できるようにしておきましょう。

ただし、 IPsec や L2TP がうまく動かなくなるので、どこでも My Mac は必ずオフにしましょう。どこでも My Mac がなくても、操作したい端末の IP アドレスさえわかれば、画面共有は使えます。

macOS Sierra: 画面共有を設定して使用する

macOS Sierra: どこでも My Mac を使う

そして、2拠点がレイヤー2接続されることになるので、両拠点の EdgeRouter の LAN 側の IP アドレスをそのように調節します。こういう場合基本的には両拠点をまったく同じネットワークアドレス(192.168.1.0/24 等)にしてしまうことが多いです。しかし今回は両拠点の LAN で稼働するマシンが 60 台程度あり、 IP アドレスを変更したり重複しないように確認したりが面倒だったので、ネットワークアドレスは同じにせず、サブネットマスクを変えて2拠点が同一サブネット扱いになるようにしました。

EdgeRouter 1 EdgeRouter 2
LAN 側 IP アドレス (Switch0) 192.168.1.1/22 192.168.2.1/22
DHCP サブネットマスク 192.168.1.0/22 192.168.2.0/22
相手側 LAN への Static Route 削除 削除
UPnP2 / Block 4500 Port 192.168.1.0/22 192.168.2.0/22

各拠点の別々のサブネットをそのまま使うので、各拠点の端末に DHCP で割り当てている固定 IP アドレスや、 L2TP 用の IP アドレスプールに変更は必要ないはずですが、一応確認しておくといいかもしれません。

TCP/IP で通信をする端末はサブネットマスクによって相手先が同一 LAN にいるか、それとも同一 LAN にいないのでルーターにパケットを送るかを決定します。ウェブでも書籍でも様々に説明されていることですが、サブネットマスクの違いによる「同一の LAN」とみなされる範囲の違いをものすごく簡単にまとめるとこうなります。

例1 (192.168.1.1/24) 例2 (192.168.1.1/22)
IP アドレス 192.168.1.1 192.168.1.1
サブネットマスク 255.255.255.0 255.255.252.0
ネットワークアドレス 192.168.1.0/24 192.168.0.0/22
同一 LAN の IP アドレス範囲 192.168.1.1 – 192.168.1.254 192.168.0.1 – 192.168.3.254

このようにサブネットマスクをうまく調節することによって、ネットワークアドレスが違っていても、2拠点を同一の LAN と見なすように設定することができます。ですが、この2拠点が相互に通信できるようになるのはソフトイーサの設定が済んでからです。ここまでの場合、いくらサブネットを調節したとはいえ、両拠点間でレイヤー2パケット送受信するしくみがないうえに、両拠点間を結ぶ IPsec のレイヤー3接続トンネルを使う static routing の設定を削除してしまったので、一時的に両拠点は一切通信ができなくなります。なので、ここからは適宜 L2TP を使って設定を進めてください。

つづいて、ソフトイーサが必要なポートを使えるようポートフォワードの設定をします。 Mac mini には下記のように固定プライベート IP アドレスを割り振り、内蔵 Ethernet の IP アドレスに対して 5555番をポートフォワードします。

Mac mini 1 Mac mini 2
内蔵 Ethernet 192.168.1.101 192.168.2.101
Thunderbolt Ethernet 192.168.1.102 192.168.2.102
EdgeRouter 1 EdgeRouter 2
Original Port 5555 5555
Protocol Both Both
Forward-to address 192.168.1.101 192.168.2.101
Forward-to port 5555 5555
Description SoftEther SoftEther

これで WAN 側からソフトイーサが接続してきた時に、 LAN 側の Mac mini 内のソフトイーサにパケットが届くことになります。実はサーバーにならない側のソフトイーサには不要な設定ですが、なんとなく揃えてみます。後でサーバーにしたくなるかもしれないですし。

最後にソフトイーサがローカルブリッジとしてブリッジ接続することになる、 Thunderbolt Ethernet ポートのポート名を調べます。アップルメニューの「この Mac について」を選び、システムレポートボタンを押します。そのレポートで「ネットワーク」の「場所」欄を見るとポート名が出てます。かなりの確率で Thunderbolt Ethernet は en5 であるようです。

Mac mini 1 Mac mini 2
内蔵 Ethernet en0 en0
Thunderbolt Ethernet en5 en5

SoftEther のインストール

さて、それでは Mac mini にソフトイーサをインストールしてみます。 インストーラやドキュメント類が全然整備されていませんので、色々調べながら慎重に進めます。

  1. Xcode の Command Line Tool をインストール

    SoftEther を make する際に必要になるライブラリをインストールするため、 Xcode の Command Line Tool をインストールします。実は SoftEther を make した時に勝手にインストールされたので、わざわざインストールしなくてもいいかもしれません。下記のページなどにやり方が書いてあります。

    macOS Sierra に Xcode Command Line Tools をインストールする

  2. SoftEther のダウンロード

    SoftEther のウェブページから、 “SoftEther VPN Server” Mac OS X (Intel x64) 版 4.22 をダウンロードします。拡張子「.tar.gz」のファイルがダウンロードされるはずです。

  3. ファイルの伸張とコンパイル

    ターミナルを開き、下記のコマンドを入力します。ファイルは、ダウンロードフォルダにダウンロードしたとします。

    cd ~/Downloads/
    tar zxvf softether-vpnserver-v4.22-9634-beta-2016.11.27-macos-x64-64bit.tar.gz
    cd vpnserver
    make
    

    ここで使用許諾への同意を尋ねられます。またその後動作環境のチェックも行われます。「すべてのチェックに合格しました。このシステム上で SoftEther VPN Server / Bridge が正しく動作する可能性が高いと思われます。」と表示されれば合格です。詳しくは下記を参照してください。

    7.3 Linux へのインストールと初期設定

    ちなみにソフトイーサを日本語で動作させたい場合は、同じフォルダ内の “lang.config” ファイルを書き換えます。

  4. ファイルの移動とアクセス権の設定

    ファイルを移動し、 root 以外で実行されないようアクセス権を設定します。

    cd ..
    sudo mv vpnserver /usr/local/
    cd /usr/local/vpnserver/
    sudo chmod 600 *
    sudo chmod 700 vpncmd
    sudo chmod 700 vpnserver
    
  5. 動作確認

    では試しに SoftEther VPN Server を起動してみましょう。フル機能で動作させるには root 権限で起動させます。

    sudo /usr/local/vpnserver/vpnserver start
    

    きちんとインストールされていれば、 SoftEther が起動します。確認したら一旦止めます。

    sudo /usr/local/vpnserver/vpnserver stop
    
  6. ソフトイーサをバックグラウンドプロセスとして動作するよう設定

    ソフトイーサをユーザーがログインしようがしまいが Mac が起動すると同時に root 権限でバックグラウンドで動作するよう設定します。色々 script をいじるのは大変なので、 Lingon X というアプリを使います。

    Lingon X を起動
    ツールバーの「+」ボタンを押す
    User を root にする
    Name に適当に「 com.lingon.softether.helper 」等を入力
    Run に「 /usr/local/vpnserver/vpnserver start」を入力
    テストボタンを押して動作することを確認
    「 At stratup and when saving 」にチェック
    「 Always 」にチェック
    「 Save 」ボタンを押す
    

    これで終わりです。テストしたので、またソフトイーサが動作しているはずです。

  7. Macを再起動して、再起動後ソフトイーサが起動することを確認

    文字通り再起動して、その後起動コマンドを入力せずともソフトイーサが動作していることを確認します。動いてなければ Lingon X での設定がうまくいってないかもしれません。

  8. ソフトイーサ管理マネージャをインストール

    こんどはソフトイーサの設定のための GUI アプリケーションをインストールし、動作しているか確かめます。

    SoftEther Server Manager for Mac OS X をダウンロード
    伸張し、アプリケーションフォルダに置き、起動
    localhost へ接続する接続設定を作り、 ポート 5555 番で SoftEther VPN Server へ接続
    管理者パスワードを設定
    

    ポートは 5555 番にしましょう。この管理マネージャだけを解説したドキュメントがなかなかありませんが、下記ページを見ると初回接続時のやり方が少しだけ載ってます。

    7.2 Windows へのインストールと初期設定

    上記をそれぞれの Mac で行なって、2台の Mac でソフトイーサが起動している状態にします。

SoftEther の設定

さて、それではソフトイーサを設定して拠点間をレイヤー2接続してみます。ここでは2台の Mac にインストールした SoftEther VPN Server のうち、1つをサーバーとして設定、もう1つをサーバーにカスケード接続する VPN Bridge として設定します。下記2つのページを参考にしました。

拠点間接続 VPN

10.5 拠点間接続 VPN の構築 (ブリッジ接続を使用)

3.4 仮想 HUB の機能

2台の Mac での設定は、それぞれの Mac にソフトイーササーバ管理マネージャーをインストールして、画面共有経由でログインしてやってもいいですし、第3の Mac に管理マネージャーをインストールして、両方の Mac の IP アドレスを指定した接続設定を作って、 L2TP 経由で接続してやってもいいです。

  1. サーバー側の設定
    簡易セットアップで「拠点間 VPN サーバーまたはブリッジ」にチェック
    「多拠点からの接続を受け入れる VPN Server」を選択
    仮想 HUB を作成
    ローカルブリッジを仮想 HUB と「 en5 」との間で作成
    カスケード接続用のユーザーを作成
    

    確かこんな感じでした。 VPN Azure や DDNS は、もうすでに EdgeRouter で DDNS が設定してあって、かつ 5555 番のポートフォワードも問題ないようであれば不要です。

  2. ブリッジ側の設定
    簡易セットアップで「拠点間 VPN サーバーまたはブリッジ」にチェック
    「各拠点に設定する VPN Bridge」を選択
    仮想 HUB を作成
    ローカルブリッジを、仮想 HUB と「 en5 」との間で作成
    サーバーへのカスケード接続を仮想 HUB 上に設定
    (サーバーで設定したユーザー名、サーバーの DDNS 等でのドメイン名、ポート 5555 番で設定)
    カスケード接続へセキュリティーポリシーを設定
    (DHCPパケットをフィルタリングにチェック)
    

こんな感じです。高度なレイヤー2 VPN があっけないほど簡単に接続されてしまうのでびっくりです。

仕上げ

さて、あと少し。このままでは実は Policy Based Routing / Domain Based Routing の項で設定した tun0 を利用したルーティングが、ソフトイーサが稼働してない時は動作しなくなってしまいます。理由を簡単に言えば、こんな感じかと思います。

  1. 拠点1の 192.168.1.0 内の端末 192.168.1.5 から Policy Based Routing 対象のサイトにアクセス
  2. 行きのパケットは、拠点1のルーターが tun0 を通るようルーティングする
  3. そして tun0 のトンネルを抜け、拠点2のルーターから目的のサイトに到達
  4. 帰りのパケットは拠点2のルーターに届く
  5. 帰りのパケットの目的地は 192.168.1.5 だが、それは拠点2と同一サブネット扱いなので、拠点2のルーターは tun0 に戻さず、どこか LAN 内にいるだろうとパケット送り出すも、 SoftEther が動いてないので 192.168.1.5 にはたどり着かず・・

さて、これをどうやって帰りも必ず tun0 を通るようにするかというと、行きのトンネルを通るときに IP マスカレードして、トンネルの IP アドレスから送信したように見せればいいわけです。つまり、

  1. 拠点1の 192.168.1.0 内の端末 192.168.1.5 から Policy Based Routing 対象のサイトにアクセス
  2. 行きのパケットは、拠点1のルーターが tun0 を通るようルーティングする
  3. かつ拠点1のルーターは IP マスカレードによって、パケットの送信元を tun0 の IP アドレスに変換
  4. そして tun0 のトンネルを抜け、拠点2のルーターから目的のサイトに到達する
  5. 帰りのパケットは拠点2のルーターに届く
  6. 帰りのパケットの目的地は tun0 なので、拠点2のルーターは tun0 にパケットを戻す
  7. 拠点1のルーターはマスカレードの記録を元に、パケットを 192.168.1.5 に戻す

となるわけです。これでソフトイーサが動作していなくても、トンネルを使ったルーティングが常に動作するようになります。

それでは自宅側のルーターで tun0 に対してマスカレードを設定します。

自宅ルーターのみ設定
Description: masquerade for tun0
Outbound Interface: tun0
Translation: Use Masquerade
Protocol: All protocols

これを応用すれば、ソフトイーサ無しでも両拠点のルーターにアクセスできるようになります。このマスカレードを両拠点で tun0 に対して設定し、その tun0 の両端の IP アドレス (192.168.122.1 および 192.168.122.2) を使うだけです。

さらに、 SoftEther によって Bonjour は何もしなくても両拠点で一体的に動作するので、 mDNS Reflector は両ルーターで disable にしてしまってよいでしょう。

おわりに

というわけで、 SoftEther VPN Server の Mac での常駐化と拠点間 L2 VPN 接続でした。いかがでしたでしょうか。

すべて EdgeRouter で完結しないのは残念ですが、ソフトイーサのおかげで EdgeRouter 自身はブリッジ接続から解放され、結果としてルーターとして高速なスループットを保ちながら L2 VPN による2拠点の一体化ができようになりました。

ちなみにこの環境を実現するのに、下記のものは特に必要ありませんでした。特に何もせず UDP 高速化も動作しています。

  • UDP 高速化を動かすための エフェメラルポート等の設定
  • TUN / TAP
  • Secure NAT
  • SoftEther の DDNS (EdgeRouter のを使用)
  • VPN Azure (EdgeRouter でポートフォワード)

お疲れ様でした。今回 static routing は削除しましたが、以前設定した IPsec/GRE 自体のトンネルは生きてるので、 domain based routing は変わらず動作しています。ただ2拠点間の通信が、レイヤー3レベルの static routing でなくてレイヤー2レベルのソフトイーサブリッジ経由になっている、ということになります。


yabe.jp » Gadgets » EdgeRouter X – 番外編1. Mac と SoftEther で拠点間 L2 VPN を構築する