OpenVPN with jail on FreeBSD 6.4-R

jailの中にOpenvpn serverを隔離しようと設定したら、盛大にはまってしまったので、打開策をメモ。
標準的なOpenVPNサーバの設定方法は、以下のリンクを参考に。

設定。

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の設定について追記。