自宅と実家をOpenVPNでつなぐ!
前回、自宅と実家をVPNでつなごうという計画の思いつきから、さまざまな失敗談を書いた。今回は、ちゃんとつながったということの報告と、設定メモについて記す。
ちなみに、自宅⇔実家間は車で1-2時間ほどかかる。我が家には(自宅・実家ともに)この手の設定をできる人間は自分しかいないので作業はなかなか面倒だった。リモートで作業できるようにするために、少なくとも一度実家に帰らなくてはならない。しかも、失敗したらもう一度帰らなくてはならない。VPN設定のためだけに妻と子供をほったらかして休日つぶして行き来するのもアレだし、実家に遊びに行くついでの作業としてやらなくてはいけないという制約もあり、なかなか緊張感のある作業だった。
計画
まずは何はともあれ計画である。前回のさまざまな試行錯誤の末に、「OpenVPNでつなごう」というところまでは決まった。それを前提としたもうちょっと詳細な計画である。
OpenVPNでVPNを張る方法としてLayer2でやる方法(TAP)とLayer3でやる方法(TUN)がある。
今回、自分は自宅(横浜市戸塚区)と実家(東京都東久留米市)の2拠点を結んでDLNAで息子の写真を両親に見せることが主目的である。そのためDLNA的にブロードキャストが通らなくてはならないし、まあ、双方で使っている端末数なんてのも知れているため、Layer2の方法を選んだ。
IPアドレス割当計画
ブリッジ接続で同一ネットワークにするということで、以下のように設定することとした。実家、自宅のBuffaloルータにそれぞれ設定した。
192.168.1.1 - 10 自宅の固定IP機器群
192.168.1.11 - 20 実家の固定IP機器群
192.168.1.128 - 169 自宅のDHCP機器群
192.168.1.180 - 220 実家のDHCP機器群
OpenVPN接続計画
前述のとおり、実家側はBuffalo無線LANルータをDD-WRT化したので、これを使うことができる。自宅側もルータで設定できればいいのだが、DD-WRT化できないBuffaloルータを半年前に買ったばかりだったのでそれができない。しかし幸い自宅には24時間運用のLinuxサーバを立てているのでそこにOpenVPNを入れることとした。
OpenVPNは、クライアント・サーバで動くプログラムなので、どちらかをクライアントにしてどちらかをサーバにする必要がある。自宅側は固定グローバルIP無料というありがたいプロバイダで固定IPもらっているため、こっちをサーバにすることとした。
自宅(横浜市戸塚区)側の設定
色々試行錯誤して、そのプロセスについてはここにメモるまえに忘れちゃったんだけど、結論として動くようになった設定ファイルの内容を以下に記しておく。そういうわけで、無駄な設定なんかか含まれているかもしれないけど・・^^
OpenVPNサーバの設定
mode server port 1194 # dev tap って書くだけでよさそうだけど。 dev tap0 dev-type tap # 一応TLS鍵作ってやってみた。 tls-server ca ca.crt cert server.crt key server.key dh dh1024.pem client-to-client keepalive 10 120 comp-lzo user nobody group nogroup persist-key persist-tun status openvpn-status.log verb 3
/etc/network/interfaces の設定
前述設定でOpenVPNを起動すると、tap0という仮想ネットワークインターフェースが立ち上がる。でも、それだけじゃ何も嬉しくなくて、サーバの物理NIC(eth0)とをブリッジでつないでやる必要がある。まずは、コマンドでそのあたりを試して、接続試験を行った。ping 192.168.1.11 (実家のルータのLAN側アドレス)が通ったときは、思わず「おおっ」と思った。
ただ、そのままだとサーバを再起動したときに切れちゃうし、毎回手でコマンド打つのはいやな(有り得ない)ので、ネットワークを起動したり再起動したりしたときに自動接続するよう設定した。
auto lo iface lo inet loopback allow-hotplug eth0 auto eth0 iface eth0 inet static #address 0.0.0.0 address 192.168.1.2 netmask 255.255.255.0 network 192.168.1.0 auto br0 iface br0 inet static address 192.168.1.2 netmask 255.255.255.0 network 192.168.1.0 broadcast 192.168.1.255 gateway 192.168.1.1 # dns-* options are implemented by the resolvconf package, if installed dns-nameservers localhost, 192.168.1.1 dns-search forton.shimono.net pre-up /usr/sbin/openvpn --mktun --dev tap0 pre-up /sbin/ifconfig tap0 0.0.0.0 promisc up pre-up /sbin/ifconfig eth0 0.0.0.0 promisc up pre-up /usr/sbin/brctl addbr br0 pre-up /usr/sbin/brctl addif br0 eth0 pre-up /usr/sbin/brctl addif br0 tap0 post-down /usr/sbin/brctl delif br0 eth0 post-down /usr/sbin/brctl delif br0 tap0 post-down /usr/sbin/brctl delbr br0 post-down /usr/sbin/openvpn --rmtun --dev tap0 post-down /sbin/ifconfig eth0 down
実家(東京都東久留米市)側の設定
OpenVPNクライアントの設定
実家側はDD-WRT化したBuffaloルータのopenvpnクライアント機能を使う
この設定をしたら、自宅(サーバ)側のopenvpnのログに実家(クライアント)から接続に来た旨が表示された。(verboseレベルを5ぐらいにあげておいた。)
ブリッジの設定
ただ、これだけだとダメで、実家側もブリッジの設定をしてやる必要がある。sshでDD-WRT化されたルータに入って、自宅側でやったのと同様のブリッジ設定をした。
こちらも、ルータ再起動の度に設定するのはいやだったので、起動スクリプトとして仕込んでみた。
実は、ちょっとDDWRT的にこれでいいのか良く分からない。ルータ再起動でちゃんとつながるかというと、どうもつながっていない気もするのだが、すくなくともこの画面からポチっと押せばつながるようにはなったのでよしとしよう。(それでstartupのところとcustom scriptのところに両方書いてある)
とりあえず以上、不完全な情報だが覚えている範囲で記しておく。(設定して動いたらもう疲れちゃって・・・ 1ヶ月以上経ってから書いてるもので、すんません)