解決策 1:
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 プロキシを検討する必要があります:
-
mod_proxy (Apache)
-
proxy_pass (NGinx)
解決策 2:
一見明白な 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 つのアプローチがあります。
<オール>iptables -t NAT -A POSTROUTING -d 192.168.12.77 -p tcp --dport 80 -j SNAT --to-source 192.168.12.87
のようになります iptables -t nat -A OUTPUT -p tcp --sport 80 -j SNAT --to-source 192.168.12.87
のようになります これら 3 つのソリューションにはそれぞれ欠点があるため、この特定の転送を本当に行う必要があるかどうかを慎重に検討する必要があります。
<オール>3 つのアプローチのうち、最初のアプローチが最も効果的であると思います。したがって、クライアントの 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 ヘッダーを信頼するように構成する必要があります。