次のように、複数のIPが接続された1つの「サーバーA」があります。
eth0:0 1.1.1.1
eth0:1 1.1.1.2
eth0:2 1.1.1.3
次のように、複数のIPも接続されている別の「サーバーB」があります。
eth0:0 2.2.2.1
eth0:1 2.2.2.2
eth0:2 2.2.2.3
ここで、「サーバーA」のiptablesを設定して、「eth0:2」のすべての受信トラフィックを「サーバーB」のIP 2.2.2.3に転送/ NATしたいと思います。
「サーバーA」がIP 2.2.2.3で「サーバーB」と「通信」できることを確認しました。ポートを開くためのpingとtelnetは問題なく機能し、転送フラグをオンにしています(net.ipv4.ip_forward = 1)
DNAT、SNAT、MASQUERADEなど、さまざまな方法を試しましたが、何も動作しません。
同じサーバー上のIP間でトラフィックを転送しようとすると、この行は正常に機能します。
iptables -t nat -A PREROUTING -d 1.1.1.3 -j DNAT --to-destination 1.1.1.2
しかし、「1.1.1.2」を「2.2.2.3」に切り替えても機能しません。
それを解決するには、2番目のiptableルールが必要だと思います。私は次のPOSTROUTINGルールを試してみましたが、運が悪くはありませんでした(同時に)。
iptables -t nat -A POSTROUTING -d 2.2.2.3 -j MASQUERADE
iptables -t nat -A POSTROUTING -d 2.2.2.3 -j SNAT --to 1.1.1.3
iptables -t nat -A POSTROUTING -j MASQUERADE
何が欠けていますか?
編集1:
私は最終的に次のようにしてそれを動作させるようにしました:
net.bridge.bridge-nf-call-iptables=0
iptables -t nat -A PREROUTING -d 1.1.1.3 -j DNAT --to-destination 2.2.2.3
iptables -t nat -A POSTROUTING -d 2.2.2.3 -j SNAT --to 1.1.1.3
ただし、別の問題が発生しました。サーバー2.2.2.3のすべてのログなどは、Apacheログ、メールログなど、すべてのトラフィックが1.1.1.3からのものであることを示しています。これがNATの性質だと思います。
ただし、Apacheを実行しているラップトップへのホームルーターで標準のポート転送を実行すると、ログに元の "リクエスターIP"が表示されます。では、ルーターはこれをどのように行うのでしょうか?そして、どうすればサーバーのセットアップで同じことができますか?
結論として、サーバーA(1.1.1.3)からサーバーB(2.2.2.3)にすべてのトラフィックを転送したいのですが、サーバーB(2.2.2.3)からトラフィックがどこから来たかを確認できるようにしたいです。 Apacheログには、リクエスターの元のIPが表示されます。
これを実現するには、NAT以外の方法を使用する必要があると思います。これは可能です。私の簡単なホームルーターでもこれを実行できるためです。
もう1つ、サーバーAとサーバーBに接続されているIPは、それぞれのサーバーにロックされています。したがって、サーバーAはIP 2.2.2.3からトラフィックを送信できません。それはルーターの私のプロバイダーによってロックされています。
あなたの改訂された質問への短い答えは、それを行うには2つの方法があるということです。どちらの場合も、2番目のNAT=ステップを削除する必要があります(これにより、探している情報が破壊されます)。それを行った後のオプションは次のとおりです。
1)サーバーAを問題のトラフィックのサーバーBのネクストホップにします。これが、前述のようにルーターで機能する理由です。これは、サーバーAをサーバーBのデフォルトルートにする、または policy routing を使用する、または some fancy iptables を使用する、またはトンネルを使用することで、煩雑な順に実行できます。ある種の。
2)サーバーAの「手動で」リバースNAT、その結果、非対称のトラフィックフローが発生する(一般的には推奨されません)。iptables -t nat -I POSTROUTING -j SNAT -s 2.2.2.3 --to 1.1.1.3
のようなもの
オプション(1)には100%自信があります。 (2)には約90%の自信があります。
これを理解するには、トラフィックフローを理解する必要があります。
次に、2番目のNATがない場合はどうなるかを考えてみましょう。
クライアントXがパケットを理解するには、元のパケットの宛先と同じ送信元アドレスでクライアントXに到達する必要があります。
これが発生する通常の方法は、サーバーBが事前ルーティングNATを逆にする機会を持つことです。そのためには、後でパケットを通過させる必要があります。現在、パケットの送信元アドレスを変更することでそれを行っていますが、変更した質問で求めている情報が破壊されます。
したがって、回答の最初のステップは、2番目のNAT=ステップ(ルーティング後のSNAT))を実行できないことです:サーバーAでiptables -t nat -D POSTROUTING -j SNAT --to 1.1.1.3
を実行します。
これで、最初のNATステップを逆にするという課題が残りました。
サーバーBがこれを行う場合、パケットを受信するにはサーバーBが必要です。
ip route replace default via C
、OR ip route add default via C table a; ip rule add from 2.2.2.3 table a
。ただし、サーバーBの場所にあるルーターが特に洗練されていない場合(パケットをステートフルに検査し、既知のトラフィックフローに対して順序が正しくないものを拒否する)、非常に醜いオプションですが、次のように簡単です。 NATサーバーAで何が行われたかについての知識に基づいてサーバーBで:サーバーBでiptables -t nat -I POSTROUTING -j SNAT -s 2.2.2.3 --to 1.1.1.3
は提案された例を実行する必要があります。これにより、Linux接続追跡システムはAとBやや困惑(サーバーはリターントラフィックを着信トラフィックに関連付けることができないため、接続追跡は接続をUNREPLIED状態のままにします)が、ほとんどのトラフィックで数百メガビットまで正常に機能するはずです。
この場合、最後にもう一度トラフィックフローを調べます。
サーバーをルーターとして動作させたいので、いくつかのことを確認する必要があります。
まず、カーネルでパケット転送を有効にする必要があります(デフォルトでは無効になっています)。
echo "1" > /proc/sys/net/ipv4/ip_forward
また、iptablesが転送トラフィックを許可していることを確認する必要もあります(FORWARDチェーンを確認してください)。
これとDNATルールは、パケットを一方向に流すのに十分です。ただし、TCP=フローが必要な場合は、言及したSNATルールも持っていることを確認する必要があります(そうでない場合、リモートホストは2.2のサーバーから問題があると見なします。 .2.3は、1.1.1.3として送信したパケットに返信しています。
ところで、パフォーマンス上の理由から、静的IPがある場合は、MASQUERADEの代わりにSNATを使用することをお勧めします。