如何在同一网络中从一个 IP 进行端口转发到另一个 IP?

如何在同一网络中从一个 IP 进行端口转发到另一个 IP?

我想NAT在 中做一些事情iptables。这样,所有到达192.168.12.87和 端口的数据包都80将被转发到192.168.12.77端口80

如何使用 iptables 来实现这一点?

或者

还有其他方法可以达到同样的效果吗?

答案1

假设iptables在服务器上运行,这些规则应该有效192.168.12.87

#!/bin/sh

echo 1 > /proc/sys/net/ipv4/ip_forward

iptables -F
iptables -t nat -F
iptables -X

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77:80
iptables -t nat -A POSTROUTING -p tcp -d 192.168.12.77 --dport 80 -j SNAT --to-source 192.168.12.87

您必须对端口 80 上的传入流量进行 DNAT,但您还需要对流量进行 SNAT。


替代方案(也是我认为最好的方法):

根据您的 Web 服务器(Apache、NGinx),您应该考虑在前端服务器(192.168.12.87)上使用 HTTP 代理:

答案2

一个看似显而易见的方法iptables -t nat -A PREROUTING -d 192.168.12.87 -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77却行不通,原因在于返回数据包将如何被路由。

您可以设置规则,使发送到 192.168.12.87 的数据包简单地通过 NAT 转换到 192.168.12.77,但 192.168.12.77 会直接将回复发送回客户端。这些回复不会经过您的 iptables 规则执行 NAT 的主机,因此一个方向的数据包会被转换,而另一个方向的数据包则不会。

解决此问题有三种方法。

  1. 在第一个主机上,不仅要执行 DNAT,还要执行 SNAT,这样返回的流量将通过第一个主机发送回去。规则可能类似于iptables -t NAT -A POSTROUTING -d 192.168.12.77 -p tcp --dport 80 -j SNAT --to-source 192.168.12.87
  2. 借鉴 DSR 负载平衡,在以太网层而不是 IP 层对数据包进行 DNAT。通过将数据包的目标 MAC 替换为 192.168.12.77 的 MAC,并在以太网上发送而不触及 IP 层,那么 192.168.12.77 可以在虚拟接口上配置 192.168.12.87,从而能够终止与客户端已知的服务器 IP 的 TCP 连接。
  3. 在第一台主机上使用简单(但不起作用)的解决方案。然后通过对返回流量执行 SNAT 来处理第二台主机上的返回数据包。规则可能如下所示iptables -t nat -A OUTPUT -p tcp --sport 80 -j SNAT --to-source 192.168.12.87

这三种解决方案各有缺点,因此您需要仔细考虑是否真的需要进行这种特定的转发。

  1. 使用 SNAT 将丢失客户端 IP,因此主机 2 将认为所有连接都来自 192.168.12.87。此外,您将通过主机 1 使用带宽来传输所有回复数据包,而使用其他方法将采用更直接的路由。
  2. DSR 方法将中断两个节点之间的所有其他通信。DSR 方法实际上只适用于服务器地址不是任何主机的主 IP 的情况。每个主机都需要有一个主 IP,而不是 DSR IP。
  3. 在一台主机上使用连接跟踪进行一个方向的转换,而在另一台主机上使用连接跟踪进行另一个方向的转换,这样做非常不妥,而且有多种方式可能会破坏它。例如,如果任一主机上的 NAT 修改了端口号,则无法重建这些端口号。如果连接跟踪看到的第一个数据包是 SYN-ACK 而不是 ACK,那么连接跟踪也无法正常工作。

在这三种方法中,我认为第一种方法最有可能奏效。因此,如果您不需要知道客户端 IP 地址,我建议您使用这种方法。

您也可以选择完全忘记 NAT,不尝试在 MAC 或 IP 层上解决问题。您可以一直到 HTTP 层并在那里寻找解决方案。在这种情况下,您将找到的解决方案是 HTTP 代理。如果您在 192.168.12.87 上安装 HTTP 代理并对其进行适当配置,您可以让它将请求转发到 192.168.12.77 并将答案转发回来。此外,它可以插入 X-Forwarded-For 标头以保留原始客户端 IP。然后需要将 192.168.12.77 上的服务器配置为信任来自 192.168.12.87 的 X-Forwarded-For 标头。

相关内容