NAT(IPFILTER の ipnat による設定)

 

概要

NAT(ネットワークアドレス変換)は,内部ネットワークのプライベートアドレスを, 外部インタフェースのグローバルアドレスに変換する機能である. FreeBSD の基本システムには ipfwpfIPFILTER の 3 種類のパケットフィルタが含まれており, それぞれが NAT 機能を持つ. このページでは IPFILTER のパケットフィルタ ipf と,NAT 機能 ipnat を使用する手順を示す.

以下の例では,外部インタフェースを em0,内部ネットワークを 192.168.33.0/24, 外部インタフェースのアドレスを 203.0.113.10 とする. インタフェース名は ifconfig の実行結果で確認し,使用中の環境の値に置き換えること.

設定手順

/etc/rc.conf の編集

/etc/rc.conf に次の行を追加する

gateway_enable="YES"
ipfilter_enable="YES"
ipfilter_rules="/etc/ipf.rules"
ipnat_enable="YES"
ipnat_rules="/etc/ipnat.conf"

gateway_enable="YES" により net.inet.ip.forwarding が 1 に設定され, インタフェース間の IPv4 パケット転送が有効になる. ipfilter_rulesipnat_rules は, それぞれフィルタ規則ファイルと NAT 規則ファイルのパスを指定する(既定値は /etc/ipf.rules/etc/ipnat.rules).

エディタを使わずに設定する場合は,次のコマンドを実行する.

# sysrc gateway_enable=YES ipfilter_enable=YES ipnat_enable=YES
# sysrc ipfilter_rules=/etc/ipf.rules ipnat_rules=/etc/ipnat.conf

/etc/ipf.rules の作成

/etc/ipf.rules を次の内容で新規に作成する

pass in all
pass out all

この 2 行は,すべてのパケットを通過させる設定である. NAT の動作確認用の最小構成であり,フィルタリングは行わない. 実運用では,必要な通信のみを許可する規則に置き換えること.

/etc/ipnat.conf の作成

/etc/ipnat.conf を次の内容で新規に作成する

map em0 192.168.33.0/24 -> 203.0.113.10/32 portmap tcp/udp 20000:30000
map em0 192.168.33.0/24 -> 203.0.113.10/32

外部インタフェースのアドレスが DHCP などで変化する場合は, 変換先アドレスに 0/32 を指定する. 0/32 は,そのインタフェースに設定されているアドレスを実行時に参照する記法である.

map em0 192.168.33.0/24 -> 0/32 portmap tcp/udp 20000:30000
map em0 192.168.33.0/24 -> 0/32

説明

   1 行目: TCP と UDP のパケットについて,内部ネットワークのアドレスを外部インタフェースのアドレスに
            変換し,変換後の送信元ポートを 20000 から 30000 の範囲から割り当てる。
            変換後の送信元ポートが特権ポート(1024 未満)になることはない。
   2 行目: TCP と UDP 以外のパケット(ICMP など)についてアドレス変換を行う。
            1 行目に一致しないパケットがこの規則で処理される。

規則の反映

次のコマンドを実行する.

# service ipfilter start
# service ipnat start

NAT 規則のみを読み込み直す場合は,次のコマンドを実行する.

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

-C は既存の NAT 規則の削除,-F は現在の変換テーブルの消去,-f は規則ファイルの指定である.

"Device not configured" というエラーが表示される場合は, IPFILTER のカーネルモジュール(ipl)が読み込まれていない. 次のコマンドを実行してモジュールを読み込む.

# kldload ipl

起動時に読み込ませる場合は,/boot/loader.conf に次の行を追加する.

ipfilter_load="YES"

クライアントの設定

クライアントのデフォルトゲートウェイを,NAT を行うマシンの内部側インタフェースのアドレス(この例では 192.168.33.1)に設定する. FreeBSD のクライアントでは,/etc/rc.conf に次の行を追加する.

defaultrouter="192.168.33.1"

確認

次のコマンドを実行する.

# ipnat -l

現在有効な NAT 規則と,変換中のセッションの一覧が表示される.

次のコマンドを実行する.

# ipnat -s

NAT の統計情報が表示される.

次のコマンドを実行する.

# ipfstat -io

現在有効な入力方向と出力方向のフィルタ規則が表示される.