FreeBSD6.1でFirewall+NATルータ

検証用にあるとたまに便利なので、Virtual PC上にFreeBSD 6.1でFirewall+NATルータを作ろうと思い立って、IPFilter+IPNATで5〜6時間粘ってみたが結局出来ず。設定は間違ってないと思うのだけどどうやってもNAPT、IPマスカレードにならない。
気が変わってIPFW+NATDにしたら5分で出来た。ポートリダイレクトの設定もちょちょい。なんじゃそら。


一応手順をメモ。
カーネルの再コンパイルは不要。


0.材料
ホストOS: Windows XP SP2
仮想PC: Virtual PC 2004 SP1
ゲストOS: FreeBSD 6.1
インターネット側IPアドレス: 192.168.0.253/24
イントラネットIPアドレス: 10.0.0.1/24


1.ループバックアダプタ作る
インターネットに繋がってるネットワークカードとは別に、Windows XP上にイントラネット用のループバックアダプタを作る。
ループバックアダプタに設定するアドレスが上のイントラネット側アドレス(10.0.0.x)だとそこ経由でイントラネット側のPCと通信できて検証にならないので172.16.0.1 とか、適当な別ネットワークのプライベートアドレスを振っておく。


2.仮想PCを作る
仮想PCのNICを二枚に設定する。
1つ目にインターネットに繋がっているアダプタを、2つ目にループバックアダプタを割り当てる。


3.FreeBSDを仮想PCにインストール
minimalインストール。
ネットワークの設定は後でするので、ここではしない。


4.設定ファイル編集
rc.confファイルを編集する。
NICIPアドレスを割り当て、IPFW+NATDを有効に設定する。
de0が外側、インターネット側(プライベートアドレス使ってるけど)。
de1が内側、検証用のイントラネット側。
defaultrouterはインターネットに繋がるルータのアドレス。


とりあえず今回はポートリダイレクトが出来れば良かったので外側、192.168.0.253:80に飛んできたパケットを 10.0.0.2:80 にリダイレクトするようnatd.confファイルを設定。必要なければ rc.conf の natd_flags と /etc/natd.conf ファイルはいらない。


今回パケットフィルタリングはしてないのだけども、必要なら firewall_type を "simple" に設定して /etc/rc.firewall を適当に修正。


/etc/rc.conf


hostname="NAT01.local"
keymap="jp.106"

ifconfig_de0="192.168.0.253 netmask 255.255.255.0"
ifconfig_de1="10.0.0.1 netmask 255.255.255.0"

defaultrouter="192.168.0.1"

firewall_enable="YES"
firewall_type="open"
natd_enable="YES"
natd_interface="de0"
natd_flags="-f /etc/natd.conf"
gateway_enable="YES"


/etc/natd.conf


redirect_port tcp 10.0.0.2:80 80


リブートして設定終了、簡単。


6.検証
手順4で設定したリダイレクト先のIPアドレス(10.0.0.2)を持つ適当なWEBサーバ立てて、ホストのWindows XPIEから http://192.168.0.253/ に接続してWEBサーバが表示されたら正しく設定されている。


その他.
ついでにWindowsのネットワーク負荷分散に相当する機能がFreeBSDにも無いかと思って探していたら、どうやらcarpというのを使えば出来るらしい。次に暇になったら試してみよう。