IPTables -- 接続されたクライアントに転送するが、送信元 IP は保持する

IPTables -- 接続されたクライアントに転送するが、送信元 IP は保持する

これが私のシナリオです:

2 つの IP アドレスを持ち、OpenVPN を実行している VPS があります (OpenVPN サーバーの IP アドレス: 10.1.2.1)。1 つのアドレスで受信したすべてのトラフィックを VPN クライアント (10.1.2.2) に転送したいと考えています。

私が現在使用している 2 つのルールは次のとおりです。

iptables -t nat -A PREROUTING -i venet0 -p ALL -d <EXTERNAL IP #1> -j DNAT --to-destination 10.1.2.2
iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

これは機能します。リクエストを VPN クライアントに転送し、VPN クライアントによってホストされているサービスを利用できます。ただし、INCOMING-CLIENT のリクエストの実際の IP アドレスを知る必要がある別のサービスがあります。上記の方法を実行すると、VPN クライアントは、INCOMING-CLIENT の IP アドレスが 10.1.2.1 であると認識します。これは、OpenVPN サーバーの IP アドレスです。

MASQUERADE を次のように置き換えるなど、さまざまな解決策を試しました...

iptables -t nat -A POSTROUING -o tun0 -s 10.1.2.2 -j SNAT --to-source <EXTERNAL IP #1>

しかし、それは機能しません。すべてのリクエストがハングします。

私のネットワーク アーキテクチャでは、OpenVPN トンネルである venet0 と tun0 のみを使用しています。パブリック クライアントの実際の IP アドレスを取得する方法についての提案をいただければ幸いです。ありがとうございます。

トレシウス

答え1

SNAT も MASQUERADE も使用すべきではないようです。どちらのオプションも二重 NAT となり、両端がもう一方の端の実際の IP を知ることができなくなります。NAT は常に、少なくとも一方向でこの知識を破ります。

もう一方の端にあるサーバーがtun0デフォルト ルートとしてルーターを使用している場合は、トラフィックをルーターに返す必要があります。ルーターでは、戻りトラフィックの DNAT を元に戻すことができます。

少なくとも HTTP の場合、代替オプションとして、サーバー上でプロキシを実行することができます。プロキシは、X-Forwarded-For ヘッダーを追加または拡張する必要があります。これには、トラフィックが転送されたアドレスを識別する 1 つ以上のアドレスが含まれます。追加した IP アドレスは信頼できます。他のアドレスは偽装されている可能性があります。

関連情報