使用 IPTABLES 和远程 IP 检测进行端口转发

使用 IPTABLES 和远程 IP 检测进行端口转发

我能够使用 IPTABLES 将 80 端口从主服务器 192.168.90.1 转发到第二台服务器 192.168.90.2

主服务器有公网地址XXXX

所以我转发了 XXXX:80 -> 192.168.90.2:80

我的问题是第二台服务器认为来自 Internet 的所有流量都来自 192.168.90.1(所有远程地址都是 192.168.90.1,而不是客户端的真实地址 exp:将显示 192.168.90.1 而不是客户端 IP)

有人遇到过这个问题吗?我需要在不使用反向代理解决方案的情况下修复它

这是我转发数据包的方式:

iptables -A PREROUTING -t nat -d XXXX -p tcp --dport 80 -j DNAT --to-destination 192.168.90.2:80

iptables -t nat -A POSTROUTING -d 192.168.90.2 -p tcp --dport 80 -j SNAT --to XXXX

答案1

  1. 看起来它来自第一个路由器SNAT。因此删除SNAT规则以保留传入流量的原始源 IP 地址。
  2. 然后,告诉第二台服务器,它的默认路由器应该是第一个知道如何将其路由回源的服务器。

我假设所有其他的东西都配置正确:

  • 已启用 IP 转发
  • 没有其他阻止 iptables 规则

答案2

据我了解,您的主服务器有两个固定 IP 地址:

  • 私人的:192.168.90.1(假设eth0
  • 公开的:XXXX(假设wan0

假设我是对的:

实际上,当目的地是 192.168.90.2:80 时,您的 SNAT 规则会对所有 TCP 流量执行 NAT

我不确定这条规则是否相关,因为您已经在 DNAT 规则中转发了端口 80,并且主服务器和辅助服务器位于同一个子网(私有 IP)上,因此您不需要特定的路由来使它们相互通信...

我认为您应该删除您的 SNAT 规则。


在我看来,您的 SNAT 规则更有意义,即使用您的公共 IP 将所有传出到 Internet 的流量进行 NAT。

也许您应该通过在传出接口上添加过滤器来更改它,以便仅对流向 WAN 接口的流量进行 SNAT:

iptables -t nat -A POSTROUTING -o wan0 -p tcp --dport 80 -j SNAT --to X.X.X.X

但是如果你的辅助服务器已经可以访问互联网,说明你的路由和规则已经正确了,所以你不需要这个 SNAT 规则。

相关内容