我尝试使用 iptables 中的 NAT 功能来解决此问题,但失败了
例如。PC A IP 为 1.1.1.1 (Win7) 我的服务器 IP 为 2.2.2.2 (CentOS 6.2) 目标服务器 B 为 3.3.3.3 (Windows server 2003)
流程:PC A WanIP --> 我的服务器 A --> 服务器 B (WanIP)
我的 iptables 规则:
1. iptables -t nat -A PREROUTING -d 2.2.2.2 -p tcp --dport 80 -j DNAT --to-destination 3.3.3.3:80
2. iptables -t nat -A POSTROUTING -d 2.2.2.2 -j MASQUERADE
最后,我可以通过输入 2.2.2.2:80 来访问服务器 B 网站
但是当我检查服务器 B 的访问日志时,我发现它的源地址已更改为 src:2.2.2.2 dst:3.3.3.3
请帮我如何获取真实地址是 src:1.1.1.1 dst:3.3.3.3
答案1
只是一点建议:也许您可以使用代理而不是 iptables 转发?您可以添加 X-Forwarded-For 标头,您的访问日志将显示正确的 IP 地址。
答案2
删除行
iptables -t nat -A POSTROUTING -d 2.2.2.2 -j MASQUERADE
这会将源地址重写为服务器 A 的地址 ( 2.2.2.2
)。您可能会发现删除它会破坏许多其他功能,但这是当前正在执行您不想执行的操作的行。
编辑: 就像我说的, ”你可能会发现删除它会破坏许多其他东西“。特别是如果事实证明 PC A 的真实地址、服务器 B 的真实地址或两者均为 RFC1918 地址(即 10/8、172.16/12 和 192.168/16 范围内的私有地址),那么您将必须想办法在不破坏其他所有地址的 NAT 的情况下免除此穿透,并为返回一半流量整理路由,这可能需要服务器 B 上的 root 权限。由于您已选择删除问题中的所有 IP 地址,并且我们对 PC 或服务器 B 上的路由表以及您当前的任何其他防火墙规则一无所知,因此很难判断其中有多少是必要的或有问题的。