ここでは、 NAT の概念を示すため、ネットワークふたつとインターネットコネクションとの真ん中に NAT サーバを配置するという比較的単純な例を紹介する。目標とするのは、ふたつのネットワークをつなぎ、両ネットワークが互いにアクセスでき、且つ、インターネットへもアクセスできるようにすることだ。また、ハードウェアに関して考慮すべき点や、実際に NAT マシンの構築を始める前に考慮しておかなければならないその他のセオリーについても述べる。
本題に入る前にまず、 NAT 用 Linux マシンを仕立てるのにどういった類のハードウェアが必要かを知っておかなくてはならない。小規模なネットワークのほとんどでは取り立てて問題にはならないだろうが、大規模なものを扱うようになるとこれが問題になってくる。最大の問題は、 NAT がかなり急速にリソースを食いつぶすという点だ。 1 から 10 台くらいのユーザしかいない小規模なプライベートネットワークなら、 RAM 32 MB の 486 マシンで充分以上に動く。しかし、もし 100 ユーザ以上を扱うつもりならば、手元にあるハードウェアで大丈夫か、よく考えてみる必要が出てくる。当然、帯域幅や、どれくらいの数のコネクションが同時に発生するかについても考察しておくのが正しい。とはいえ、大概は余り物のコンピュータでもしっかりと仕事をしてくれるし、それが Linux ベースのファイヤーウォールの大きな利点でもある。余っていた古いドンガラが使え、おかげで、他のファイヤーウォール製品に比べてずっと安価にファイヤーウォールが仕立てられるのだ。
ネットワークカードについてもよく検討する必要がある。幾つのネットワークが NAT/フィルタマシンに接続してくるのだろうか。たいていの場合、インターネットコネクションへコネクトさせるのはネットワークひとつだけで充分だ。イーサネットを使ってインターネットへ接続するなら、必要なのは通常 2 枚のイーサネットカードとその他諸々だ。スケーラビリティを考慮すると比較的有名なブランドの 10/100 mbit/s ネットワークカードを選ぶに越したことはないが、 Linux のカーネルがドライバを持っていれば大体どんなカードでも動くことは動く。この点で少々言っておかなければならないことがある: 頒布されている Linux カーネルがドライバを備えていないようなネットワークカードを使ったり、使おうとして手に入れるのは、避けるべきだ。僕には、ドライバが別途ディスクで添付されている型式やブランドのネットワークカードに行き当たって、惨めな結果に終わった経験が何度かある。そうしたドライバは更新がきちんと行われていないことが多く、仮に今標的にしているカーネルで動作に漕ぎ着けたとしても、将来、カーネルのメジャーアップグレードをした際にきちんと動いてくれる可能性は極めて小さい。そうした事柄を考え合わせると、結局、ちょっとばかり高めのネットワークカードを使えというところに落ち着く。長い目で見れば決して損にはならないはずだ。
参考までに付け加えておく。ファイヤーウォールをかなり旧式のハードウェアで作ろうと思っているとしたら、できる限り PCI バスかそれ以上のインターフェイスの使用を検討したほうがいい。第一に、そのカードは将来マシンをアップグレードする時にもおそらく流用できるだろう。それにもうひとつ、 ISA バスは非常に低速で、 CPU の使用率も高いという点だ。 ISA ネットワークカードによる CPU パワーの大量消費は、マシンをダウンさせる危険と隣り合わせなのだ。
最後の一点として、どれくらいのメモリを NAT/ファイヤーウォールマシンに搭載するかを検討しないわけにはいかない。 32 MB でも動かないこともないが、可能であれば、最低でも 64 MB 以上のメモリを積んだほうがいい。 NAT はメモリに関しては極端に大食いというわけではないが、想定した以上のトラフィックが発生した場合に備えて、できるだけたくさん積んでおくのが正しい選択だ。
ご覧のように、ハードウェア面で検討しておく事項はかなりたくさんある。しかし、本当に正直なところを言ってしまえば、大規模ネットワーク用の NAT マシンを作る場合を除けば、これらはほたいてい全く考える必要がない。ほとんどのホームユーザは考える必要はなく、手近にあるハードウェアの中からどれを使おうと構わない。この問題に関する総合的な比較やテストというものは行われたことがない。ただ、常識的な思慮をちょっと働かせれば、事はずっとうまく運ぶはずだ。
この問題は非常に単純に思われるかもしれない。しかし、大きなネットワークでは、思ってもみなかったほどの難問になることがある。一般論としては、 NAT マシンはちょうどフィルタリングマシンと同じようにネットワークの境界点に設置する。当然の帰結として、 NAT とフィルタリングは同一のマシンである場合が多いわけだ。また、非常に大規模なネットワークを扱うのであれば、ネットワーク全体を幾つかのセグメントに分割し、セグメント毎に個別の NAT/フィルタリングマシンを割り当てるという方策にも一考の余地がある。 NAT は多くの CPU パワーを要求するので、このやり方はラウンドトリップ時間 (RTT、ひとつのパケットが宛先へ到達して返答が返ってくるまでの時間) の増加を抑えるのにも効果的だ。
既に示した、ふたつのネットワークとインターネット接続を持つ例のネットワーク構成では、それらふたつのネットワークの規模を勘案する必要がある。比較的小さいと考えれば、クライアントがどんなことを要求するかにもよるが、まともな NAT マシンにとって 200 や 300 のクライアントは問題とならない。とはいえ、パブリック IP を各々与えた NAT マシンを数台置いて負荷を分け合い、各 NAT マシンは担当のセグメントの面倒だけを見るようにして、トラフィックを最終的に 1 台のルーティング専用マシンへ委譲させるように仕立てる手もある。ただし、これをやるには、充分な数のパブリック IP と、パケットをルーティングできるルーティングマシンのことも考えなくてはならない。
不幸なことに、 NAT にとって、プロキシ、特に透過プロキシとの問題は付きものだ。普通のプロキシならばそれほど問題となることはないが、大規模なネットワークでは特に、透過プロキシは強敵となる。第一点として、プロキシは NAT と並んで大量の PCU パワーを必要とする。大規模なネットワークの場合、 NAT とプロキシを 1 台のマシンで賄うのは無理だ。第二に、送信元と宛先の両方を NAT した場合、プロキシには、いったいどのホストへ接続したがっていたのかが分からない。例えば、そのクライアントがどのサーバへコネクトしたがっていたのかが、判定できないのだ。パケットの本来持っていた宛先情報は NAT 変換を施した際に消え、パケットは元の情報を同時には保持できないため、こうした問題が生じる。ただ、ローカル内でだけなら、パケットの備えるしかるべき 内部データ構造にそうした情報を書き加えることによって、プロキシ (例えば Squid) に情報を伝えることは可能だ。
ご覧のように、透過プロキシの問題に突き当たったら対処策の選択肢はほとんど限られてしまっている。もちろん他にも考えられなくはないが、あまりお勧めできる方法ではない。そのひとつとしては、ファイヤーウォールの外側にプロキシを立て、全ての WEB トラフィックをそこへ導くようなルーティングテーブルを作成して、プロキシマシンそれ自体の中で、 WEB パケットをプロキシで決めてある所定のポートへ NAT するというやり方だ。こうすれば、必要な情報はパケットがプロキシマシンに到着するまで保持され、プロキシマシンもその情報を利用できる。
もうひとつの方策は、ファイヤーウォールの外側にプロキシを立て、 WEB トラフィックはプロキシマシン宛てのもの以外全部遮断するという方法だ。こうすると、全ユーザにプロキシの使用を強制することができる。強引なやり方ではあるが、うまくいかなくも ないだろう。
最後のステップとして、これまで述べてきた情報全てを統合し、どう NAT マシンを仕上げるかについて見ていく。まずネットワーク同士の関係を思い描いてみることにしよう。我々は前述の中で、プロキシを NAT/フィルタリングマシンのすぐ外、且つ、ルータよりも内側に設置することに決めた。この領域は DMZ だと考えることができ、 NAT/フィルタリングマシンはこの DMZ とふたつの内部ネットワークとの間に位置する。下の図で、今話している構想のレイアウトが見て取れるだろう。
NAT 処理されるネットワーク [訳者註: つまりふたつの LAN] から来た通常のトラフィックは全て、 DMZ をくぐってルータへと送られ、ルータがインターネットへと送り出す。ただし、お察しの通り、 WEB トラフィックだけは、 NAT マシン上の netfilter がマークを付け、そのマークに基づいてプロキシマシンへとルーティングする。僕が何を言っているのか整理しよう。今、 NAT マシンが http パケットを見つけたとする。 mangle テーブルを使ってパケットに netfilter の mark (nfmark とも呼ばれる) が付けられる。この nfmark はあとでパケットをルータへとルーティングする時になってもルーティングテーブルと照合できるので、この http パケットを選り分けてプロキシサーバへとルーティングすることができる。それが終わると、プロキシサーバはパケットに対して本来の自分の仕事を果たす。ルーティング関連の部分は、幾分、高度ルーティングの領域に属する事柄だが、この話題には当文書の後半でも幾らか詳細に触れることにしている。
NAT マシンにはインターネット上で通用する本物の IPアドレスを与えている。ルータと、インターネットから見えなくてはならない数台のマシンもそうだ。かたや、 NAT されるネットワークの中のマシンは全てプライベートアドレスだ。これによって、予算もインターネットアドレス空間も節約できる。