如何在同一个networking中从一个IP到另一个IP的端口转发?

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

如何用iptables做到这一点?

要么

任何其他方式来实现相同的?

    这些规则应该工作,假设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传入stream量,但您还需要SNATstream量返回。


    替代(和最好的方法恕我直言):

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

    • mod_proxy (Apache)

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

    有三种方法可以解决这个问题。

    1. 在第一台主机上,不仅要做DNAT,还要做SNAT,这样返回的stream量将通过第一台主机发送回去。 规则可能看起来像iptables -t NAT -A POSTROUTING -d 192.168.12.77 -p tcp --dport 80 -j SNAT --to-source 192.168.12.87
    2. 从DSR负载平衡和DNAT中获取灵感,而不是在IP层的以太网层上的数据包。 通过将MAC地址为192.168.12.77的MAC地址replace成以太网而不接触IP层,192.168.12.77就可以在虚拟接口上configuration为192.168.12.87,从而可以终止TCP连接与服务器知道客户端的IP。
    3. 在第一台主机上使用天真(但不工作)的解决scheme。 然后通过对返回stream量执行SNAT来处理第二个主机上的返回数据包。 规则可能看起来像iptables -t nat -A OUTPUT -p tcp --sport 80 -j SNAT --to-source 192.168.12.87

    这三种解决scheme中的每一种都有缺陷,所以如果你确实需要做这个特殊的转发,你需要仔细考虑。

    1. 使用SNAT将丢失客户端IP,因此主机号码2将认为所有连接来自192.168.12.87。 另外,您将通过主机号码1使用所有回复数据包的带宽,这将采取更直接的路线与其他方法。
    2. DSR方法将打破两个节点之间的所有其他通信。 只有当服务器地址不是任何主机的主IP时,DSR方法才真正适用。 每个主机都需要一个主IP,而不是DSR IP。
    3. 在一个主机上使用连接跟踪来转换一个方向,另一个主机上的连接跟踪转换到另一个方向是非常丑陋的,并且存在各种各样的方式。 例如,如果在任一主机上通过NAT修改端口号,则无法重build这些端口号。 这也不是一个给定的,连接跟踪将正常工作,如果它看到的第一个数据包是一个SYN-ACK而不是一个ACK。

    在这三种方法中,我认为第一种是最有可能起作用的方法。 所以如果你不需要知道客户的IP地址,那就是我推荐的那个。

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