のらりくらり

物理化学分野のポスドクです。プログラミング、読書、自転車などが好きです。

OpenVPNを構築した

 ふと思い立ってOpenVPNを家に構築した。その記録。
 構成としては、FreeBSDOpenVPNサーバをたてて、家の中にあるMac Mini Late2012にアクセスできるようにする。

 Mac OS Xの共有機能って画面共有(いわゆる遠隔操作)、リモートログイン(SSH)、ファイル共有などがOS標準で備わっている。このたび、家のMac Miniの母艦としての使い道を強化するために、これらの共有機能を自宅の外から使いたいと考えていた。

 一番簡単なのは、ルーター(僕の家にはAppleAir Mac Extremeがある)のSSH, 画面共有、ファイル共有などのポートを開いて、それをホストにするMac Miniに繋ぐこと・・・ではあるんだけど、これだとインターネットの世界に対してポートをたくさん開くことになるし、ググればわかるのだが画面共有とかのセキュリティって一応パスワードをかけることはできるのだけど、すっげーへぼいらしい。
ほかにもそとからアクセスしたい機能があったりしたときにそのポートを開かないといけないし、さらにいえばそのポートを使う機能はNATルータに対してリダイレクトを指定できるマシンは一つしかない。よってこの案は却下となった。

 二番目に考えたのは、iCloudの機能の一つである「どこでもMy Mac」だ。これをつかえば、LANの内側にあるマシンに外からアクセスできるようになる。しかも設定はApple IDさえあればあとは数発のクリックくらい? それだけでホストマシンが許可した共有機能に対してのアクセスが可能になる。こういうのをうまーくブラックボックス化して誰もが使えるようにするアップルっていう会社はやっぱりすごいよなーと本当に思う。これでそういう機能があることさえ知っていれば誰でも使えるのだから。
 ただ、一つ不満があった。それはクライアント(外側のマシン)として使えるのがMacのみだという点。僕も普段使っているのはMacBook Airだからそれでも困らないんだけど、実際にじゃあそれで何してるかっていうとバイト先のLinuxSSHで繋いだりとかで、基本的に使用するのはブラウザとターミナルくらい。正直Macじゃなくてもどれもできる機能ばかりだ。このMacBook Airが今度壊れたらもう安くてキーボードだけ叩きやすいラップトップかってLinuxとかで使っても全然こまらない。MacBook Airはそれでもやっぱりカッコいいし好きだけどね。
 なんでも、この「どこでもMy Mac」はIPv6とかを応用して、アップル独自の方法でLAN内のマシンのアドレスを解決しているらしい。本来SSHも画面共有もMac固有のプロトコルではなく、クライアントの環境にSSHとかVNCとかさえ入っていればOSに関わらず使える機能なんだけど、アドレス解決の時点でこれがMacに制限されるのがたまらなかった。

 せっかくならクライアントのOS関係なくこれらを使えるようにしたい、しかもなるべくセキュアな方法で。それで行き着いたのがSSHトンネリングかOpenVPNだった。SSHのサーバはFreeBSDをインストールしてしまえばすぐたつので、これをトンネルさせるのは簡単ではあるんだけど、毎回の接続時にすこし面倒くさそうなので、OpenVPNを構築することにした。
 
 OpenVPNにはルーティングによるものとブリッジによるものとがある。前者は、クライアントは別セグメントからLANにアクセスするような感じになるのに対し、ブリッジはLANと同じサブネットにいる感じになる。
 OpenVPNの公式サイトだとルーティングが推奨されていて僕もはじめはそっちにしようとした。設定ファイルとかはググればたくさんの人が自分のブログとかに公開されていて、それをまねすれば全然困らなかった。そしてささっとFreeBSDによるOpenVPNサーバは立った。VPNサーバからクライアントのVPNアドレスにpingしてもきちんとつながる。だけどどうもLAN内のMacに対してSSHすらできない。ここでハマった。後で冷静になってみれば簡単なことで、LAN内のサーバ以外のマシンがクライアントのVPNアドレスに対してパケットを送信しようとしたときに、ルータがそれをFreeBSDOpenVPNサーバに転送しないといけないというのがわからず、とりあえずグローバルに送ってTTL切れで消失していたのだろう。ようするにルーティング接続するときにはデフォルトゲートウェイルータそのものに対して、VPNクライアントのサブネット宛のパケットはすべてOpenVPNサーバに送る、という静的ルーティングの設定が必要になるのだ。 ちなみに、AirMac Extremeはそれできない。高いのにやる気ねーな。

 そういう訳で、ブリッジ接続することにした。これもたくさんの人がブログとか書いてるからググりさえすれば誰がやってもそんなに困らないとは思う。これでMacBook Airが外にいてもあたかも同じサブネットにいるかのようになり、外にいてもFinderの左側のところの「共有」の所に自宅のMacが表示されるようになった。
 とりあえず、ルーティングが推奨、とかっていってるけど、実際には家で使う程度ならブリッジの方が僕は設定は簡単でいいと思う。サーバの設定でtapデバイスをUPしたりとか少しだけわかりにくいかもしれないけど、これ以外にはハマる場所はないんじゃないかと思う。
 とりあえずOpenVPNが使えるようになり、すごく便利になった。なにより、MacBook AirOpenVPNとインターネットブラウジングトラフィックをさばいてもらえれば、他の作業は自宅のMac Miniquad core、メモリ16GBの環境で処理させればいいので、リソースをあまり使用しなくてよくなった。他にも、iTunesの共有も利用できるので、自宅の母艦に入っている音楽を出先のMacBook Airで再生できる。
 思っていた以上に便利がよく、超絶スーパー快適な環境がお金の投資をすることなく構築できた。ネットワークの勉強にもなったしいいこと尽くめである。終わり。

もしたまたまこのブログを見た人でOpenVPN構築しようとしているけどハマったとかいうケースがあればいってもらえればうれしいです。僕もいろいろハマった上にどっちの設定も試したのである程度は助けになれればと思います。
 ずいぶんと長くなってしまった。