web-dev-qa-db-ja.com

LinuxIPTables宛先NAT非対称ルーティングを使用しますか?

トラフィックが到着したものとは異なるインターフェイスを離れるときにDNATを処理する適切な方法は何ですか?これが発生した場合、応答には、到着したのと同じインターフェイスから送信される場合のように、送信元アドレスが自動的に置き換えられていないようです。

編集-SNATが機能していません:

Chain PREROUTING (policy ACCEPT 386 packets, 23372 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DNAT       all  --  *      *       0.0.0.0/0            12.12.12.5         to:10.7.0.5 

Chain POSTROUTING (policy ACCEPT 288 packets, 18672 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 SNAT       all  --  *      eth0    10.7.0.5             0.0.0.0/0           to:12.12.12.5 
    0     0 SNAT       all  --  *      eth3    10.7.0.5             0.0.0.0/0           to:12.12.12.5 
    8   550 MASQUERADE  all  --  *      eth0    172.16.14.0/30       0.0.0.0/0           
    0     0 MASQUERADE  all  --  *      eth0    10.7.0.0/24          0.0.0.0/0           

Chain OUTPUT (policy ACCEPT 23 packets, 1572 bytes)
 pkts bytes target     prot opt in     out     source               destination

したがって、上記では、両方のルーターが同じテーブルと同じインターフェイスレイアウトを持っています。両方のルーターのeth0はインターネット接続であり、各ルーターのeth1は同じLAN(10.7.0/24)に接続します。 eth3は、2つのルーターを相互に接続します。

何が起こっているのかは、インターネット上の場所から12.12.12.5アドレスにpingを実行しています。応答は、eth0を介してルーターBに送信され、宛先NATが正常に機能している状態でeth1から送信されます。応答はルーターAでeth1に入り、ルーターAでeth0を介してインターネットを出ます。ただし、送信元アドレスは上書きされず、応答は10.7.0.5アドレス*でpingを送信するデバイスに戻ります。

*はい、実際にはプライベートソースIPを使用して20ホップを超えて到達し、どこにも押しつぶされることはありません-ちょっと驚くべきことです)。

さらに編集:
わかりました。どうやらSNAT(少なくともiptablesのマニュアルからはそうです)は、ステートフルである場合にのみ一致します。だから私はステートレスなnatが必要です。これはiproute2で実行できますが、 http://linux-ip.net/html/nat-dnat.html#ex-nat-dnat-full によると、-を使用してシミュレートすることもできます。 -iptablesのSNATを使用した宛先。しかし、私のubuntu10.04は不明なオプション--to-destination.。

3
Kyle Brandt

私の知る限り、あなたが説明しているアドレス書き換え動作は、発信応答パケットが着信要求をルーティング/ DNATしたのと同じルーターによってルーティングされている限り、発生します。ただし、高可用性ルータープール内の他のN + 1ルーターがアウトバウンド応答パケットを処理している場合、それらはNetfilter状態データベースでその接続を「認識」しません。

NATステートマシン情報 を共有する高可用性Netfilterルーター)が必要なようです。そのペーパーで言及されているct_syncツールはほとんど放棄されていますが、 conntrackd conntrack-toolsのツールは、ct_syncと同じことのいくつかを実行するために開発されました。

ステートフルパケットフィルタリング(または実際にはステートフルパケットフィルタリングのスーパーセットであるNAT)を実行することを計画している場合は、ステートデータベースを配布する方法が必要になります(または、ステートレスフィルタリングを使用することもできます。ネットワークを構築し、各ホストでステートフルフィルタリングを実行します)。

1
Evan Anderson

Webトラフィックでは、これがより一般的になっています。あなたが懸念している特定のシナリオはありますか? SNATにすべてのDNATが反映されているわけではありません。

私が気にするシナリオ..

  • 私はオフィス/開発トラフィックでSNATを分離します。
  • DNATとSNATがMXとすべての発信MTAで一致していることを確認します。

私が理解していることから、経験則は、合理的に可能な場合はそれを避けることです。しかし、最新の実装と動的ルーティングにより、この視点はますます時代遅れになっていると思います。

1
Warner