NIC1つのWindowsマシンでルータ+OpenVPNサーバ

前口上+PC構成

OpenVPNでリモートから自宅にアクセスできるようにしていたのだけど、
いちいちメインPCをwolで起こすのが無駄に感じたので、2ヶ月ぐらい前にサーバ用PCを自作してみました。
ついでに古いルータも置き換えちゃおうって軽い気持ちで思ってました。
構成はこんな感じ

  • CPU : Athlon5350
  • マザボ : MSI AM1I
  • メモリ : 4GBx1
  • HDD : 3TB
  • 電源 : 100W ACアダプタ
  • ケース : ホームセンターで買った収納ボックス

24時間動かすもんだから省電力がいいと言うことで調べたところ、
5350+AM1Iが良いと言う評判だったので買ってみました。
AMDの自作はやったことがなくて興味があったってのもあるけど。
ACアダプタも効率が良いらしいと言うことで。
でかい立派なケースも要らないので、1000円ぐらいのケースを
糸鋸+千枚通しで加工してケースにしました。

あと、Gigabitハブも買ってきました。

やりたいこと

設定するに当たっての条件は次の通り。

  • Windows上に作りたい : TS鯖にしたり最近容量無制限になったOneDriveにいろいろ上げたりしたかったから
  • NICは1つで : 普通ルータを作るって言うとNIC2つでやるけど原理上は1つでもいけるはず。NIC代をけちりたい。
  • OpenVPN鯖を動かす : できればtapで
  • インターネットはFTTH(PPPOE接続)

ルータとか鯖だったらLinuxが基本とか言われていますが、
まあなんとかなるでしょう。Windows好きだし。

いろいろやってみた

で、ルータ兼サーバなんて簡単に設定できるだろうと思ってたんですが、
いろいろ不都合が出てきてずいぶん大変でした。
2ヶ月ぐらいやってました。
結果だけ知りたい人はすっ飛ばしてください。

とりあえずOpenVPNとPPPOE

とりあえずルーティングは後回しにして、
windows8.1にOpenVPN(tap)を入れてPPPOEでインターネットにつないで見ました。
そしたら、
見事にBSOD(IRQL_NOT_LESS_OR_EQUAL)…

tapのOpenVPNサーバを構成するにはブリッジ接続が必要で、
ブリッジ接続とPPPOE接続を同時にするとBSODが出るようでした。
…じゃあルータとOpenVPNサーバを同時に動かすのは無理なのか?

しょうがないから仮想マシン上でいろいろ動かそう。

VMWare上にルータを構成してみる

仮想マシンでルータとOpenVPNサーバを動かせばいけるか?ということでやってみました。
OSは以前のルータで使ってたdd-wrtと本格的なルータOSのvyOS。
どっちも一応ルーティングができるところまで設定してみたけど、
パフォーマンスがいまいち(50Mbpsぐらいしか出なそう)だったので却下。

Win8.1単独で頑張ってみる

ルーティングに関してはNAT32とかいうルータ化ソフトがあるらしい。
OpenVPNはtunならブリッジしないし何とかなるんじゃないか?
と言うことで仮想マシンを入れないで頑張ってみました。

結果

  • NAT32

遅すぎて話にならない。
あと使い方もよく分からないなあ。
ずいぶん昔に作られたソフトっぽいし。

  • tun

サーバマシンとリモートの通信はできました。
しかし、ルーティングして自宅の別マシンとリモートで通信しようとすると上手くいきませんでした。
どうやら、tunで別マシンとリモート間の通信をするにはNICをプロミスキャスモードと言うモードにしなければいけないけれど、Windowsだとそのプロミスキャスモードにできないらしいです。

Windowsだめじゃん…

Windows server2012を入れてみる

WindowsにはサーバOSがあります。
サーバOSならルーティングとかいろいろできるのでは?という
淡い希望を持って入れてみました。
無料で使えるご身分だったので。

結果
ルーティング設定とかいろいろいじってみましたが、
NIC1つでルーティングを可能にする方法は見つかりませんでした。

しかも、Athlon5350+AM1IのマシンではWindows serverにおいてグラボがちゃんと動かず画面が真っ暗(リモートデスクトップでしか操作できない)
という問題もあり、サーバOSは諦めました。

インターネット接続の共有

いろいろ調べているうちに、Windows(クライアントOS含む)にはインターネット接続の共有(ICS)という機能があることを見つけました。
一見ライトユーザ向けの機能に見えるこの機能は意外と使えるもので、
ちゃんとルータとして動いてポートフォワーディングも使えます。
設定すると勝手にIPアドレスとサブネットを決められてしまいますが、後から変えられます。
他のマシンもサブネット内の固定アドレスを設定すればちゃんと動きます。

VMwareOpenVPNを動かす

後はOpenVPN(tap)ですが、今までやったように直接Windows8.1上では動かなそうなので、
VMware上のubuntuに入れてみました。
http://www.slsmk.com/getting-started-with-openvpn/installing-openvpn-on-ubuntu-server-12-04-or-14-04-using-tap/
の通りやると、すんなり設定できました。
いやーLinuxってWindowsと違って素晴らしいですね。

しかし、仮想マシンpingを送ると4倍ぐらいに増殖した応答が返ってくるという謎の現象が起こってしまいました。
これのせいでOpenVPNも異常なパケットが来たと認識してちゃんとつながりません。
どうやら、ルーティング機能を有効にしているとパケットが増殖してしまうようです。

じゃあ仮想化ソフト変えようか。

Hyper-Vにしてみる

VMwareではなくMicrosoft謹製の仮想化ソフトHyper-VOpenVPNを動かしてみました。
GUIはめちゃくちゃ重い(MS糞すぎる)けれど別にsshでつないで設定すれば良いので影響はありません。

やっとOpenVPNも正常に動きました。
なぜかVPNプロトコルUDPだと10Mbpsぐらいしか出なくてTCPだと40Mbps出るという
不思議な現象が起こっていますが。

その後

いろいろいじってるとたまにBSOD(UNEXPECTED_KERNEL_MODE_TRAP)が出ました。
ドライバが原因のことが多いらしいので、Catalystを新しいのにしたりしたら出なくなりました。
その代わりに再起動時にBSOD(DRIVER_POWER_STATE_FAILURE)が出るようになったけれど、再起動はあんまりしないし実害もないのでいいや。

結論

結論として、次のような構成にすれば、
NIC1つのWindows8.1上でルータとtapのOpenVPNサーバが作れました。

ポイントとしては

  • ルータのマシンでインターネット接続の共有を使う
  • 仮想マシンNICはブリッジ接続にする
  • OpenVPNプロトコルは何故かTCPの方が速い
  • PPPOE接続はrasdialコマンドでスタートアップ時につなげる

こんなところでしょうか。

ネットワーク関係をやるんだったらWindowsじゃなくてLinuxを使えという忠告が嫌と言うほど実感できた2ヶ月でした…