ここまでくれば後一息。クライアントからの通信をインターネットに中継する為にNATを有効化してVPNルーターとして働く様にする。
幸いな事に、FreeBSDベースのMac OS Xはサーバー用でなくてもipfwとnatdが最初から用意されている。というわけで、ここでipfwとnatdをさくさくと設定したいところだが・・・どうにもlaunchdの為の設定を書くのは難しい。
ということで、ここは簡単なツールに頼る事にする。その名もWaterRoofというMac OS Xのファイヤーウォールの設定をGUIからいじる為のフロントエンドツールがちゃんと出回っている。
Leopard用の最新のものをダウンロードして、アプリケーションフォルダにでも突っ込んでおく。
さて、起動したらまずするべきは、WaterRoofによるファイヤーウォールの設定が起動時に反映する様に自動実行スクリプトをインストールする。これはWaterRoofのメニューからTools -> Startup Script -> Install Startup Scriptを選べばいい。これで、launchd用の設定と実際に起動時に実行されるwrapperである/etc/waterroof.shが用意される。さらにTools -> Forwarding -> Enable ForwardingでNATに必要なインターフェース間のパケットの転送の許可をカーネルに指示する様にしておく。
次にnatdを実行する様に設定する。ウィンドウからNAT Setupを選び、NATの出口になるインターフェースを設定する。今回のサーバーは有線接続なのでen0を指定する。それから、Default configuration -> Save configuration -> Start NAT -> Enable NAT auto startと順に押すだけで設定完了。ipfwに対する設定まで全部自動で済ませてくれる。
さて、このままだと実はなぜか自動実行時には設定途中で止まってしまってnatdが起動して来ない。natdが起動しないと外との通信もなにもかも出来なくなってしまうので、非常にこまる。ということで、/etc/waterroof.shを書き換えてちゃんとnatdが上がる様にする。
悪さをしているのは、
ipconfig waitall
という行。これは、起動時に全てのインターフェースが起動するのを待ってから設定を始める為に必要なんだけど、OpenVPN起動時のtunデバイスの起動とはどうも相性が悪いらしい。そこで、これをコメントアウトして、代わりに単純な秒読みウェイトをいれてあげる。
sleep 5
試した限りでは5秒も待たせれば十分なようだ。単にコメントアウトしただけではダメだったので、少しはウェイトを入れる必要があるんだろう。初回起動時にはログイン後に5秒ほど待つとネットが使える様になるが、5秒なんてOSがデスクトップの描画の準備をしている間に過ぎてしまうので実用上の問題は無いだろう。
再起動してログインして
ps -ax | grep natd
でnatdが起動しているのが確かめられれば問題は無い。
後は、
sudo ipfw list
でen0を通るパケットに対してdivertルールが適用されているか、と
sysctl net.inet.ip.forwarding
でこの値が1(true)になっているかも念のため確認しておこう。
Onyxでキャッシュをクリアしたら、sleep 5では立ち上がらなかった。とりあえず様子見でsleep 20にしたら自動で立ち上がる様になったので、しばらくは20秒のwaitで動かしてみる。
どうもキャッシュのクリア後の再起動時とかにnatdが立ち上がらなくなることが頻繁にあるみたい。これはsleepの時間とかとも関係ないようだ。
再起動後はnatdのプロセスが動いているかを確認して、もし動いてなければWaterRoofからもう一度Start NATを実行して一度natdを手動で動かしてあげると、それ以後、再起動時もnatdが自動で立ち上がるようになる。
おそらく、一度動かさないとプロセスのキャッシュができないので、自動ではうまく立ち上がらないんだろう。理由はわからんので気持ち悪いが、対処療法で。