NATリフレクション(NATループバック))の例として、OpenWRTから自動生成されたルールを使用します。
それでは、192.168.1.100と192.168.1.200の2つのホスト(+ルーター)を持つネットワーク192.168.1.0/24があるとします。ルーターには2つのインターフェースLAN(br-lan)とWAN(eth0)があります。LANインターフェースにはIP 192.168.1.1があり、WANインターフェースにはIP 82.120.11.22(パブリック)192.168.1.200にwwwサーバーがあります。パブリックIPアドレスを使用して、192.168.1.100からWebサーバーに接続します。
WAN-> LANをリダイレクトして、インターネットからのユーザーがWebサーバーにアクセスできるようにする場合は、次のルールをiptablesに追加します。
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A PREROUTING -i eth0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.200:80
ルールの意味を知っています。しかし、他にも2つのルールがあり、これらはNATリフレクションを担当します。そのうちの1つは、上のルールほど明確ではありません。最初のルールは次のようになります。
iptables -t nat -A PREROUTING -i br-lan -s 192.168.1.0/24 -d 82.120.11.22/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.200
これは、パブリックIPを宛先とする192.168.1.0/24ネットワークからポート80へのすべてのトラフィックをローカルWebサーバーに送信する必要があることを意味します。つまり、FirefoxでパブリックIPを入力すると、サーバーから返されたページですよね? filter
テーブル内の他の転送マジックはすべて実行済みですが、パブリックIPを使用してWebサーバーに接続できません。パケットはルールにヒットしましたが、何も起こりません。
メカニズム全体を機能させるには、別のnat
ルールが必要です。
iptables -t nat -A POSTROUTING -o br-lan -s 192.168.1.0/24 -d 192.168.1.200/32 -p tcp -m tcp --dport 80 -j SNAT --to-source 192.168.1.1
なぜルールが必要なのかわかりません。誰もがルールが正確に何をしているのか説明できますか?
NATが正しく機能するには、クライアントからサーバーへのパケットとサーバーからクライアントへのパケットの両方がNATを通過する必要があります。
IptablesのNATテーブルは、接続の最初のパケットにのみ使用されることに注意してください。接続に関連するその後のパケットは、最初のパケットが変換されたときに確立された内部マッピングテーブルを使用して処理されます。
iptables -t nat -A PREROUTING -i br-lan -s 192.168.1.0/24 -d 82.120.11.22/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.200
このルールを適切に設定すると、次のことが起こります。
iptables -t nat -A POSTROUTING -o br-lan -s 192.168.1.0/24 -d 192.168.1.200/32 -p tcp -m tcp --dport 80 -j SNAT --to-source 192.168.1.1
このルールを追加すると、イベントのシーケンスが変わります。
リバーストラフィックもopenwrtを流れるように強制しているようです。ウェブサーバーに表示される送信元アドレスを書き換えます。
Webサーバーがクライアントに直接応答した場合、thoseパケットのソースアドレスはWebサーバーのアドレスのままです。しかし、クライアントはopenwrt IPと通信しようとしています。したがって、応答パケットは破棄されます。
最初のケースでは、この強制は必要ありません。インターネットを介したWebサーバーからクライアントへのルートは、openwrtボックスをすでに経由しているためです。