如何在不更改源 IP 地址的情况下将请求重定向到我的外部 IP 地址/端口到 Linux 中的不同外部 IP 地址/端口?

lch*_*ang 2 linux ubuntu iptables

我可以使用以下命令,但它们会更改源 IP 地址:

iptables -t nat -A PREROUTING -p tcp --dport port -j DNAT --to-destination dest_ip:port
iptables -t nat -A POSTROUTING -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)

所以我在dest_ip的电脑上得到的源IP地址相当于这台电脑的IP地址,但是我想得到真实的IP地址。

如果我删除iptables -t nat -A POSTROUTING -j MASQUERADE,我将无法得到任何回应。我怎么解决这个问题?

所有 IP 地址都是外部 IP 地址。

kas*_*erd 5

PREROUTING没有规则的情况下使用MASQUERADE规则将满足您的要求。它仍然不起作用,但这是出于不同的原因。

如果您有一个客户端192.0.2.1将 SYN 数据包发送到您的服务器198.51.100.2,那么您的第一个规则可以将该数据包的目标地址更改为您的其他服务器203.0.113.3并按原样转发。

使用这种方法可能遇到的第一个问题是198.51.100.2和之间的连接203.0.113.3可能具有源 IP 过滤。这将导致数据包被丢弃,因为源地址仍然是192.0.2.1路由器所期望的198.51.100.2。如果在您的特定网络中是这种情况,则可以通过使用隧道来解决。

但是,您将遇到另一个问题。一旦数据包到达203.0.113.3SYN-ACK 将被发送回192.0.2.1。这将直接路由到客户端,而无需通过应用该DNAT规则的第一台机器。

从发送一个SYN客户192.0.2.1198.51.100.2会看到一个SYN-ACK从203.0.113.3192.0.2.1。这将不会匹配客户端上的任何 TCP 连接,并且客户端将回复一个 RST 数据包。一旦 RST 数据包到达203.0.113.3TCP 连接在服务器端关闭。

总共传输了四个数据包,并且在完全建立之前连接在服务器端关闭。这四个数据包将重复与客户端重新传输 SYN 的次数一样多,直到超时。

有几种方法可以解决这个问题:

  • 路线从所有流量203.0.113.3通过198.51.100.2,以确保它被转换回来的路上。不幸的是,这将使公共 IP203.0.113.3无法用于任何其他目的。
  • 将辅助 IP 分配给203.0.113.3,例如,您可以将其10.0.113.3作为辅助 IP 地址。在198.51.100.2DNAT10.0.113.3并使用隧道203.0.113.3,以获得数据包转发给正确的目标主机。在203.0.113.3您使用路由策略来确保具有源 IP 的数据包10.0.113.3通过隧道路由回,而其他数据包通过您的默认网关路由。
  • 停止使用 NAT,而是使用 DSR 负载平衡方法将数据包从 发送198.51.100.2203.0.113.3。如果这两个没有直接连接,它们之间没有路由器,这将再次需要隧道。但是这次隧道内的数据包保留了原来的目的地址,203.0.113.3不需要路由策略,而是直接向客户端发送正确的回复。这样做的缺点是203.0.113.3需要被分配198.51.100.2作为辅助IP,并因此198.51.100.2203.0.113.3将无法互相沟通,但他们仍然会与其他人沟通就好了。
  • 如果您只需要支持 HTTP,则可以使用代理代替 NAT。然后你可以使用X-Forwarded-For203.0.113.3知道原始客户端IP。然后,Web 服务器203.0.113.3将需要信任X-Forwarded-For源自198.51.100.2其他客户端 IP 的任何连接,并忽略它。