グローバルIP1個で複数のjailを動かす

昨日途中まで構築したjail環境の続き。 昨日は名前解決の手前で止まっていたが、/etc/resolv.confをjail環境下にコピーして再起動したらあっさり解決した。

#cp -p /etc/resolve.conf /usr/jail/JAILNAME/etc/

さて、これで基本的な設定自体は完了。 但し、この構成で運用しようとすると、jail毎にIPが違うため、複数のIPアドレスが必要。 グローバルIPの契約にも月数千円かかるし、なるべくなら節約したいところ。

一番簡単な解決方法としては、それぞれにローカルIPを割り当てた上で、ルータを手前に置いてしまえばいいのだが、 さくらをはじめとしたVPS環境ではハードウェアはいじくれないのでその構成は取れない。

ホントはこんな構成を取りたい

調べてみると、どうやら同一のIPアドレスを複数のjailで使い回すこと自体は可能なようだが、 それ、動作はするんだろうけど、本当に妥当な構成かなぁ?

色々考えた末に、結局ソフトウェアでNATをかけてやることにした。 こんな構成になる。

今回採用する、えっルータ必要ないの?でもお高いんでしょう?な構成

さて、そのためにはrc.confとpf.confの設定が必要になる。

/etc/pf.conf

# 外部ネットワークインターフェイス
ext_if="em0"
# 内部ネットワークインターフェイス
int_if="lo0"

# 内部NWのNW設定
table <private> const { 192.168.0.0/24 }

# IP マスカレード
nat on $ext_if inet from ($int_if) to ! <private> -> ($ext_if)

# NAT 設定。外からの http(80), https(443) は内部の 192.168.0.1 に、smtp(25) は内部の 192.168.0.2 に割り当て
rdr pass on $ext_if proto tcp from any to ($ext_if) port {80, 443} -> 192.168.0.1
rdr pass on $ext_if proto tcp from any to ($ext_if) port 25 -> 192.168.0.2
 
# パケットフィルタ
# 今回はセキュリティは気にしない方向で。運用するならここで厳しくはねる。
pass in quick all
pass out quick all 

/etc/rc.conf(必要な所だけ)

network_interfaces="em0 lo0"

ifconfig_em0=グローバルIPの設定を書き込む
defaultrouter=デフォルトゲートウェイのIPアドレス

ifconfig_lo0="inet 127.0.0.1"
ifconfig_lo0_alias0="inet 192.168.0.254 192.168.0.255 netmask 255.255.255.0" #default GWに見立てたローカルIP
ifconfig_lo0_alias1="inet 192.168.0.1" #webサーバ用jailで使うローカルIP
ifconfig_lo0_alias1="inet 192.168.0.2" #mailサーバ用jailで使うローカルIP

##pf router
pf_enable=YES
pf_rules="/etc/pf.conf"
pf_flags=""
pflog_enable="YES" #pfをデーモンとして起動する
pflog_logfile="/log/pflog"
pflog_flags=""

##jail
ezjail_enable="YES"
jail_enable="YES"
jail_list="web"
jail_set_hostname_allow="NO"
jail_sysvipc_allow="YES"

これで再起動すれば動くはず。

さて、ここまでできたらjailのNW設定はほぼ完了。 後はportから必要なアプリを入れていく作業になるが、 jailごとにports一式を持っていたらHDD容量がいくらあっても足りないので、 portsだけはjailをまたいで共有したい。 そのための設定についてはまた次回

Written on July 27, 2011