モバイル環境でのjail利用

FreeBSDでjailというとサーバ機でサービス毎に環境を分けて安全性を高めるという用途が多いと思うが,私の場合はアプリケーションの動作検証や開発環境を普段の生活環境と分離させるために利用している.こういう環境では外部ホストからjail環境にアクセスする必要はないが,portsでソフトをインストールする時などjail環境内から外部へアクセスしたい事が時々起こる.
ノートPCでjailを利用すると,移動でネットワーク環境が変わるとjail環境用のIPアドレスも変更しなくてはいけなくなり苦労していた.これを解決するためホスト環境がNATする環境を作った.

ミソはjail環境用のIPエイリアスアドレスをループバックインタフェース lo0 に付けること.こうしておくと,外部との通信を有線と無線(例えば,rl0とwlan0)で切り替えてもIPエイリアスの再設定が必要ない.インタフェースを切り替えた場合はNAT用のルールだけ再設定してやれば良い.

具体的な設定は下記の通り.
jail環境用のサブネットとして192.168.255.0/24を使うことにする.まず /etc/rc.conf でjail用のIPエイリアスを設定しておく.

ifconfig_lo0_alias0="inet 192.168.255.10/32"
ifconfig_lo0_alias1="inet 192.168.255.11/32"
ifconfig_lo0_alias2="inet 192.168.255.12/32"
ifconfig_lo0_alias3="inet 192.168.255.13/32"
:

NATにはpfを利用する./etc/pf.conf は下の通り.外部インタフェースがrl0とwlan0で切り替わるときは ext_if を変更するか,別ファイルに書いておいてファイルを切り替える.

ext_if="rl0"
#ext_if="wlan0"
jails_subnet="192.168.255.0/24"
nat on $ext_if from $jails_subnet to ! $jails_subnet -> ($ext_if)
rdr on lo0 proto udp from $jails_subnet to any port 53 -> 127.0.0.1 port 53

(今はVMwareのゲスト環境でFreeBSDを利用しているので,rl0とかwlan0ではなくem0とem1になっている)

pf の設定の最後に入っている rdr の行はDNSに関するモノ.この点について補足しておく.
私はもともとモバイル環境でDNSサーバが切り替わってもアプリケーションの再起動が必要無いように,/etc/resolv.conf は下記のように指定して,ローカルホストでDNSフォワーダを立ち上げている.

nameserver 0.0.0.0

DNSフォワーダはいろいろ選択肢があると思うが今はpdnsd (ports/dns/pdnsd)を利用している.pdnsdを lo0 に対してlistenさせておけばjail環境からの問い合わせにも応答してくれる.おき,jail環境からのDNSクエリーをpfでリダイレクトさせる.例えば192.168.255.10で立ち上げているjail環境の/etc/resolv.confはこう(↓).192.168.255.10 は lo0 に付けたエイリアスなので lo0 に届いて pf が拾って 127.0.0.1 へリダイレクトして pdnsdが応答してくれる.

nameserver 192.168.255.10

pdnsdはdhclientと連携させたりして使っているが,それはまた別のブログで.