NAT方式是一种由LVS Master服务节点收到数据报,然后转给下层的Real Server节点,当Real Server处理完成后回发给LVS Master节点然后又由LVS Master节点转发出去的工作方式。LVS的管理程序IPVSADMIN负责绑定转发规则,并完成IP数据报文和TCP数据报文中属性的重写。
请用几分钟时间仔细看看下图(为了简单,图里面只画了一个Real Server。如果看不清楚,可点击右键“查看原图”):
在正式的机房环境中,一般有两种方式为一个机器分配外网地址:在核心交换机上直接绑定外网地址到主机网卡的,这样使用ifconfig命令看到的IP地址为外网地址;在核心交换机上使用映射规则,将一个外网地址映射到内网地址,这样使用ifconfig命令看到的IP地址为内网地址。上图中我们采用的是后一种映射规则。如果使用前一种外网IP的分配规则,也不会影响LVS NAT的工作方式,因为这个IP被限制在LVS NAT工作以外。只不过eth1的IP从192.168.100.10换成100.64.92.199而已。
我们用中文描述一下转换规则:凡是发送到“192.168.100.10:80”的数据报,目标地址全部改写为“192.168.220.121:8080”,所以来自于100.64.92.199:80的报文被改写了。被改写的属性包括:IP.header.destinationIP、IP.header.checksum、TCP.header.sourcePort、TCP.header.targetPort、TCP.header.checksum。注意IP报文的Source IP不会发生变化,还是“互联网某个IP”。
这个包最终被送到了192.168.220.121的8080端口进行处理,并由下层的Real Server生成了返回的数据报(至于这个Real Server是不是“真正的Real Server”,LVS不会关心)。你要问它是怎么被发送过去的,请参考ARP查询协议。
注意:因为LVS服务器和Real Server(可能有多个),组成了一个封闭的局域网。除了LVS节点以外,这个子网的任何节点都是无法访问外网的。所以要求192.168.220.121这个Real Server直接把数据报给“互联网某个IP”这个外网地址,显然是不行的,因为在局域网中根本就找不到这个IP。Real Server只能将数据报返给网关,再由网关去寻找这个外网地址。整个服务器中只有LVS节点能够找到这个外网地址,这就是为什么在LVS-NAT工作模式下,所有的Real Server节点必须设置自己的Gateway为LVS节点的原因。
收到来源于“192.168.220.121:8080”的数据报文后,IPVS又要进行数据报文的重写了。重写规则是:凡是来源于“192.168.220.121:8080”的数据报,源地址全部改写为“192.168.100.10:80”。于是数据报文的Source IP、Source Port被改写成“192.168.100.10:80”。在外层的核心交换机(或者是机房以外的请求方)看来,LVS接受了数据报,并进行了处理,返回了结果。它并不知道LVS节点的下层还有什么。
LVS-NAT的优点在于:
配置管理简单。LVS-NAT的工作方式是LVS三种工作模式中最容易理解、最容易配置、最容易管理的工作模式。
节省外网IP资源,一般机房分配给使用者的IP数量是有限的,特别是您购买的机架的数量不多时。LVS-NAT工作方式将您的系统架构封装在局域网中,只需要LVS有一个外网地址或外网地址映射就可以实现访问了。
系统架构相对封闭。在内网环境下我们对防火墙的设置要求不会很高,也相对容易进行物理服务器的运维。您可以设置来源于外网的请求需要进行防火墙过滤,而对内网请求开放访问。
另外改写后转给Real Server的数据报文,Real Server并不会关心它的真实性,只要TCP校验和IP校验都能通过,Real Server就可以进行处理。所以LVS-NAT工作模式下Real Server可以是任何操作系统,只要它支持TCP/IP协议即可。
当然作为Linux系统忠实拥护者,我并不建议使用Window服务器。但如果您的Real Server是.Net系统,又有业务场景需要用到LVS,那么LVS-NAT可能是一个不错的选择。
LVS-NAT的缺点是由于这种转发模式本身所造成的:
- 转发点就是瓶颈点。您可以想象100台Real Server将处理结果全部转到一个LVS进行发送是一个怎么样的场景。事实上,LVS-NAT的极限负载是达不到100台Real Server的。