NAT を行うには、どのコネクションに変換をかけ、どのように変換を行うかについて
カーネルに指示する NAT ルールをつくる必要があります。この行うため、とても
融通が利く iptables
ツールを利用し、`-t nat' オプションを指定
することで、NAT テーブルを変更するよう指示します。
NAT ルールのテーブルは、`chains' と呼ばれる三種類のリストからなります。 いずれのルールについても、どれかが適合するまで順に調べられます。二種類の chain には、PREROUTING(パケットを受信するたびに、宛先 NAT を行うのに利用)、 そして POSTROUTING(パケットを送信するたびに、送信元 NAT を行うのに利用) があります。三番目のリスト(OUTPUT)はここでは無視されます。
僕にいくらかでもアーティスティックな才能があったら、下図は三種類の chain を説明するものになるんですがね:
_____ _____
/ \ / \
PREROUTING -->[Routing ]----------------->POSTROUTING----->
\D-NAT/ [Decision] \S-NAT/
| ^
| |
| |
| |
| |
| |
| |
--------> Local Process ------
上図のどのポイントにおいても、パケットが通過すると、関連するコネクション を調べることになります。もしそれが新しいコネクションならば、 それにどういう処理を行うか知るために、NAT テーブルの中の関連するチェイン を調べることになります。そこから得られる答えが、当該コネクション上の以後 全てのパケットに適用されます。
iptables
は、以下に列挙するたくさんの標準的なオプションを利用
します。iptables が別の利用可能なオプションと区別可能であるうちは、
二重ダッシュ '--' で始まるオプションにはすべて略語指定が使えます。
もしあなたのマシンのカーネルがモジュールとして iptables
をサポートしているなら、まず `insmod ip_tables' で ip_tables.o
モジュールをロードする必要があります。
ここで最も重要なオプションは、テーブル選択オプションである `-t' です。 あらゆる NAT の動作に関して、NAT テーブルに `-t nat' を使うことになる でしょう。二番目に重要なオプションは、チェインの最後に新たなルールを追加する `-A' オプション(例:`-A POSTROUTING')か、チェインの最初にルールを挿入する `-I'オプション(例:`-I PREROUTING')です。
NAT を行いたいパケットの送信元(`-s' か `--source')や宛先(`-d' か `--destination')も指定可能です。これらのオプションには、単一の IP アドレス (例:192.168.1.1)、名前(例:www.gnumonks.org)、もしくはネットワーク アドレス(例:192.168.1.0/24 や 192.168.1.0/255.255.255.0)が後に続きます。
適合する受信インタフェース(`-i' か `--in-interface')か送信インタフェース
(`-o' か `--out-interface')を指定することも可能ですが、指定可能かどうかは、
ルールを加えようとするチェインに依存します ―PREROUTING では受信インタ
フェースのみ選択可能ですし、POSTROUTING では送信インタフェース
のみ選択可能です。もしこれを間違うと、iptables
はエラーを出します。
送信元アドレスや宛先アドレスを指定可能であると前に書きました。送信元アドレス オプションを省略した場合、あらゆる送信元アドレスについて適用されます。 宛先アドレスオプションを省略した場合、あらゆる宛先アドレスについて適用 されます。
TCP や UDP などの特定のプロトコルは、`-p' か `--protocol' で指定可能で、 そのプロトコルのパケットのみに対してルールが適用されます。 こうする主な理由は、TCP や UDP といったプロトコルを指定することで、 そのプロトコルに対しオプションを追加できることにあります −具体的には、 `--source-port' や `--destination-port' オプション(`--sport' や `--dport' と省略可能)です。
これらのオプションにより、特定の送信元、宛先ポート番号を持ったパケットのみ をルールに適合させることが可能になります。これはウェブリクエスト(TCP ポート 番号80番や8080番)をリダイレクトして、他のパケットを無視するのに使えます。
これらのオプションは、`-p' オプション(そのプロトコルに関する共有ライブラリ 拡張をロードする副作用がある)の後に続かなくてはなりません。ポート番号か、 /etc/services ファイルに記述された名前を使用可能です。
パケットに選択できるあらゆる性質が、マニュアル(man iptables
)
にいやになるほど詳細に記述されています。