FreeBSDで pf で NATを使って jailを運用するメモ

最近さくらのVPSとか安価でFreeBSDを使えるサイトが出てきました。 こういったサービスでもjailを使いたいのですが、 悩ましいのが安いサービスはIPアドレスが1つしかもらえないこと。 もちろん適当なプライベートなIPアドレスをIFにaliasで振ってjailを作っちゃえばいいんですが、これだとjail内部から外部へ通信ができないという問題があります。

そこでpfを使ってNATを構築してみました。jailをプライベートIPで外へ出ていくパケットをNATでグローバルIPに変換してやろうという考え方です。

いろいろ試行錯誤してみましたが、結論からいうともう1つIFを作るのが手っ取り早いようです。とりあえずlo1を作ります。

# ifconfig lo1 create
# ifconfig lo1 up

で、アドレスを振る。ここでは 10.0.0.1にしてみました。

# ifconfig lo1 10.0.0.1 netmask 255.255.255.255

/etc/pf.confに次のように書きます。

ext_if="em0"
int_if="lo1"
table <private> const {10.0.0/24}
nat on $ext_if inet from ($int_if) to ! <private> -> ($ext_if)

これで jailを10.0.0.1で起動すれば、lo1(すなわちjail)から外に出るパケットはpfでext_ifのアドレスに書き換えられます。 (em0は適当に環境に合わせて書き換えてください)

/etc/rc.confで起動時に自動的に実行させるには以下の行を追加します。

ifconfig_lo1="inet 10.2.2.1 netmask 255.255.255.255"
cloned_interfaces="lo1"
pf_enable="YES"
pf_rules="/etc/pf.conf"

いずれもFreeBSD-9.1で確認しました。

コメント一覧

pfの何がいいかって、pfレベルでユーザーやグループを判定できるところ・・・。踏み台サーバーを構築するのには良い構造・・・。あとはChrootやJailでActive Directoryとの通信や複数認証の方法を設定出来れば、完璧なんだけどな~。 pfって使いこなすと色々と出来て良いです~。
Makoto

あとは、あの難解な設定ファイルのルールがなんとかなれば完璧かなぁと思っております。
Issei