我正在尝试配置我的网络以在一个设备上接收传入连接,然后将其重定向到特定端口上的另一个设备。现在我使用的是端口 80 和运行 apache 的设备。我面临的问题是,当转发完成时,它还会将源 IP 设置为第一个设备,而不是连接到服务的用户的源 IP。
让我来举例说明:
[互联网用户] =
7.7.7.7
连接到 [设备 1] =
1.1.1.1:80
[设备 1] 将其转发给 [设备 2] =
1.1.1.2:80
[设备 2] 输出 [互联网用户] 看到的响应
因此在 [设备 2] 上我自然会在日志中看到 [设备 1] 的 IP,但我想看看是否有办法将互联网用户通过 [设备 1] 连接到 [设备 2],同时在 [设备 2] 的日志中看到真实的源 IP。
那可能吗?
我的规则集目前如下所示:(在设备 1 上)
iptables -P FORWARD ACCEPT
iptables -t nat -I PREROUTING -j DNAT -p tcp --dport 80 --to-destination 1.1.1.2:80
iptables -t nat -I POSTROUTING -j SNAT -p tcp -d 1.1.1.2 --to-source 1.1.1.1
在 [设备 2] 上,它接受来自 [设备 1] 的端口 80 上的所有传入消息,以及接受所有相关的和已建立的连接。
那么,有没有办法将真正的源放到 [设备 2] 上呢?
如果您需要更多信息,请与我们联系!
答案1
这是不可能的,因为“设备 2”需要将答案发送给“设备 1”,而不是直接发送给“互联网用户”(TCP 会话是在“互联网用户”和“设备 1”之间建立的,而不是“设备 2”)。这就是为什么 HTTP 中存在 X-Forwarded-For 标头的原因。
如果是 Apache,您可以使用'武装部队'模块查看真实IP地址。nginx也有类似的解决方案。但这当然不适用于不同的协议。