OpenVPN on Mac OS X Leopard その7

以上でLeopardクライアント版でOpenVPNによるVPNサーバーの設定は完了。後は、クライアントにOpenVPNをインストールしてクライアントキーを与えれば、クライアントのtunデバイスに自動的にIPが与えられ、同時にクライアントのデフォルトルートがVPNサーバーに設定されるので、クライアントから出る通信は全てVPNサーバーに送られ、そこでNATで変換されてインターネットに出て行く様になる。
もし、一時的にVPNサーバーを止めたいと思った場合は sudo
launchctl unload…

以上でLeopardクライアント版でOpenVPNによるVPNサーバーの設定は完了。後は、クライアントにOpenVPNをインストールしてクライアントキーを与えれば、クライアントのtunデバイスに自動的にIPが与えられ、同時にクライアントのデフォルトルートがVPNサーバーに設定されるので、クライアントから出る通信は全てVPNサーバーに送られ、そこでNATで変換されてインターネットに出て行く様になる。

もし、一時的にVPNサーバーを止めたいと思った場合は

sudo launchctl unload -w /Library/LaunchDaemons/org.macports.openvpn2
sudo launchctl unload -w /Library/LaunchDaemons/net.waterroof.rules.plist

で自動起動をとめ、再起動すればいい。逆にその状態からまたサーバーを再開したい場合には、上記のunloadをloadに変えて実行すればいい。

OpenVPN on Mac OS X Leopard その6

ここまでくれば後一息。クライアントからの通信をインターネットに中継する為にNATを有効化してVPNルーターとして働く様にする。
幸いな事に、FreeBSDベースのMac OS
Xはサーバー用でなくてもipfwとnatdが最初から用意されている。というわけで、ここでipfwとnatdをさくさくと設定したいところだが・・・どうにもlaunchdの為の設定を書くのは難しい。
ということで、ここは簡単なツールに頼る事にする。その名もWaterRoofというMac
OS Xのファイヤーウォールの設定をG…

ここまでくれば後一息。クライアントからの通信をインターネットに中継する為にNATを有効化してVPNルーターとして働く様にする。

幸いな事に、FreeBSDベースのMac OS Xはサーバー用でなくてもipfwとnatdが最初から用意されている。というわけで、ここでipfwとnatdをさくさくと設定したいところだが・・・どうにもlaunchdの為の設定を書くのは難しい。

ということで、ここは簡単なツールに頼る事にする。その名もWaterRoofというMac OS Xのファイヤーウォールの設定をGUIからいじる為のフロントエンドツールがちゃんと出回っている。

WaterRoof

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)になっているかも念のため確認しておこう。

OpenVPN on Mac OS X Leopard その5

さて、次は自動的にMac OS
X起動時にOpenVPNが起動される様に設定する。
本当はMacPortsのお作法的にはdaemondoにdaemonとして起動してもらう様な設定を書くのが正しいのだと思うが、どうにもdaemondoに関するドキュメントが見当たらないので、OS
Xのlaunchdを使って自動的に起動してもらうことにした。止めるときの事はあんまり考えない様にする。
これには、以下のファイルを用意する。
/Library/LaunchDaemons/org.macports.open…

さて、次は自動的にMac OS X起動時にOpenVPNが起動される様に設定する。

本当はMacPortsのお作法的にはdaemondoにdaemonとして起動してもらう様な設定を書くのが正しいのだと思うが、どうにもdaemondoに関するドキュメントが見当たらないので、OS Xのlaunchdを使って自動的に起動してもらうことにした。止めるときの事はあんまり考えない様にする。

これには、以下のファイルを用意する。

/Library/LaunchDaemons/org.macports.openvpn2


<?xml version=”1.0″ encoding=”UTF-8″?>
<!DOCTYPE plist PUBLIC “-//Apple//DTD PLIST 1.0//EN” “http://www.apple.com/DTDs/PropertyList-1.0.dtd”>
<plist version=”1.0″>
<dict>
<key>KeepAlive</key>
<true/>
<key>Label</key>
<string>org.macports.openvpn2</string>
<key>ProgramArguments</key>
<array>
<string>/opt/local/sbin/openvpn2</string>
<string>/opt/local/etc/openvpn2/server.conf</string>
</array>
<key>RunAtLoad</key>
<true/>
</dict>
</plist>

後は、以下のコマンドで有効にする。

sudo launchctl load -w /Library/LaunchDaemons/org.macports.openvpn2

これで起動してるはず。

ps -ax | grep openvpn2
ifconfig -a

でプロセスが起動しているか、tunデバイスが設定されているかを確認しよう。これが動いていれば再起動しても自動的に起動する様になってるはず。

逆に止めたければ、先ほどのlaunchctlのコマンドでloadをunloadにすればいい。

OpenVPN on Mac OS X Leopard その4

設定ファイルは人それぞれだと思うが、とりあえず今回使った設定をのせておく。
/opt/local/etc/openvpn2/server.conf — port 1194 proto udp dev tun0 ca
/opt/local/etc/openvpn2/keys/ca.crt cert /opt/local/etc/openvpn2/keys/Server.crt
key /opt/local/etc/openvpn2/keys/Server.key dh /opt/local/…

設定ファイルは人それぞれだと思うが、とりあえず今回使った設定をのせておく。

/opt/local/etc/openvpn2/server.conf


port 1194
proto udp
dev tun0
ca /opt/local/etc/openvpn2/keys/ca.crt
cert /opt/local/etc/openvpn2/keys/Server.crt
key /opt/local/etc/openvpn2/keys/Server.key
dh /opt/local/etc/openvpn2/keys/dh1024.pem
server 192.168.50.0 255.255.255.0
push “redirect-gateway def1”
keepalive 10 120
comp-lzo
persist-key
persist-tun
status /opt/local/etc/openvpn2/openvpn-status.log
verb 3

ミソはpushディレクティブで、これによりクライアントが接続後、自動的にOpenVPNを通して全ての通信を送る様にルーティング設定される。

さて、ここまで出来たら、一度

/opt/local/sbin/openvpn2 /opt/local/etc/openvpn2/server.conf

とやってちゃんと起動するかを確かめよう。

OpenVPN on Mac OS X Leopard その3

OpenVPNではSSLを用いて通信経路の暗号化とクライアントの認証を行うので、これに用いる暗号鍵を作らないといけない。
この辺は本家のHow-toやら日本語でもたくさんの記事があるので、日本語のサイトを一つだけあげておく。
OpenVPNで構築するリモートアクセス環境
注意しないといけないのは、MacPortsにおけるeasy-rsaのディレクトリの場所で、
/opt/local/share/doc/openvpn2/easy-rsa
になっている。これ以外は基本的には多くのドキュメントでl…

OpenVPNではSSLを用いて通信経路の暗号化とクライアントの認証を行うので、これに用いる暗号鍵を作らないといけない。

この辺は本家のHow-toやら日本語でもたくさんの記事があるので、日本語のサイトを一つだけあげておく。

OpenVPNで構築するリモートアクセス環境

注意しないといけないのは、MacPortsにおけるeasy-rsaのディレクトリの場所で、

/opt/local/share/doc/openvpn2/easy-rsa

になっている。これ以外は基本的には多くのドキュメントでlinuxではこうやりなさいと書いてある通りにCA認証局の鍵を作成し、サーバー証明書・クライアント証明書・DH鍵を作成すればいい。

途中、パスフレーズを聞かれるが、これはパスフレーズを入力すると、OpenVPNが起動時に鍵を読み込む時にパスフレーズを要求する様になるので、必ず何も入力しない様にする。後、当然プライベートでしか使わない鍵なので、ローカルCA認証局で署名しておくこと。これは、鍵の作製の最後で署名するか聞かれるのでyesと答えればいい。今回は面倒なのでサーバー側の名前をServer、クライアント側の名前をClientとしておいた。

分かりにくいのがドキュメントにある変数設定のvarsの読み込みで

. ./vars

とあるのだが、これは二つの.の間にスペースがあるので注意。本来は

source ./vars

と書けば間違いがないんだがな。

サーバー側に場所を決めてopenvpn2で使う鍵を置いておく。置いておくべき鍵は

Server.crt
Server.key
ca.crt
dh1024.pem

これらを

/opt/local/etc/openvpn2/keys

というディレクトリを掘って置いておいた。

逆にクライアント側には

Client.crt
Client.key
ca.crt
dh1024.pem

の鍵が必要になる。出来る限りフロッピーの様な物理的手段で運搬しよう。ネット経由だと盗聴されるともともこもない。

OpenVPN on Mac OS X Leopard その2

さて、OpenVPNの導入だが、面倒なのでここはMac OS
X用のPortageの一つであるMacPortsを使う事にする。 MacPorts
インストールや最初の最新版への更新等はHow
toやwikiを参照すること。 MacPorts WikiJP
最新に更新したら、portコマンドをつかってopenvpn2をインストールする。基本的には以下のコマンドで完了。
sudo port install openvpn2
ただし、今の環境ではHTTPはプロクシ経由でしか出れないので、コマンドに失敗…

さて、OpenVPNの導入だが、面倒なのでここはMac OS X用のPortageの一つであるMacPortsを使う事にする。

MacPorts

インストールや最初の最新版への更新等はHow toやwikiを参照すること。

MacPorts WikiJP

最新に更新したら、portコマンドをつかってopenvpn2をインストールする。基本的には以下のコマンドで完了。

sudo port install openvpn2

ただし、今の環境ではHTTPはプロクシ経由でしか出れないので、コマンドに失敗する場合はコマンドラインでプロクシの為の環境変数を強制的に指示してあげればいい。

sudo env http_proxy=http://xxx.xxx.xxx.xxx:8080 port install openvpn2

MacPortsにはopenvpnとopenvpn2の二つのパッケージが存在するが、現行の最新版はopenvpn2の方なので間違えない様に。

OpenVPN on Mac OS X Leopard その1

さて、OpenVPNでVPNを作るにはtunデバイスをつかってIP over
IPのトンネルを作るか、あるいはtapデバイスをつかってLayer
2 over IPのブリッジを作るかなのだが、残念な事にMac OS
Xにはtunデバイスもtapデバイスも存在しない。
しかし、ちゃ〜んと用意してくれる人はいるもので、 TUNTAP
Virtual network interfaces for Mac OS X
なるプロジェクトでtunデバイスとtapデバイスを追加するkernel
extensio…

さて、OpenVPNでVPNを作るにはtunデバイスをつかってIP over IPのトンネルを作るか、あるいはtapデバイスをつかってLayer 2 over IPのブリッジを作るかなのだが、残念な事にMac OS Xにはtunデバイスもtapデバイスも存在しない。

しかし、ちゃ〜んと用意してくれる人はいるもので、

TUNTAP Virtual network interfaces for Mac OS X

なるプロジェクトでtunデバイスとtapデバイスを追加するkernel extensionが開発されている。

ここから最新版のファイルを落としてくるとインストールパッケージになっているので、指示通りにインストールして再起動する。

/dev/tun0~15,/dev/tap0~15

が追加されてればtunデバイスとtapデバイスの準備は完了。

OpenVPN on Mac OS X Leopard

とある事情があって、またしてもOpenVPNでトンネルを作ることになってしまった。しかも今回はサーバーにMac
OS X Leopardを使うことに。サーバー側がMac OS X
ServerならVPNなんぞ簡単に作れるのだが、ServerじゃないバージョンのMac
OS
Xなのでちょいと面倒だったけど、さすがFreeBSDベースのOSだけあって、ツールのお膳立てはかなりそろっていてなんとか動かす事ができた。
というわけで、忘れないうちに備忘録として作業内容を記録しておく。

とある事情があって、またしてもOpenVPNでトンネルを作ることになってしまった。しかも今回はサーバーにMac OS X Leopardを使うことに。サーバー側がMac OS X ServerならVPNなんぞ簡単に作れるのだが、ServerじゃないバージョンのMac OS Xなのでちょいと面倒だったけど、さすがFreeBSDベースのOSだけあって、ツールのお膳立てはかなりそろっていてなんとか動かす事ができた。

というわけで、忘れないうちに備忘録として作業内容を記録しておく。