NATを使ってみる

この記事はFreeBSD6.1で設定/動作確認しています。
実は我家はインターネット回線は100Mbps回線だけど、ローカルネットは未だに10Baseだったりします。(2006年11月末現在)
さすがに10baseでは遅すぎてインターネットの動画サイトで何か観るにも支障が出ます。ローカルネット用のハブがかなり昔に新品で購入した富士通のSH2300という10Baseの変なインテリジェントハブで、これをGbハブに置き換えて一気に1000baseのLANにするのが2007年の目標です。とはいえ、買いたいものが多すぎてなかなかこの辺りの物を買うところまで辿り着かないのです。

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

これまでのネットの構成はFreeBSDで作ったブロードバンドルーターが入り口にあってDMZがあり、NAT箱としてNTT-MEの家庭用ブロードバンドルーターBA6000があって、その下にローカルネットがぶら下がる形となっています。このBA6000というルーターはビックカメラで妙に安かったので血迷って買ってしまったのですが、値段相応の超ヘタレルーターでした。ほんの数回SYNFIN attackを喰らうとすぐにヘバってしまって、その後は激遅+非正常な通信状態となります。また、BitTorrentなんてやろうものなら(TCPセッション数の不足なのか)3分と持ちません。あまりにも調子が悪いので、もしかするとBA6000でもハズレ個体だったか壊れたのかもしれません。

新しいブロードバンドルーターを購入するという方法もありますが、安いのはどの製品も何かしら問題抱えていそうでちょっと買うのが怖い状態です。それなりにしっかりした製品を買えば良いのかもしれませんが、(PPPoE不使用で)NATしか使わないのに高い製品を購入するのは馬鹿らしいですからね。
ということで、暫くの間だけ現在動かしているFreeBSDルーターにNAT機能も引き受けて貰うことにしました。

暫定ネット構成図
暫定ネット構成図

この構成でとりあえずルーターはネットワークカード3枚挿しとなります。
nic3枚挿しのルーターも普通なら単にルーティング情報を書くだけなので非常に簡単なのですが、PPPoEとNATが入ると急に情報が少なくなって設定に自信を持てなくなります(この記事も内容が怪しくなります)。
とはいえ、NATの設定は非常に簡単なので頭が混乱して悩むのはフィルタリングの設定だけとなります。それから、この構成ではフィルタリング設定を多少変えたところでローカルネットもDMZも大して変わらない環境になってしまうのでセキュリティ的にはあまり(かなり)好ましくないでしょう。

では設定開始。
NAT用によく使用されるnatdでは細かい制御ができないので今回はNAT用にはnatdではなくipnatを採用することにしました。(ipnatならFreeBSDに標準で入っていますし。)
まず、カーネルの設定を変更する必要があれば変更して構築します。
私の場合は下の2行を追加しました。

/usr/src/sys/i386/conf/YOUR_KERNEL_CONF_FILE

options         IPFILTER                #ipfilter support
options         IPFILTER_LOG            #ipfilter logging

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用フィルタリングの設定

まだ書いていません。(と、いうか書く気無し?)

その他

例えばDMZ(gxx.xxx.xxx.0/28)にあるホストでsshdが動いているとして/etc/hosts.allowで
sshd : gxx.xxx.xxx.015 : allowと記述しているとアクセス不能となります。192.168.0.0/24のアドレスをallowに書いて下さい。

実際にNATが正しくアドレス変換をしていることを確認するには「確認君」などを使うと簡単です。


この記事は安全性が全く検証されていません。この記事を見て試そうという方はご注意願います。
コンテンツをコピーして公開している方たちへ
記事をパクるのをやめろとはいいませんが、せめて検証だけはして下さい。
間違った内容の記事を(確認しないで公開して放置している私が悪いのですが)そのままパクって公開されると私が恥ずかしいです。