我想NAT
在iptables
. 这样,所有进入192.168.12.87
和端口的数据包都80
将被转发到192.168.12.77
端口80
。
如何用 iptables 做到这一点?
或者
还有其他方法可以达到同样的效果吗?
我想NAT
在iptables
. 这样,所有进入192.168.12.87
和端口的数据包都80
将被转发到192.168.12.77
端口80
。
如何用 iptables 做到这一点?
或者
还有其他方法可以达到同样的效果吗?
假设
iptables
在服务器上运行,这些规则应该有效192.168.12.87
:您必须对端口 80 上的传入流量进行 DNAT,但您还需要对流量进行 SNAT。
替代(和最好的方法恕我直言):
根据您的 Web 服务器是什么(Apache、NGinx),您应该考虑在前端服务器(192.168.12.87)上使用 HTTP 代理:
mod_proxy (阿帕奇)
proxy_pass (NGinx)
一个看似明显
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 的主机,因此一个方向的数据包会被转换,但另一个方向的数据包不会。
解决这个问题有三种方法。
iptables -t NAT -A POSTROUTING -d 192.168.12.77 -p tcp --dport 80 -j SNAT --to-source 192.168.12.87
iptables -t nat -A OUTPUT -p tcp --sport 80 -j SNAT --to-source 192.168.12.87
这三个解决方案中的每一个都有缺点,所以你需要仔细考虑,如果你真的需要做这个特定的转发。
在这三种方法中,我认为第一种是最有可能奏效的。因此,如果您不需要知道客户端 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 标头。