我想在iptables
做一些NAT
。 这样,所有到达192.168.12.87
和80
端口的数据包将被转发到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的主机,因此一个方向上的数据包被转换,而另一个方向上的数据包则不是。
有三种方法可以解决这个问题。
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
这三种解决scheme中的每一种都有缺陷,所以如果你确实需要做这个特殊的转发,你需要仔细考虑。
在这三种方法中,我认为第一种是最有可能起作用的方法。 所以如果你不需要知道客户的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头。