1. ルーターの DNAT

1. ルーターの DNAT

プロキシから nginx にポート 80 を転送し、元の IP を保持したいと考えています。現在の構造は次のとおりです。

ここに画像の説明を入力してください

Proxy vm(192.168.0.104) - VM with iptables that redirects all traffic from port 80 to 192.168.106:80  
Nginx vm(192.168.0.106) - VM with default nginx webpage on port 80

たとえば、Webブラウザ(ローカルIP:192.168.103)を開き、アドレスフィールドに192.168.0.104を入力すると、デフォルトのNginx Webページが表示されます。Nginxログには、「192.168.0.103 -- [06/Nov/2022:19:10:38 +0600] ...」のような内容が表示されますが、ソースIPは元のIPのままです。

プロキシ VM (192.168.0.104) 上の Iptables スクリプト

#!/bin/bash

IPT=/sbin/iptables

echo "Flushing Tables ..."

# Reset Default Policies
$IPT -P INPUT ACCEPT
$IPT -P FORWARD ACCEPT
$IPT -P OUTPUT ACCEPT
$IPT -t nat -P PREROUTING ACCEPT
$IPT -t nat -P POSTROUTING ACCEPT
$IPT -t nat -P OUTPUT ACCEPT
$IPT -t mangle -P PREROUTING ACCEPT
$IPT -t mangle -P OUTPUT ACCEPT

# Flush all rules
$IPT -F
$IPT -t nat -F
$IPT -t mangle -F

# Erase all non-default chains
$IPT -X
$IPT -t nat -X
$IPT -t mangle -X

# apt install conntrack # if error 
conntrack --flush

IF_IN=enp0s3
PORT_IN=80

IP_OUT=192.168.0.106
PORT_OUT=80

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

$IPT -A PREROUTING -t nat -i $IF_IN -p tcp --dport $PORT_IN -j DNAT --to-destination ${IP_OUT}:${PORT_OUT}
$IPT -A FORWARD -p tcp -i $IF_IN --dport $PORT_OUT -j ACCEPT
$IPT -A POSTROUTING -o $IF_IN -t nat -j MASQUERADE

この設定により、ローカルから 192.168.0.104 経由で Web ページにアクセスできますが、元の IP アドレスは保存されません。
このトリックを実行する方法を誰か知っていますか?

答え1

iptables を使用してトラフィックを転送し、クライアント IP を保持することは、プロキシがデフォルト ゲートウェイでもある場合、またはその他のルーティング トリックを使用している場合にのみ可能です (DNAT を使用)。

最も適切なオプションは次のとおりです(私の意見では):

1. ルーターの DNAT

プロキシVMをルーターとして設定します。Webサーバーのすべてのトラフィックがこのルーター(デフォルトゲートウェイ)を通過するようにします。次に、ルーターで宛先NATを設定します。

2. L7プロキシを使用する

HTTP トラフィックを理解するレイヤー 7 プロキシを使用します。(nginx、haproxy など) このプロキシは、元のクライアント IP に設定される HTTP エラーを設定できます。

nginx

設定に以下を追加します。

proxy_set_header   X-Real-IP          $remote_addr;

HAプロキシ

設定に以下を追加します。

frontend *your_frontend*
  option forwardfor header X-Real-IP
  http-request set-header X-Real-IP %[src]

関連情報