iptables DNAT功能就是重写包的目的IP地址.如果一个包被匹配了,那么它所有的包都会被自动转换,然后被路由到正确的主机或网络.
DNAT target是非常有用的一项功能. 如果我的Web服务器在LAN内部,没有可在Internet上使用的公网IP地址,那就可以使用DNAT让防火墙把所有到它自己:80(web)端口的包转发给LAN内部真正的Web服务器.
另外目的地址也可以是一个范围,这样的话DNAT会为每一次请求随机分配一个地址.,我们可以用这个DNAT做简单的负载平衡.
注意,DNAT 只能用在nat表的PREROUTING和OUTPUT链中,或者是被这两条链调用的链里.
DNAT 选项: --to-destination
范例:iptables -t nat -A PREROUTING -p tcp -d 202.123.45.67 --dport 80 -j DNAT --to-destination 192.168.10.8:80
范例说明:
-t nat 指定要在nat表中添加一条PREROUTING链 -p tcp -d 15.45.23.67 --dport 80 所有要送往202.123.45.67的80端口的数据包 -j DNAT --to-destination 192.168.10.8:80 被DNAT转向192.168.10.8:80端口(也就是LAN内的web服务器上)
这是一个典型的将内部web服务器通过防火墙202.123.45.67发布的案例.要注意:--dport的使用只有先用-p指定了TCP或 UDP协议才能使用.
DNAT的处理过程要做很多工作,我们再通过一个例子来大致理解一下它是如何工作的:
比如,我想通过Internet连接发布我们的网站,但是web server在我们的内网里,我们对外只有一个合法的IP,就是防火墙那个对外的IP(eth1=202.123.45.67).防火墙还有一个内网的IP($AIP0=192.168.10.1),web server的IP也是内网的($BIP=192.168.10.8)为了完成我们发布的要求,要做的第一件事就是把下面的这个简单的规则加入到nat表的PREROUTING链中:
iptables -t nat -A PREROUTING -d 202.123.45.67 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.8:80
现在,所有从Internet到防火墙的80端口去的包都会被转发(被DNAT )到在内网的web服务器上.
注意哦:是所有internet来的包会被转发.如果你在Internet上试验一下,一切正常吧.OK 我们完成了web的对外发布.
这时我们再从内网里试验一下“C计算机”通过internet访问web服务器,肯定是不能用的.这是路由的问题,下面我们来好好分析这个问题.
为了容易阅读,我们把在外网上访问我们服务器的那台机子的IP地址记为“D计算机”.
包从地址为D的机子出发——》去往地址为eth1=202.123.45.67(防火墙)——》包到达防火墙——》防火墙匹配此包为DNAT规则——》转发这个包到eth0—— 》包离开防火墙A向192.168.10.8 web server前进. 包到达web服务器——》80端口回复数据——》防火墙(经过反向DNAT处理)——这样就好像是防火墙自己回复了那个来自外网的请求包.——》发送给计算机D.(这里要求把防火墙作为web到达internet的网关)
现在,我们来考虑和web服务器在同一个内网(这里是指所有机子不需要经过路由器而可以直接互相访问的网络,不是把服务器和客户机又分在不同子网的情况)的C客户机访问它时会发生什么.我们假设客户机的IP为192.168.10.7,其他设置同上.
A是C的网关.C发送请求去往A——》A接到请求后包被DNAT后送往B——》但是包没有经过SNAT 的处理,包还是使用它自己的源地址,就是192.168.10.7(译者注:这就是IP 传输包的特点,只根据目的地的不同改变目的地址,但不因传输过程中要经过很多路由器而随着路由器改变其源地址,除非你单独进行源地址的改变.其实这一步的处理和对外来包的处理是一样的,只不过内网包的问题就在于此,这里交待一下原因). —& |