NAT
でiptables
を実行してください。そのため、192.168.12.87
およびポート80
に着信するすべてのパケットは、192.168.12.77
ポート80
に転送されます。
Iptablesでこれを行う方法?
または
同じことを達成する他の方法は?
これらのルールは、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)
一見明白な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つのアプローチのうち、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ヘッダーを信頼するように構成する必要があります。