次のページ 前のページ 目次へ

10. 同一ネットワーク上での宛先 NAT

同一ネットワーク内の通信でポートフォワーディングする場合、 出て行くパケットと戻ってくるパケットの両方がちゃんと NAT ボックスを通過する(よってそれらパケットは内容に変更が加えられる) ようにする必要があります。NAT のコードは現在(2.4.0-test6 以降)、 NAT されたパケットが入ってきたのと同じインタフェース に出て行く際に送信される ICMP リダイレクトをブロックしますが、 受信するサーバは、(リプライを認識できない)クライアントに直接 リプライしようとし続けます。

その典型的な例は、内部にある端末があなたのところのネットワークで 「外部に公開している」ウェブ・サーバーにアクセスしようとする場合で、 実際には以下のような設定により、パブリック・アドレス(1.2.3.4) から内部のマシン(192.168.1.1)に DNAT されてしまいます。

# iptables -t nat -A PREROUTING -d 1.2.3.4 \
        -p tcp --dport 80 -j DNAT --to 192.168.1.1

やり方の一つとして、公開用ウェブ・サイトの本当の(内部での) IP アドレスを知っている内部用 DNS サーバを動かし、 それ以外の名前解決要求は全て外部用 DNS サーバに転送 するようにする方法があります。 つまり、ウェブ・サーバのログを取ってみれば、内部にある端末の IP アドレスが正しく記録されているのが分かるでしょう (訳注:内部にある端末からウェブ・サーバへのパケットが、 IP アドレス変換されることなく、NAT ボックスを経由せずに、 直接サーバへ届くことをいっている)。

別のやり方としては、そうしたコネクションに関しては送信元 IP アドレスも NAT ボックス自身の IP アドレスにマップする ように設定して、サーバをだまして NAT ボックスにリプライ を返させるようにする方法があります。この例では、 以下のように設定することになります(NAT ボックスの内側の IP アドレスを、192.168.1.250 と仮定します):

# iptables -t nat -A POSTROUTING -d 192.168.1.1 -s 192.168.1.0/24 \
        -p tcp --dport 80 -j SNAT --to 192.168.1.250

PREROUTING ルールが最初に実行されるので、 上記ルールが実行される時には既に、パケットの宛先は内側にある ウェブ・サーバに向けられています。どのパケットが内側から送出 されているかは、送信元 IP アドレスにより識別可能です。


次のページ 前のページ 目次へ