自宅と実家をOpenVPNでつなぐ!

前回、自宅と実家をVPNでつなごうという計画の思いつきから、さまざまな失敗談を書いた。今回は、ちゃんとつながったということの報告と、設定メモについて記す。

ちなみに、自宅⇔実家間は車で1-2時間ほどかかる。我が家には(自宅・実家ともに)この手の設定をできる人間は自分しかいないので作業はなかなか面倒だった。リモートで作業できるようにするために、少なくとも一度実家に帰らなくてはならない。しかも、失敗したらもう一度帰らなくてはならない。VPN設定のためだけに妻と子供をほったらかして休日つぶして行き来するのもアレだし、実家に遊びに行くついでの作業としてやらなくてはいけないという制約もあり、なかなか緊張感のある作業だった。

計画

まずは何はともあれ計画である。前回のさまざまな試行錯誤の末に、「OpenVPNでつなごう」というところまでは決まった。それを前提としたもうちょっと詳細な計画である。

OpenVPNVPNを張る方法として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ぐらいにあげておいた。)

ブリッジの設定

ただ、これだけだとダメで、実家側もブリッジの設定をしてやる必要がある。sshDD-WRT化されたルータに入って、自宅側でやったのと同様のブリッジ設定をした。

こちらも、ルータ再起動の度に設定するのはいやだったので、起動スクリプトとして仕込んでみた。

実は、ちょっとDDWRT的にこれでいいのか良く分からない。ルータ再起動でちゃんとつながるかというと、どうもつながっていない気もするのだが、すくなくともこの画面からポチっと押せばつながるようにはなったのでよしとしよう。(それでstartupのところとcustom scriptのところに両方書いてある)

とりあえず以上、不完全な情報だが覚えている範囲で記しておく。(設定して動いたらもう疲れちゃって・・・ 1ヶ月以上経ってから書いてるもので、すんません)