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

如何使用iptables做到这一点? />还有其他方法可以实现相同效果吗?

评论

@Matthewlfe,由于某种原因,我需要将所有的apache请求从(192.168.12.87)转发到(192.168.12.77)。

@Matthewlfe,我有两个生产服务器。一个连接到公共静态IP地址。由于某些连接问题,我无法从192.168.12.87连接到数据库和其他系统。因此,我需要将所有请求转发到192.168.12.77。

@lain,我对iptables不熟悉。而且,我看到了一些例子。但是,似乎需要两个以太网。链接:revsys.com/writings/quicktips/nat.html

您还可以在Web服务器配置中使用代理模式将请求从192.168.12.87发送到192.168.12.77(如果您的网络服务器支持)

askapache.com/htaccess / ...

#1 楼

假设iptables正在服务器192.168.12.87上运行,则这些规则应该起作用: back。


替代方法(也是IMHO的最佳方法):

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


mod_proxy(Apache)
proxy_pass(NGinx)


评论


只要禁用了ufw,就可以工作,即使在ufw中允许了端口,但是如果启用了ufw,则此转发功能无效,您知道吗?

– Sudhir N
16-09-25在11:35

好问题,好答案。另一个有用的用例是,如果您需要临时将进入某个服务(例如鱿鱼)的所有流量重定向到另一个ip /端口,以便对原始服务进行一些维护,而无需重新配置所有客户端!非常便利!

–PF4Public
16 Dec 15'在19:20

“但是您还需要将流量SNAT回传。” ->你救了我的一天。谢谢

– obayhan
17年2月27日在14:11

此解决方案不适用于我。我需要从eth0转发到KVM来宾使用的虚拟网络(virb0)。我尝试添加-i和-o选项,但-o不允许进行预路由。有什么建议?

–奥斯汀
17年12月23日在16:37

请谨慎使用此解决方案。我现在完全无法访问我的远程计算机。

–Sören
18/12/25在8:03

#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的主机,因此,一个方向的数据包将被转换,而另一个方向的数据包则不会。

有三种方法可以解决此问题..


在第一台主机上不仅要进行DNAT,而且还要进行SNAT,以便返回流量将通过第一台主机发回。该规则可能类似于iptables -t NAT -A POSTROUTING -d 192.168.12.77 -p tcp --dport 80 -j SNAT --to-source 192.168.12.87

从DSR负载平衡中获取灵感,并对以太网层而非IP层的数据包进行DNAT。通过将数据包的目标MAC替换为192.168.12.77的MAC并在以太网上发送而不接触IP层,则192.168.12.77可以在虚拟接口上配置192.168.12.87,从而能够终止TCP连接使用客户端已知的服务器IP。
在第一台主机上使用朴素(但不起作用)的解决方案。然后通过对返回流量进行SNAT处理第二个主机上的返回数据包。规则可能看起来像iptables -t nat -A OUTPUT -p tcp --sport 80 -j SNAT --to-source 192.168.12.87


这三个解决方案中的每一个都有缺点,因此,如果确实需要执行此特定转发,则需要仔细考虑。 >
使用SNAT将丢失客户端IP,因此2号主机将认为所有连接均来自192.168.12.87。此外,您将通过主机号1使用带宽处理所有答复数据包,这将与其他方法相比采用更直接的路由。
DSR方法将中断两个节点之间的所有其他通信。仅当服务器地址不是任何主机的主IP时,DSR方法才真正适用。每个主机都需要有一个主IP,而不是DSR IP。
在一个主机上使用连接跟踪在一个方向上进行转换,而在另一主机上使用连接跟踪在另一个方向上进行转换,这很丑陋,并且有多种方式可以破坏它。例如,如果任一主机上的端口号都被NAT修改,则无法重建端口号。同样,如果连接跟踪看到的第一个数据包是SYN-ACK而不是ACK,那么连接跟踪也将正常工作。

我认为三种方法中的第一种是,这最可能起作用。因此,如果您不需要知道客户端IP地址,那就是我建议的地址。层。您可以一直进行到HTTP层并在那里寻找解决方案。在这种情况下,您将找到一个HTTP代理解决方案。如果在192.168.12.87上安装了HTTP代理并进行了适当的配置,则可以让它将请求转发到192.168.12.77并转发回答案。此外,它可以插入保留原始客户端IP的X-Forwarded-For标头。然后需要将192.168.12.77上的服务器配置为信任来自192.168.12.87的X-Forwarded-For标头。

评论


我很惊讶-j MASQUERADE在这里没有提到。这不是DNAT常用的方法吗?

–记忆
15年12月4日在19:11

@remram我提到SNAT而不是MASQUERADE,因为这就是文档所说的。文档中的确切措辞是:仅应与动态分配的IP(拨号)连接一起使用:如果您具有静态IP地址,则应使用SNAT目标。

–卡巴斯德
15年12月4日在22:17