OpenVPN with jail on FreeBSD 6.4-R
jailの中にOpenvpn serverを隔離しようと設定したら、盛大にはまってしまったので、打開策をメモ。
標準的なOpenVPNサーバの設定方法は、以下のリンクを参考に。
- http://griffonworks.net/freebsd/openvpn/
- http://d.hatena.ne.jp/qloopy/20070708/1182611969
- http://markun.onohara.to/2007/10/15/freebsd-62release-openvpn-20-b.html
設定。
HOSTマシンで
# kldload if_tap # kldload if_bridge
実行、kldstatで読み込まれてるか確認。
認証局を開局うんたら〜鍵がうんたら〜は、上のリンク参照。
で、jailの中からtapとか見たいんだけど、見えない。見えるようで見えない。ものによってはそそるけど、計算機では腹立たしいだけなので、きちんと見えるようにします。
/etc/devfs.ruleを弄る
デフォルトだと、/etc/devfs.ruleが無い気がするので、無い場合は/etc/defaults/devfs.rulesからコピーしておきましょう。
# cp /etc/defaults/devfs.rules /etc/devfs.rules
コピーし終わったら編集します。
[devfsrules_jail=4] add include $devfsrules_hide_all add include $devfsrules_unhide_basic add include $devfsrules_unhide_login
こんな行があると思うんで、
[devfsrules_jail=4] add include $devfsrules_hide_all add include $devfsrules_unhide_basic add include $devfsrules_unhide_login [devfsrules_vpnjail=5] add include $devfsrules_jail add path 'tap*' unhide
こんな感じに追加してやります。まぁ、4番のルールを読み込んで、tap*にマッチするデバイスだけは見られるよう、4番のルールを継承した後にoverrideして、5番のルールを定義してます。
また、デフォルトではinclude出来る、再帰の深さが制限されており、上の設定が反映されません。以下のコマンドを実行し、制限の値を変更します。
sysctl vfs.devfs.rule_depth=2
また、これをブート時に反映させる為に/etc/loader.confに
vfs.devfs.rule_depth=2
を書き加えて下さい。
jailの設定を変更する
さて、「tap*もjailで見えるようにする」ルールを追加したところで、そのルールをjailが解釈してくれなきゃ話になりません。ので、5番ルール=tapがみえるルールをjailが適用するようにします。
jailマシンの中で、「OpenVPNを走らせるマシン」の設定ファイルを書き換えます。
設定ファイルは/etc/ezjail/*に、各jailマシンの設定があるので、これを編集します。たとえば、jailマシンの名前がvpnserverならば、vpnserverっていう名前のファイルを編集します。
export jail_vpnserver_devfs_ruleset="devfsrules_jail"
の部分以下に書き換え、先のルールを適用します。
export jail_vpnserver_devfs_ruleset="devfsrules_vpnjail"
これでおk。
bridgeとか。
net.link.ether.bridge.config="em0,tap0" net.link.ether.bridge.enable=1
ここで、em0というインタフェース名は各自のインタフェースと置き換えて下さい。
tapにipを振ります
HOSTマシンの/etc/rc.confに、以下の記述をしてtap0にipを振ります。
因みに、タップタップなのは私のお腹です。
ifconfig_tap0="inet 192.168.1.xxx netmask 255.255.255.255"
各々の環境にあった、まだ使われていないIPを指定してあげて下さい。
ユーザモードでtapをopenできるようにする
sudo sysctl net.link.tap.user_open=1
後、起動時にこれが有効になるように
HOSTマシンの/etc/sysctl.confに
net.link.tap.user_open=1
を書きくわえる。
em0とtap0をブリッジします。
因みに、タップタップなのは私のお腹です。
以下のコマンドを実行します。一応、em0は各々の環境に合わせて読みかえて下さい。
# ifconfig tap0 create # ifconfig bridge0 create # ifconfig bridge0 addm em0 # ifconfig bridge0 addm tap0 # ifconfig bridge0 up
ここで、上記のコマンドが起動時に実行されるように、rc.local辺りに書いてやりましょう。
本当ならば、openvpnの設定ファイルで書くべきなのですが、jailの中にopenvpnを閉じ込めてしまっているので、HOST側でこの操作をしてやる必要があります。
OpenVPNの設定ファイル
OpenVPNの設定ファイルをかきかきします。
環境によると思いますが、私の環境での設定を晒しておきます。
port 1194 mode server tls-server proto tcp-server # サーバモードで起動 dev tap ca /usr/local/etc/openvpn/keys/ca.crt cert /usr/local/etc/openvpn/keys/server.crt key /usr/local/etc/openvpn/keys/server.key dh /usr/local/etc/openvpn/keys/dh1024.pem client-to-client keepalive 10 120 comp-lzo # 圧縮を有効に persist-key persist-tun status openvpn-status.log verb 3
なお、この設定は内側にDHCPサーバが立っている環境での設定です。
後は
jail環境で、通常のOpenVPN環境を整えるときと同じように設定してやります。
参考までに、我が家のサーバの、jailの中の/etc/rc.confは
openvpn_enable="YES" openvpn_configfile="/usr/local/etc/openvpn/server.conf" openvpn_dir="/usr/local/etc/openvpn" openvpn_if="tap"
詳しくは、頭に書いた参考サイトをご覧下さい。
これで
一応jailの中からtapがみえるようになって、jailの中でOpenVPNが立ち上げられるようになるかと思います。
2008/12/20
実はきちんと接続できていなかったとかいう酷い罠を修正。
- tapにipを振る必要が無かった
- 古いbridgeを用いていたのを、新しいbridgeを使うようにした
上記に伴う記事修正と、サーバの設定を追記。
2009/9/22
sysctl vfs.devfs.rule_depth=2の設定について追記。