14.3. rc.DMZ.firewall.txt

rc.DMZ.firewall.txt スクリプトは、構成ネットワークとして、ひとつの信頼できる内部ネットワーク と、ひとつの非武装地帯 (DMZ = De-Militalized Zone)、ひとつのインターネット接続 を持つ人たちのために書いたスクリプトだ。この例では、DMZ に対して 1 対 1 の NAT を行っているため、ファイヤーウォールに何らかのIPエイリアス (IP aliasing) 、つまり、複数の IPアドレスでパケットを聞けるよう処置を施しておく必要がある。これを実現する方法はいくつかあり、ひとつは 1 対 1 の NAT を設定するやり方、もうひとつは、もしサブネットをひとつ丸ごと自由にできるなら、サブネットワークを作り、ファイヤーウォールに内部/外部用となるひとつの IP を与えることだ。こうしておけば、あとは DMZ のマシンに好きなように IP を割り振ることができる。認識しておかなくてはならないのは、これによってふたつの IP が「盗み取られる」ということだ。ひとつはブロードキャスト用、もうひとつはネットワークアドレスだ。どちらを選択して実装するかはあなた自身にお任せするしかあるまい。このチュートリアルは、ファイヤーウォール部分と NAT 部分を完成させるための道具までは提供できる。しかし、やるべきことの具体的な説明については、当チュートリアルの守備範囲を超えてしまうので助けになれない。

rc.DMZ.firewall.txt が動作するには、以下のオプションが、スタティックに、あるいはモジュールとしてカーネルにコンパイルしてあることが必要だ。最小限でもこれらのオプションがカーネルで利用可能になっていなければ、このスクリプトを有効に機能させることはできない。言い換えると、モジュールやターゲット/ジャンプに関するエラーや、マッチが見つからないというエラーが、ごまんと吐き出されることとなる。トラフィック制御やそれに類する何かをしようと考えている場合は、これ以外の必要なオプションもすべてコンパイルしておく必要がある。

図を見て分かるように、内側にはふたつのネットワークが必要となる。一方は、 IP範囲 192.168.0.0/24 を使用し、信頼する内部ネットワーク (Trusted Internal Network) がそこに属する。もう一方は IP範囲 192.168.1.0/24 を使用する 非武装地帯 であり、この DMZ 内の各ホストに対しては 1 対 1 の NAT を施す。例を挙げよう。もしインターネットから誰かが $DNS_IP へパケットを送ってくると、我々はそのパケットに DNAT を掛け、 DMZ にある我々の DNS サーバへ送る。当の DNS サーバがこのパケットと出会う時には、パケットの宛先は外部向けの DNS の IP ではなく、実際の DNS の内部用ネットワーク IP になっている。仮に、パケットの変換が行われていなかったとしたら、 DNS サーバはそのパケットに返答しないだろう。 DNAT のコードがどんなものになるか、ちょっと例を挙げておこう:

$IPTABLES -t nat -A PREROUTING -p TCP -i $INET_IFACE -d $DNS_IP \
--dport 53 -j DNAT --to-destination $DMZ_DNS_IP
    

大前提としてまず、 DNATnat テーブルの PREROUTING チェーンでしか行えない。そして、TCP プロトコルのうち、 $INET_IFACE から進入するパケットで、宛先IP が我々の $DNS_IP で、宛先ポートが 53 つまりネームサーバとの間でゾーン転送に使用される TCP ポートになっているパケットを網に掛けている。もしそのようなパケットを見つけたら、DNAT ターゲットを与える。その後ろで、 --to-destination オプションを使用して、パケットに行ってもらいたい場所として $DMZ_DNS_IP つまり DMZ にある DNS サーバの IP を与えている。これが基本的な DNAT の働きだ。 DNAT されたパケットに対する返答がファイヤーウォールへ送信された時には、自動的に 逆DNAT される。

これで、頭を抱えずにこのスクリプトを読み解ける程度には、動作の仕組みが理解してもらえたはずだ。もし不明な点があり、それが最後までどこでも触れられていなかったとしたら、それは僕の落ち度だからメールをいただきたい。