sat*_*sat 87 linux iptables port-forwarding
我想NAT在iptables. 这样,所有到达192.168.12.87和 port的数据包都80将被转发到192.168.12.77port 80。
如何用 iptables 做到这一点?
或者
还有其他方法可以实现相同的目标吗?
kri*_*sFR 83
这些规则应该有效,假设它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
Run Code Online (Sandbox Code Playgroud)
您必须对端口 80 上的传入流量进行 DNAT,但您还需要将流量 SNAT 返回。
替代(和最好的方法恕我直言):
根据您的 Web 服务器是什么(Apache、NGinx),您应该考虑在前端服务器(192.168.12.87)上使用 HTTP 代理:
mod_proxy (Apache)
proxy_pass (NGinx)
kas*_*erd 31
一个看似明显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.87iptables -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 标头。
| 归档时间: |
|
| 查看次数: |
236045 次 |
| 最近记录: |