这是我的情况:
我有一个 VPS,它有两个 IP 地址,并且正在运行 OpenVPN(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 地址。其他地址可能是伪造的。