next up previous contents
Next: J.3 フィルタリングとカーネル Up: J. NAT(NAPT) Previous: J.1 NATとは

J.2 IPFilter の NAT

FreeBSD では利用可能なフィルタリングソフトが2種類あり、それぞれ IPFW と IPFilter と呼ばれています。そして、NAT(NAPT)はこの フィルタリングソフトによって違い、IPFW には natd が、IPFilter には NATが内蔵されています。 そのことによって、他のツールとは違い、最初からNATとの親和性は良いと言えます。 IPFilter のNATで用いるコマンドは、ipnat コマンドです。 以下の例では、NAT のルールを/etc/ipnat.rules から読み込み、 設定をします。

   # ipnat -CF  -f /etc/ipnat.rules

FreeBSD ではシステムが立ち上がる際に、/etc/rc.network から ipnatが設定されるようになっています。/etc/ipnat.rules が 標準の場所(/etc/defaults/rc.confの設定)ですが変更することも出来ます。

さて、上の記述のうち、-CF オプションの意味は、-C が現在のNATルール の削除を意味し、-F がNAT変換テーブルのクリアを意味します。最初に 動かす際には意味はありませが、念のために指定した方が良いでしょう。

ipnat.rules に書かれるNAT ルールの指定方法は、以下の通りです。

map rl0 192.168.1.0/24 -> 10.240.0.20/32 portmap tcp/udp 49152:65535
map rl0 192.168.1.0/24 -> 10.240.0.20/32

この場合、インターフェースrl0 上で 192.168.1.0/24 のプライベートアドレスを 持った外へのパケットは全て 10.240.0.20 のアドレスに書き換えられます。 逆に、入って来るパケットがこの変換テーブルに該当する場合には逆向きに 書き換えられます。 ここで、IPアドレスに対してはマスクは必ず必要ですので、忘れないで下さい。 この変換において、使われるポートは 49152〜65000までのポートが 使われます。一方、TCP/UDP以外のプロトコルに関しては2行目のルールで 処理されます。従って、1,2行目の両方が必要です。

利用されるポートについて自動的に処理したい場合には auto が使えます。 また、代替用のグローバルIPには複数のIPも使う事が出来ます。

map rl0 192.168.1.0/24 -> 10.240.0.16/28 portmap tcp/udp auto
map rl0 192.168.1.0/24 -> 10.240.0.16/28

この例では、代替用の IP には 10.240.0.16〜10.240.0.31 が利用されます (正確には 16と31 は使えず、14個のアドレスが使えます)。但し、この場合、 10.240.0 が通常の24bitマスクならばサブネットマスクについては嘘をつく ことになるので、少し注意が必要です。

こうしたNATやIPFilterによるフィルタリングで少し困るのは active FTP です (active に対しては passive もある)。active FTP では、実際のファイル転送 の際には、サーバからクライアントに向かって新たにコネクションが張られます。 これは通常のNATやフィルタリングの関知していないデータパケット内部の プロトコルによってなされるものです。従って、active FTP に対応するには、 一種のプロクシ−が必要となりますが、幸いIPFilterのNATにはこうしたものが 用意されています。

map rl0 192.168.1.0/24 -> 10.240.0.20/32 proxy port ftp ftp/tcp

但し、このルールについては他の全てのルールの前に置かなければなりません。 何故ならば、先に portmap が働いてしまうと proxy が動かない事になるから です。

これらを設定した後、NAT の変換の様子を見るには、ipnat -l コマンドを 使います。

なお、IPFilter における NAT の変換はフィルタリングルールの前に行われ ます。つまり、もし外側インターフェースで入ってくるパケットに対して NATを行えば、IPFilterでは変換された後のパケットが入ってくる事になります。 逆に、内部から外側に出て行く場合には、IPFilter ではまだ変換されていない パケットについて見る事になります。 従って、フィルタリングルールにおいてはNATを使っている場合、 該当するプライベートアドレスについても考慮しなければならない点に注意 して下さい。

以上をまとめると、通常のNATのルールは 以下のようになります。

map rl0 192.168.1.0/24 -> 10.240.0.20/32 proxy port ftp ftp/tcp
map rl0 192.168.1.0/24 -> 10.240.0.20/32 portmap tcp/udp auto
map rl0 192.168.1.0/24 -> 10.240.0.20/32

IPFilter の NAT 機能には、その他にも redirect や、redirect する際に ロードバランシングを行う機能などもあります。redirect 機能は簡単に 言えば、IP global_A, port X 宛に来たパケットを、内側の IP private_B, port Y に透過的に送る機能です。これによって、内部に 立てた private アドレスを持つ Web serverを外部に公開するような事が 出来ます。

rdr rl0 10.240.0.20/32 port 80 -> 192.168.1.2 port 80 tcp

この例では、10.240.0.20 の port 80 (つまりWeb)に来たパケットは 、全て192.168.1.2の port 80 に振り向けるようになっています。

更には、そうした Web serverを複数内部に立て、それらに 次々と巡回的にパケットを振り分ける(round robin)ことなども出来るように なっています。

rdr rl0 10.240.0.20/32 port 80 -> 192.168.1.2 port 80 tcp round-robin
rdr rl0 10.240.0.20/32 port 80 -> 192.168.1.3 port 80 tcp round-robin
rdr rl0 10.240.0.20/32 port 80 -> 192.168.1.4 port 80 tcp round-robin

この例では、10.240.0.20 の Web に来たパケットは最初は 192.168.1.2 に 送り、次に来たコネクションは 192.168.1.3 に、その次は 192.168.1.4 に と巡回的に送ります。



Noriyo Kanayama