NATを使ってみる

この記事はFreeBSD6.1で設定/動作確認しています。

実は、私の家庭のインターネット回線は100Mbpsですがローカルネットは未だに10Baseです。(2006年11月末現在)
さすがに10baseでは遅すぎて、LAN内でのファイルの転送に支障が出ます。ローカルネットワークの中核のハブは、かなり昔に新品で購入した富士通のSH2300という10Baseのインテリジェントハブです。これをGbハブに置き換えて、LANを一気に1000Baseにするのが2007年の目標です。しかし、他に買いたいものが多く、なかなかこの辺りの機器を購入するところまで辿り着いていません。

これまでのネット構成図
これまでのネット構成図

これまでのネットワーク構成は、FreeBSDで作成したブロードバンドルーターが入り口にあり、DMZがあります。そして、並列でNAT箱としてNTT-MEの家庭用ブロードバンドルーターBA6000があり、その下にローカルネットが接続されています。このBA6000というルーターはビックカメラで妙に安かったので購入しましたが、値段相応の低性能ルーターでした。数回SYNFIN attackを受けるとすぐにダウンし、その後は非常に遅くなり正常な通信ができなくなります。また、BitTorrentを使用すると(TCPセッション数の不足のためか)3分ともたない状態です。このように調子が悪いので、BA6000が不良品だったか壊れたのかもしれません。

新しいブロードバンドルーターを購入する方法もありますが、安価な製品は何かしら問題がありそうで購入するのが不安です。それなりにしっかりした製品を買えば良いのかもしれませんが、NATしか使わないのに高価な製品を購入するのは馬鹿らしいと感じています。そこで、しばらくの間、現在稼働しているFreeBSDルーターにNAT機能も任せることにしました。

暫定ネット構成図
暫定ネット構成図
今回の構成では、ルーターにネットワークカードを3枚挿しました。
NIC3枚挿しのルーターの設定は通常なら簡単ですが、PPPoEとNATが入ると複雑になります。この記事の内容も怪しい部分があるかもしれません。とはいえ、NATの設定は非常に簡単で、悩むのはフィルタリングの設定だけです。

それでは、設定を開始します。

NAT用には、細かい制御ができないnatdではなく、ipnatを使用します(ipnatはFreeBSDに標準で含まれています)。

まず、カーネルの設定を変更する必要があれば行います。私の場合は、以下の2行を追加しました。

/usr/src/sys/i386/conf/YOUR_KERNEL_CONF_FILE
options         IPFILTER                #ipfilter support
options         IPFILTER_LOG            #ipfilter logging

次に、IPアドレスの設定を行います。

  • gxx.xxx.xxx.0/28: DMZ用のグローバルIPアドレス (IP16個)
  • gxx.xxx.xxx.001: tun0のIPアドレス
  • gxx.xxx.xxx.015: NAT変換用のグローバルIPアドレス
  • 192.168.0.0/24: ローカルネット用のプライベートIPアドレス (IP256個)

ローカルネットはgxx.xxx.xxx.015と対応させます。

/etc/rc.confに1行追加
ipnat_enable="YES"

私の環境では正しくipnatが機能しない場合があるので後から呼び出すことにしました。

/etc/ipnat.rulesの作成
map tun0 192.168.0.0/24 -> gxx.xxx.xxx.015/32 proxy port ftp ftp/tcp
map tun0 192.168.0.0/24 -> gxx.xxx.xxx.015/32 portmap tcp/udp auto
map tun0 192.168.0.0/24 -> gxx.xxx.xxx.015/32
rdr tun0 gxx.xxx.xxx.015/32 port 80 -> 192.168.0.21 port 80 tcp

1行目はFTP用のルールです。proxyルールはportmapの前に書きます。
2行目と3行目が最も重要な設定です。DMZがなくて無条件にアドレス変換すれば良い場合は、map tun0 192.168.0.0/24 -> 0/32という書き方ができますが、今回はそれができないため、このように指定しています。
4行目はリダイレクトの設定で、ローカルの192.168.0.21でウェブサーバを立て、NAT外部からこのウェブサーバにアクセスさせるような場合には必要な設定です。ウェブサーバでなくても、他のアプリケーションで「ポートを開ける」設定が必要な場合は、このような設定を追加します。

NAT用フィルタリングの設定ですが、長くなるのでこの記事では割愛します。

NATが正しくアドレス変換を行っているか確認するには、「確認君」などを使用すると簡単です。