OpenVPN 
学校から自鯖をネットワークドライブとしてマウントできたら便利だと思い、VPNを構築してみた。(構築し終わったのは2-3週間前だけどまとめるのがめんどくさかった)

VPNを構築するにはRTX1000等のハードウェアを使ったVPNと、普通のPCでVPNデーモンを起動し接続するソフトウェアVPNがある。
前者は専用の設定パネルなどがある分いくらか簡単だが、個人で所有するにはちと高い。後者は汎用コンピュータを使うため、いろいろなところを設定をしなければならず手間がかかる。

ハードウェアVPNも惹かれるのだが今は資金がないためソフトウェアVPNを構築してみようと思った。

有名なVPNソフトと言えば、Softether、Hamachi,OpenVPNあたりだろう。

Softetheは設定面、速度面、共に優秀なのだけど、今は30日のトライアル版のみになってしまったので30日を過ぎると接続できなくなってしまう。一応シリアルを入手し直せば延長できなくもないが、重要なときに"シリアルの延長し忘れてて繋がらない"ということがあってはいけないので却下。

Hamachiは設定するところがほとんど無いと言ってもいいほど設定が簡単で、なおかつNATの設定をしなくても繋がるという機能がウリだ。
技術的には、両方ともPort0でサーバになれない場合はHamachi上のネットワーク上にいる他のマシン(か、Hamachi本社の鯖)を中継し「両方ともクライアントになる」事により通信できるようになるらしい。この辺はWinMX(の検索時)に似ているような気がする。

しかし、いくら他の人から参照されることがないとはいえP2Pネットワーク上に自分のマシンを共有するという仕様はちょっといただけない。あと、ローカルで試したところ1MB/sec程度しか出なかったので速度面でも不満だ。設定を詰めればもっと出るのかもしれないが。

こうなると残るはOpenVPNになる。OpenVPNは設定をすべてConfファイルでやるため、はっきり言って分かりづらい。(まぁGUI<CUIな人には何ともないけど。)
だが、VPNソフトとしてはもっとも使われているし、オープンソフトのためGNUの変態な人たちが様々な検証を詰めてくれているのでソフトとして堅牢だろう。速度面、安定性は未知数だが、他がないためこれを使うことにした。

インスコなどの手順はオフィシャルのHow-toや解説サイトが沢山あるため割愛。ここでは自分が詰んだ点をメモとして書いていこうと思う。

まず詰んだのがcertification(証明書)の発行とVPN上のDHCPの関係だ。
1台しか繋いでいないときは気がつかなかったのだが、複数台つなげるとなるとcertificationもその台数分だけ発行しないといけない。
発行されたcertificationにはそれに対応するIPがサーバー側で割り振られるので、同じものを使ってしまうとIPが重複して繋がらないという事態が起きてしまう。How-toにも「台数分発行しろ」と書いてあるけど、まぁ大丈夫だろうと思ったがだめだった。


そして技術的な難関はtunとtapの違いだ。

調べたところ、tunはTunnelling、つまりサーバとクライアントの間にトンネルを掘り双方間で通信できるようにするという方法だ。
デフォルトだと通信は鯖対子の1対1しかできないが、Client-to-Clientを許可することによりVPN上にいるマシンすべてと通信できるようになる。
だが、この方法だとサーバ側のLANに他のマシンがあってもVPNに参加していなければ通信でいない。



tapは、まずアタッチするNICとVPNの仮想NICをブリッジするところから始まる。ブリッジすると、インターフェース1とインターフェース2をつなげたインターフェース3ができあがる。この間はブロードキャストパケットなどを通し、L2スイッチとして動くようだ。つまり、tapでつなげてしまえば本当にそのLANの中にいるように出来るのだ。




ここで少しテストをしてみる。



サーバを下手にいじりたくないので毎度おなじみ実験用の狐マザーにNICを追加し、IF1を今あるLANへ繋げ、IF2をノートPCに直結する。
IF1=192.168.1.*
IF2=192.168.2.*
このままだとノートPCはIF2と通信することはできるがIF1とは繋がらない。当然、ノートPCからはIF1の繋がっている先のLANにも繋がらない。




次に、VPNをインスコしVPN InterFae(VIFとする)を作成する。これで試しにVPNデーモンをtunで起動すると、IF1とIF2の両方からVPNに繋ぐことができる。だが、tunで起動すると上でも述べたようにVPN上に参加しているマシン(下の図ではVIFを持ったマシン)にしか繋ぐことができない。




そしてサーバのIF1とVF1をブリッジさせIF3を作りだし、、VPNからIF1の先のLANにつなげることのできるようにしてみる。これが分かりづらいので図にしてみる。





ノートPCからVPNに繋ぐには、IF2を経由してサーバに繋ぎに行く。サーバ側は、IF2を通してVPNにアクセスさせる。ここでVIFをブリッジすると、IFを束ねた仮想インターフェースであるIF3が出来る。つまり、IF1とVIFが合体したIF3にアクセスさせることにより、VIFはIF1を通してその先のLANに繋ぎにいけるようになる、ということだ。(言い換えるとVIFがIF1と2の橋渡しをする)
これがいわゆる"HamachiでLANゲームをする"というような時に使う方法だ。

試しに、LANにあるVPNに繋がっていないPCでRainbow Six:RavenShieldのサーバーを立て、ノートPCからLANゲームを見たところ、しっかりとサーバが表示された。


これがVPNを使う上で一番理想型なのではないかと思ったが、これにも問題がある。
たとえばノートPCがある方のLANとtapで繋ぎに行った先のLANのサブネットが同じ192.168.1.*になってしまうとやっかいだ。route addを使わないとVPNの先のマシンが見えないのだ。

実際にはOpenVPNの設定でそういったルーティングが出来るらしいのだが、どうにもうまく機能しない。ルーティングに関してはtunを使うといいらしいのだけどこれもよく分からない。自分のNoooooooooooooooooooooooobさに泣きそうだ。

最終的に「共有させるマシンすべてをtunでVPNに繋ぎ(前の画像で言うとVIFを持たせる)、VPNのサブネットをまず使われていないであろう数値にする」という手段を使うことにした。これで今のところ問題は起きていない。


そして気になるパフォーマンスは…
LAN内であれば、ML115(Athlon 5000+ BE@2.8GHz)-サブマシン間(E5200@3.32GHz)で大体9MB/sec (72 Mbps)くらい出るようだ。ノートPCでもLAN内で5MB/sec(40Mbps)は出る。



直に繋いだときに比べるとかなり落ちてしまっているが、それでも外で使うには十分(外でこれだけの速度を出せるところは中々無い)だと思う。


興味のある人は試してみるといいよ!


コメントを書く
必要事項とコメントを入力して下さい。









タグの挿入