11.23. SNATターゲット

SNAT ターゲットは送信元ネットワークアドレス変換 (Source Network Address Translation ) を行うのに用いる。つまりこのターゲットは、パケットの IP ヘッダに書かれている送信元の IPアドレスを書き換える。こうしたことが必要となるのは、例えば、ひとつのインターネット接続を複数のホストで共用しなければならない場合だ。その際には、カーネルのフォワード機能をオンにして、ローカルネットワークから出ていくパケットの送信元 IP を、インターネットコネクションそのものの IP へと書き換えるような SNAT ルールを書けばいいわけだ。我々のローカルネットワークは通常、 IANA の定めるところの LAN 内でのみ許される IPアドレスを使用しているため、このようにしないと、外の世界では、返答のパケットをどこへ送ればいいのか知る由もない。もしも、これらのパケットをそのままフォワードなどしたら、その出所が我々であるということは、インターネット上の誰一人として分からないのだ。 SNAT ターゲットは、こちらの LAN を離れるパケットを唯一のホストつまりファイヤーウォールから来たように見せかけることによって、この種の動作に必要な変換をすべて世話してくれる。

SNAT ターゲットは nat テーブルの POSTROUTING チェーンでしか有効でない。言い換えれば、このチェーンが、SNAT を使用できる唯一のチェーンとなる。 SNAT による改変を受けるのはコネクションの先頭パケットだけで 、同じコネクションに乗ることとなる後続パケットには、すべて [: 自動的に] SNAT が掛かる。ひいては、最初に適用された POSTROUTING チェーンのそのルールが、同じストリーム上を流れるすべてのパケットに適用されることとなる。

Table 11-17. SNATターゲットオプション

オプション--to-source
iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to-source 194.236.50.155-194.236.50.160:1024-32000
説明--to-source オプションは、パケットにどんな送信元を使わせるかの指定に用いる。一番単純な使い方としては、このオプションは IP ヘッダ内の送信元 IPアドレスにしたい単一の IPアドレスを引数に採る。いくつかの IPアドレスに分散させたい場合には、ハイフン区切りで IPアドレスを範囲指定することもできる。その時の --to-source の IP 指定は、例えば上記の例: 194.236.50.155-194.236.50.160 のようなものになる。こうすると、新しいストリームが開く度に、送信元 IP が範囲の中からランダムに割り振られる。ただし、同一ストリームの中では、どのパケットも常に同じ IPアドレスを使用する。また、 SNAT に使用させるポートの範囲も指定可能だ。そのようにすると、送信元ポートを、指定した範囲内に絞ることができる。この場合のルールのポートビット部は、上記の例の :1024-32000 のようなものとなる。これは、当該のルールのマッチセクションのどこかで -p tcp-p udp が指定されている時にだけ使用が可能だ。 iptables は常に、ポートの入れ替えは可能な限り避けようとするが、ふたつのホストが重複するポートを使いそうになった場合には、どちらか一方のポートを変更する。ポート範囲が指定されていない場合に、変換の必要なケースが発生すると、送信元ポートが 512番より下だった場合には 512番より下の別のポートにマッピングされ、512番から 1023番までの場合には 1024 より下のいずれかにマッピングされる。それ以外のポートの場合には 1024番以上のポートへマッピングが行われる。前述したように、 iptables は常に、コネクションを開いたワークステーションの元々使っていた送信元ポートを維持しようと努める。これらの動作は、宛先ポートには一切影響を与えないという点に気を付けよう。クライアントがファイヤーウォール外の HTTP サーバにコンタクトを試みた際に、それが FTPコントロール ポートにマップされるというわけではない。

Note

Linux カーネル 2.3, 2.4, 2.5, 2.6 で機能する。