iptable 能做到这一点吗或者我应该使用 mod_proxy?

iptable 能做到这一点吗或者我应该使用 mod_proxy?

我正在尝试配置我的网络以在一个设备上接收传入连接,然后将其重定向到特定端口上的另一个设备。现在我使用的是端口 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也有类似的解决方案。但这当然不适用于不同的协议。

相关内容