![IPTables 端口转发保留原始 IP 地址](https://linux22.com/image/606066/IPTables%20%E7%AB%AF%E5%8F%A3%E8%BD%AC%E5%8F%91%E4%BF%9D%E7%95%99%E5%8E%9F%E5%A7%8B%20IP%20%E5%9C%B0%E5%9D%80.png)
我希望有人能帮我完成这个配置。我已经有一个可用的设置,其中 Linux 机器充当路由器,只为公共 IP 进行端口转发。顺便说一下,这些都是公共 IP。
HOST_x - 可以是任何具有公共 IP 的主机。(例如:xxxx)
MY_LINUX - 使用 IPtables 仅为公共 IP 进行端口转发。(固定 IP,例如:2.2.2.2)
服务器 - 具有公共 IP 地址的 Web 服务器。(固定 IP,例如 3.3.3.3)
端口 — (TCP 端口 = 80)
这是 MY_LINUX 上的配置:
iptables -t nat -A PREROUTING -p tcp -d 2.2.2.2 --dport 80 -j DNAT --to-destination 3.3.3.3:80 iptables -t nat -A POSTROUTING -p tcp -d 3.3.3.3 --dport 80 -j MASQUERADE
上述配置有效。当 HOST_x 在浏览器上输入 2.2.2.2 时,它会从 3.3.3.3 获取网页。
我这里唯一遇到的问题是,目标服务器(3.3.3.3)看到来自MY_LINUX(2.2.2.2)的请求,我想要看到的是请求HOST_x(xxxx)的原始IP。
我将非常感激任何建议,谢谢。
答案1
我认为这在第 3 层是不可能的。HOST_x 期望剩余的数据包来自它发起连接 MY_LINUX 的主机。如果 SERVER 突然介入 TCP 握手和回复,HOST_x 就会忽略这些数据包。
由于 HOST_x 和 SERVER 具有直接连接,我认为最好将此路由方案移至应用层并实现 HTTP 重定向。然后 HOST_x 直接打开到端点的连接。
答案2
如果您也可以访问 Web 服务器(或其网关),则可以执行此操作。我想到的唯一解决方案是在路由器和 Web 服务器之间建立隧道。然后,Web 服务器(网关)可以将所有回复数据包发送到路由器,而无需调整目标地址。如果这是您的选择,那么我将查看详细信息。