LVS的NAT模型
客户通过Virtual IP Address(虚拟服务的IP地址)访问网络服务时,请求报文到达调度器,调度器根据连接调度算法从一组真实服务器中选出一台服务器,将报文的目标地址 Virtual IP Address改写成选定服务器的地址,报文的目标端口改写成选定服务器的相应端口,最后将修改后的报文发送给选出的服务器。同时,调度器在连接Hash 表中记录这个连接,当这个连接的下一个报文到达时,从连接Hash表中可以得到原选定服务器的地址和端口,进行同样的改写操作,并将报文传给原选定的服务 器。当来自真实服务器的响应报文经过调度器时,调度器将报文的源地址和源端口改为Virtual IP Address和相应的端口,再把报文发给用户。我们在连接上引入一个状态机,不同的报文会使得连接处于不同的状态,不同的状态有不同的超时值。在TCP 连接中,根据标准的TCP有限状态机进行状态迁移,这里我们不一一叙述,请参见W. Richard Stevens的《TCP/IP Illustrated Volume I》;在UDP中,我们只设置一个UDP状态。不同状态的超时值是可以设置的,在缺省情况下,SYN状态的超时为1分钟,ESTABLISHED状态的超 时为15分钟,FIN状态的超时为1分钟;UDP状态的超时为5分钟。当连接终止或超时,调度器将这个连接从连接Hash表中删除。
首先,需要确定的一点是,LVS-NAT模型中,所有的网络流量都需要流经DS,即包括请求报文和回应报文。当Client端从浏览器或其他客户端请求http或其它网络服务时,先由我们的DS服务器公网网卡接收,然后通过LVS调度挑选一个RS服务器,并通过内部转发机制从其内网网口转发给选中的RS服务器,最后将RS返回的响应报文通过相同的路线反向转回Client端。
假如这里客户端访问RSA的httpd服务
SRC | DEST |
---|---|
CIP XXXX | VIP 80 |
CIP XXXX | RSA 80 |
RSA 80 (GW指向DIP) | CIP XXXX |
VIP80 | CIP XXXX |
经过原路返回
可以替代映射非标准端口
对于LVS它的工作机制潜伏在INPUT前,只要是访问对应端口的直接转发到对应的服务。因为访问特定的端口才会被替代。
lvs-nat:本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为某挑出的RS的RIP和PORT实现转发
(1)RIP和DIP应在同一个IP网络,且应使用私网地址;RS的网关要指向DIP
(2)请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈
(3)支持端口映射,可修改请求报文的目标PORT
(4)VS必须是Linux系统,RS可以是任意OS系统
这种模式借助 iptables 的 nat 表来实现
用户的请求到分发器后,通过预设的 iptables 规则,把请求的数据包转发到后端的 rs 上去
rs 需要设定网关为分发器的内网 ip
用户请求的数据包和返回给用户的数据包全部经过分发器,所以分发器成为瓶颈
在 nat 模式中,只需要分发器有公网 ip 即可,所以比较节省公网 ip 资源
实验搭建
环境:
四台主机
一台:Internet client :172.20.0.111/16 (桥接) GW在一个网段即不用配
一台:LVS :eth1 桥接 172.20.222.222/16 eth0 NAT 192.168.32.7/24
两台RS:
RS1:192.168.32.8/24 GW指向192.168.32.7,原路返回
RS1:192.168.32.18/24 GW指向192.168.32.7,原路返回
Internet client 中操作:
[root@Internet ~]#vim /etc/sysconfig/network-scripts/ifcfg-eth0
DEVICE=eth0
NAME=eth0
BOOTPROTO="static"
IPADDR=172.20.0.111
NETMASK=255.255.0.0
DNS1=114.114.114.114
GATEWAY=172.20.222.222
DNS2=8.8.8.8
[root@Internet ~]#ip route
default via 172.20.222.222 dev eth0 proto static metric 100
172.20.0.0/16 dev eth0 proto kernel scope link src 172.20.0.111 metric 100
RS1:192.168.32.8中操作:
[root@RS1 ~]#yum install httpd -y
[root@RS1 ~]#systemctl start httpd
[root@RS1 ~]#vim /var/www/html/index.html
[root@RS1 ~]#cat /var/www/html/index.html
RS1 web server 1
[root@RS1 ~]#vim /etc/sysconfig/network-scripts/ifcfg-eth0
[root@RS1 ~]#cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE="Ethernet"
DEVICE=eth0
NAME=eth0
BOOTPROTO="static"
IPADDR=192.168.32.8
NETMASK=255.255.255.0
GATEWAY=192.168.32.7 #网关指向原路返回
DNS1=114.114.114.114
DNS2=8.8.8.8
[root@RS1 ~]#nmcli c reload
[root@RS1 ~]#nmcli c up eth0
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/12)
[root@RS1 ~]#ip route
default via 192.168.32.7 dev eth0 proto static metric 100
192.168.32.0/24 dev eth0 proto kernel scope link src 192.168.32.8 metric 100
[root@RS1 ~]#
RS2:192.168.32.18中操作:
[root@RS2 ~]#yum install httpd -y
[root@RS2 ~]#systemctl start httpd
[root@RS2 ~]#vim /var/www/html/index.html
[root@RS2 ~]#cat /var/www/html/index.html
RS2 web server 2
[root@RS2 ~]#vim /etc/sysconfig/network-scripts/ifcfg-eth0
[root@RS2 ~]#cat /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE="Ethernet"
DEVICE=eth0
NAME=eth0
BOOTPROTO="static"
IPADDR=192.168.32.18
NETMASK=255.255.255.0
GATEWAY=192.168.32.7 #网关指向原路返回
DNS1=114.114.114.114
DNS2=8.8.8.8
[root@RS2 ~]#nmcli c reload
[root@RS2 ~]#nmcli c up eth0
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/2)
[root@RS2 ~]#ip route
default via 192.168.32.7 dev eth0 proto static metric 100
192.168.32.0/24 dev eth0 proto kernel scope link src 192.168.32.18 metric 100
[root@RS2 ~]#
LVS 服务器中操作:
先测试一下是否在LVS调度器中能否正常访问。
[root@LVS ~]#curl 192.168.32.8
RS1 web server 1
[root@LVS ~]#curl 192.168.32.18
RS2 web server 2
[root@LVS ~]#
在没有配置LVS调度器之前在外网访问不能访问。
LVS 服务器中操作:
配置LVS 服务器:
[root@LVS ~]#yum install ipvsadm -y
[root@LVS ~]#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@LVS ~]#ipvsadm -A -t 172.20.222.222:80 -s rr
[root@LVS ~]#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.20.222.222:80 rr
[root@LVS ~]#ipvsadm -a -t 172.20.222.222:80 -r 192.168.32.8 -m #-m表示NAT模式
[root@LVS ~]#ipvsadm -a -t 172.20.222.222:80 -r 192.168.32.18 -m
[root@LVS ~]#ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 172.20.222.222:80 rr
-> 192.168.32.8:80 Masq 1 0 0
-> 192.168.32.18:80 Masq 1 0 0
[root@LVS ~]#
lvs类型:
-g: gateway, dr类型,默认
-i: ipip, tun类型
-m: masquerade, nat类型
-w weight:权重
到了这里依旧还是在外网不能访问,因为LVS服务没有打开路由转发功能
[root@LVS ~]#cat /proc/sys/net/ipv4/ip_forward
0
[root@LVS ~]#echo 1 > /proc/sys/net/ipv4/ip_forward
[root@LVS ~]#cat /proc/sys/net/ipv4/ip_forward
1
Internet client 中操作:
测试是否调度成功
[root@Internet ~]#while : ;do curl 172.20.222.222 ;sleep 2 ;done
RS1 web server 1
RS2 web server 2
RS1 web server 1
RS2 web server 2
RS1 web server 1
RS2 web server 2
RS1 web server 1
RS2 web server 2
......
[root@LVS ~]#cat /proc/net/ip_vs_conn #连接数
Pro FromIP FPrt ToIP TPrt DestIP DPrt State Expires PEName PEData
TCP AC14006F D550 AC14DEDE 0050 C0A82012 0050 TIME_WAIT 118
TCP AC14006F D54E AC14DEDE 0050 C0A82008 0050 TIME_WAIT 116
TCP AC14006F D54C AC14DEDE 0050 C0A82012 0050 TIME_WAIT 114
TCP AC14006F D548 AC14DEDE 0050 C0A82012 0050 TIME_WAIT 110
TCP AC14006F D54A AC14DEDE 0050 C0A82008 0050 TIME_WAIT 112
TCP AC14006F D546 AC14DEDE 0050 C0A82008 0050 TIME_WAIT 108
TCP AC14006F D544 AC14DEDE 0050 C0A82012 0050 TIME_WAIT 106
[root@LVS ~]#
[root@LVS ~]#ipvsadm -Lnc
IPVS connection entries
pro expire state source virtual destination
TCP 01:44 TIME_WAIT 172.20.0.111:54678 172.20.222.222:80 192.168.32.8:80
TCP 01:46 TIME_WAIT 172.20.0.111:54680 172.20.222.222:80 192.168.32.18:80
TCP 01:14 TIME_WAIT 172.20.0.111:54648 172.20.222.222:80 192.168.32.18:80
TCP 01:02 TIME_WAIT 172.20.0.111:54636 172.20.222.222:80 192.168.32.18:80
TCP 00:34 TIME_WAIT 172.20.0.111:54608 172.20.222.222:80 192.168.32.18:80
TCP 01:28 TIME_WAIT 172.20.0.111:54662 172.20.222.222:80 192.168.32.8:80
TCP 01:34 TIME_WAIT 172.20.0.111:54668 172.20.222.222:80 192.168.32.18:80
TCP 01:52 TIME_WAIT 172.20.0.111:54686 172.20.222.222:80 192.168.32.8:80
TCP 01:30 TIME_WAIT 172.20.0.111:54664 172.20.222.222:80 192.168.32.18:80
TCP 00:38 TIME_WAIT 172.20.0.111:54612 172.20.222.222:80 192.168.32.18:80
[root@LVS ~]#ipvsadm -Ln --stats
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Conns InPkts OutPkts InBytes OutBytes
-> RemoteAddress:Port
TCP 172.20.222.222:80 95 566 376 37532 44650
-> 192.168.32.8:80 47 282 188 18706 22325
-> 192.168.32.18:80 48 284 188 18826 22325
[root@LVS ~]#
[root@LVS ~]#ipvsadm -Ln --rate
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port CPS InPPS OutPPS InBPS OutBPS
-> RemoteAddress:Port
TCP 172.20.222.222:80 0 3 2 187 224
-> 192.168.32.8:80 0 1 1 80 96
-> 192.168.32.18:80 0 2 1 107 128
[root@LVS ~]#
RS服务器改了端口之后调度就会失败,但是LVS不知道后端服务器的是否故障情况,依旧按照算法调度。
LVS的TUN模式
转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首
部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目
标IP是CIP)
TUN模式特点:
- DIP, VIP, RIP可以是公网地址
- RS的网关一般不能指向DIP
- 请求报文要经由Director,但响应不经由Director
- 不支持端口映射
- RS的OS须支持隧道功能
TUN(virtual server via ip tunneling IP 隧道)调度器把请求的报文通过IP隧道转发到真实的服务器。真实的服务器将响应处理后的数据直接返回给客户端。这样调度器就只处理请求入站报文。此转发方式不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首部(源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP是CIP),由于一般网络服务应答数据比请求报文大很多,采用lvs-tun模式后,集群系统的最大吞吐量可以提高10倍
缺点:由于后端服务器RS处理数据后响应发送给用户,此时需要租借大量IP(特别是后端服务器使用较多的情况下)。
优点:实现lvs-tun模式时,LVS 调度器将TCP/IP请求进行重新封装并转发给后端服务器,由目标应用服务器直接回复用户。应用服务器之间是通过IP 隧道来进行转发,故两者可以存在于不同的网段中。
原路返回
SRC | DEST |
---|---|
CIP | VIP |
CIP | RIP |
RIP | CIP |
VIP | CIP |
LVS的FULLNAT模式
fullnat模式和nat模式比较类似,客户端的请求和响应都会经过lvs,不同的是nat模式下转换仅存在于目的方向,也就是说客户端的发来的请求经过lvs后,请求的目的ip会转化成rs的ip地址,目的端口会转化成rs的目的端口,而在fullnat模式下,客户端发来的请求的源ip和源端口都会被转换成lvs的内网ip地址和端口,同理对于rs回复的响应,nat模式下,响应的目的ip和目的端口均为客户端的,而fullnat模式下,响应的目的ip和目的端口均为lvs内网的,这样lvs收到这个响应后会将源ip和源端口转换成vip的地址和端口,目的ip和目的端口会被转换成客户端的ip地址和端口,也就是说在nat模式下对于客户端的请求仅发生DNAT转换,对于RS的响应仅发生SNAT转换,而fullnat模式下,在请求和响应上都会发生SNAT和DNAT转换;另一点不同是nat模式下要求lvs的内网ip和rs的ip地址在同一网段,lvs和rs之间需要二层交换设备,而fullnat对于请求和响应都会发生DNAT和SNAT所以lvs的内网ip地址可以和rs不再同一网段,这样lvs和rs之间就需要三层交换设备,所以相对于nat模式,fullnat的部署会更加灵活,它不要求lvs的内网ip和rs的ip在同一网段。
通过同时修改请求报文的源IP地址和目标IP地址进行转发
CIP --> DIP
VIP --> RIP
fullnat模式特点:
- VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向
DIP - RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client
- 请求和响应报文都经由Director
- 支持端口映射
注意:此类型kernel默认不支持
原路返回,中间可以添加公网路由,可以距离非常远
SRC | DEST |
---|---|
CIP | VIP |
DIP | RIP |
RIP | DIP |
VIP | CIP |