web-dev-qa-db-ja.com

同じネットワーク内のあるIPから別のIPにポート転送を行う方法は?

NATiptablesを実行してください。そのため、192.168.12.87およびポート80に着信するすべてのパケットは、192.168.12.77ポート80に転送されます。

Iptablesでこれを行う方法?

または

同じことを達成する他の方法は?

81
sat

これらのルールは、iptablesがサーバー192.168.12.87で実行されていることを前提として機能するはずです。

#!/bin/sh

echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -F
iptables -t nat -F
iptables -X

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77:80
iptables -t nat -A POSTROUTING -p tcp -d 192.168.12.77 --dport 80 -j SNAT --to-source 192.168.12.87

ポート80で着信トラフィックをDNATする必要がありますが、トラフィックをSNATで戻す必要もあります。


別の方法(およびIMHOの最善の方法):

Webサーバーが何であるかに応じて(Apache、NGinx)、フロントエンドサーバー(192.168.12.87)でHTTPプロキシを検討する必要があります。

79
krisFR

一見明白なiptables -t nat -A PREROUTING -d 192.168.12.87 -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77が機能しない理由は、返信パケットのルーティング方法です。

192.168.12.87に送信されるパケットを単純に192.168.12.77にNAT変換するルールを設定できますが、192.168.12.77はクライアントに直接応答を送信します。これらの応答は、iptablesルールがNATを実行しているホストを経由しないため、一方向のパケットは変換されますが、反対方向のパケットは変換されません。

この問題を解決するには3つの方法があります。

  1. 最初のホストでは、DNATを実行するだけでなく、SNATを実行して、リターントラフィックが最初のホストを通じて送り返されるようにします。ルールはiptables -t NAT -A POSTROUTING -d 192.168.12.77 -p tcp --dport 80 -j SNAT --to-source 192.168.12.87のようになります。
  2. DSRロードバランシングからインスピレーションを得て、パケットをIPレイヤーではなくイーサネットレイヤーでDNATします。パケットの宛先MACを192.168.12.77のMACに置き換え、IP層に触れることなくイーサネットで送信することにより、192.168.12.77はダミーインターフェイスに192.168.12.87を構成し、TCPクライアントが認識しているサーバーIPとの接続。
  3. 最初のホストで単純な(ただし機能しない)ソリューションを使用します。次に、戻りトラフィックでSNATを実行して、2番目のホストで戻りパケットを処理します。ルールはiptables -t nat -A OUTPUT -p tcp --sport 80 -j SNAT --to-source 192.168.12.87のようになります

これら3つのソリューションにはそれぞれ欠点があるため、この特定の転送を本当に行う必要がある場合は、慎重に検討する必要があります。

  1. SNATを使用するとクライアントIPが失われるため、ホスト番号2はすべての接続が192.168.12.87からのものであると見なします。さらに、すべての応答パケットにホスト番号1の帯域幅を使用します。これにより、他のアプローチでより直接的なルートが使用されます。
  2. DSRアプローチは、2つのノード間の他のすべての通信を中断します。 DSRアプローチは、サーバーアドレスがどのホストのプライマリIPでもない場合にのみ適切です。各ホストには、DSR IPではないプライマリIPが必要です。
  3. あるホストで接続追跡を使用して一方向に変換し、別のホストで接続追跡を使用して別の方向に変換するのは見苦しく、壊れる可能性のあるさまざまな方法があります。たとえば、ポート番号がいずれかのホストでNATによって変更された場合、それらを再構築する方法はありません。また、最初のパケットがACKではなくSYN-ACKである場合に、接続追跡が正しく機能することも指定されていません。

3つのアプローチのうち、1つ目は最も効果的であると思います。したがって、クライアントのIPアドレスを知る必要がない場合は、それをお勧めします。

NATを完全に忘れて、MACまたはIPレイヤーの問題を解決しないようにすることもできます。 HTTPレイヤーまで行き、そこで解決策を探すことができます。この場合、解決策はHTTPプロキシです。 HTTPプロキシを192.168.12.87にインストールして適切に構成すると、リクエストを192.168.12.77に転送し、回答を転送して戻すことができます。さらに、元のクライアントIPを保持するX-Forwarded-Forヘッダーを挿入できます。次に、192.168.12.77のサーバーは、192.168.12.87からのX-Forwarded-Forヘッダーを信頼するように構成する必要があります。

29
kasperd