IPTables -- 轉送至連線的用戶端但保留來源 IP

IPTables -- 轉送至連線的用戶端但保留來源 IP

這是我的場景:

我有一個有兩個IP位址並且正在運行OpenVPN的VPS(OpenVPN伺服器的IP位址:10.1.2.1)。我想將一個位址上收到的所有流量轉送到 VPN 用戶端 (10.1.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 用戶端託管的服務。但是,我有另一個服務需要知道傳入客戶端請求的真實 IP 位址。當我按照上述方式執行此操作時,VPN 用戶端認為傳入客戶端的 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>

但這行不通。所有請求都會掛起。

我的網路架構僅使用 venet0 和 tun0,即 OpenVPN 隧道。關於如何取得公共用戶端的真實 IP 位址的建議將不勝感激。謝謝。

特雷修斯

答案1

看起來您不應該使用 SNAT 也不應該使用 MASQUERADE。任一選項都會導致雙重 NAT,阻止兩端知道另一端的真實 IP。 NAT 總是會至少在一個方向上破壞這項知識。

如果另一端的伺服器tun0使用您的路由器作為其預設路由,它應該將流量返回到您的路由器,在路由器中可以撤銷返回流量的 DNAT。

至少對於 HTTP 來說,另一種選擇是在伺服器上運行代理程式。代理應添加或擴展 X-Forwarded-For 標頭。這將包含一個或多個位址,用於標識流量已轉送到的位址。您可以信任您新增的 IP 位址。其他地址可能被欺騙。

相關內容