LVS的NAT模型本质是多目标IP的DNAT,通过将请求报文中的目标地址和目标端口修改为后端某台Real Server的RIP和PORT从而实现转发调度功能。
以下是NAT模型的几个要点:
(1)RIP和DIP应在同一个IP网络(也可以不在,可以有路由器隔开),且应使用私网地址;RS的网关要指向DIP(如果中间又路由器则RS的网关指向与其连接的路由器的地址)。
(2)请求报文和响应报文都必须经由Director转发,Director易于成为系统瓶颈
(3)支持端口映射,可修改请求报文的目标PORT
(4)VS必须是Linux系统,RS可以是任意OS系统
(5)Director要开启路由转发功能,ip_forward=1
实验注意事项:
关闭selinux
关闭防火墙
一、我们先实现Director与Real Server在同一网段的模型。具体拓扑如下图所示。
1、在Director上配置两个网卡,一个是桥接模式,一个是仅主机模式。VIP属于桥接模式,与客户端相连,用于模拟公网地址。DIP属于仅主机模式,与内网的两台RS相连,并且Director上要开启路由转发功能。
[root@centos7 ~]# ifconfig
ens33: flags=4163 mtu 1500
inet 192.168.147.131 netmask 255.255.255.0 broadcast 192.168.147.255
inet6 fe80::695e:3e6:ebdd:5726 prefixlen 64 scopeid 0x20
ether 00:0c:29:53:a0:bf txqueuelen 1000 (Ethernet)
RX packets 2080 bytes 210490 (205.5 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 904 bytes 77891 (76.0 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens37: flags=4163 mtu 1500
inet 10.10.20.175 netmask 255.255.255.0 broadcast 10.10.20.255
inet6 fe80::20c:29ff:fe53:a0c9 prefixlen 64 scopeid 0x20
ether 00:0c:29:53:a0:c9 txqueuelen 1000 (Ethernet)
RX packets 44556 bytes 6630635 (6.3 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 993 bytes 81540 (79.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73 mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10
loop txqueuelen 1 (Local Loopback)
RX packets 64 bytes 5440 (5.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 64 bytes 5440 (5.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
开启路由转发功能
[root@centos7 ~]# echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
[root@centos7 ~]# sysctl -p
net.ipv4.ip_forward = 1
2、在后端两台RS上配置默认网关,网关地址指向LVS服务器的DIP
192.168.147.132服务器
[root@centos7 network-scripts]# vim ifcfg-ens33
# Generated by parse-kickstart
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
BOOTPROTO="static"
DEVICE="ens33"
IPADDR=192.168.147.132
NETMASK=255.255.255.0
GATEWAY=192.168.147.131 //添加默认网关
ONBOOT="yes"
UUID="ae54cef0-448c-43e7-a028-f1439fb3d850"
[root@centos7 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.147.131 0.0.0.0 UG 100 0 0 ens33
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
192.168.147.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
安装httpd,配置WEB服务
[root@centos7 ~]# yum install httpd
[root@centos7 ~]# echo RS132 > /var/www/html/index.html
[root@centos7 ~]# systemctl start httpd
192.168.147.133服务器
[root@centos7 network-scripts]# vim ifcfg-ens33
# Generated by parse-kickstart
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPADDR=192.168.147.133
GATEWAY=192.168.147.131 //添加默认网关
BOOTPROTO="static"
DEVICE="ens33"
ONBOOT="yes"
UUID="525fc9a7-ef27-46f6-a897-ee1f12032ccc"
~
[root@centos7 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.147.131 0.0.0.0 UG 100 0 0 ens33
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
192.168.147.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
安装httpd,配置WEB服务
[root@centos7 ~]# yum install httpd
[root@centos7 ~]# echo RS133> /var/www/html/index.html
[root@centos7 ~]# systemctl start httpd
在LVS服务器上用curl命令测试一下
[root@centos7 ~]# curl 192.168.147.132
RS132
[root@centos7 ~]# curl 192.168.147.133
RS133
3、回到Director上配置LVS的nat模型的规则
安装程序包
[root@centos7 ~]# yum install ipvsadm -y
配置LVS规则
[root@centos7 ~]# ipvsadm -A -t 10.10.20.175:80 -s wrr //wrr是加权轮询算法,默认是WLC
[root@centos7 ~]# ipvsadm -a -t 10.10.20.175:80 -r 192.168.147.132:80 -m -w 3 //-m表示采用nat模式,默认是DR模型,这里权重为3
[root@centos7 ~]# ipvsadm -a -t 10.10.20.175:80 -r 192.168.147.133:80 -m -w 1 //权重为1
[root@centos7 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.10.20.175:80 wrr
-> 192.168.147.132:80 Masq 3 0 0
-> 192.168.147.133:80 Masq 1 0 0
4、客户端测试,在客户端上路由无需指向10.10.20.175,因为它要访问的VIP,VIP是公网地址(这里使用桥接模式模拟)
这里采用的是WRR算法,权重是1:3,所以能看到调度的时候也是3:1的比例
[root@centos7 ~]# curl 10.10.20.175
RS133
[root@centos7 ~]# curl 10.10.20.175
RS132
[root@centos7 ~]# curl 10.10.20.175
RS132
[root@centos7 ~]# curl 10.10.20.175
RS132
[root@centos7 ~]# curl 10.10.20.175
RS133
[root@centos7 ~]# curl 10.10.20.175
RS132
[root@centos7 ~]# curl 10.10.20.175
RS132
[root@centos7 ~]# curl 10.10.20.175
RS132
二、接下来我们实现Director与Real Server不在在同一网段的模型,中间有路由器隔开。具体拓扑如下图所示。
1、我们先把上图的网络拓扑环境搭建好,首先在Director上配置两个网卡,一个是桥接模式,一个是自定义的vmnet6模式。VIP属于桥接模式,与客户端相连,用于模拟公网地址,DIP属于vmnet6模式,与路由器相连。因为,客户端的请求报文要通过Director上的LVS规则转到后端的RS服务器上,而Director与RS之间隔了路由器,无法直连,所以DIP的网关要指向路由器上与它相连的网卡地址,即192.168.30.2。同时,Director上要开启路由转发功能。
在VMware上点击编辑——>虚拟网络编辑器——>添加网络——>选择VMnet6
点击VMnet6把子网IP改为自己想要的网段,这里改为192.168.30.0,接着点击“DHCP设置”,把起始IP地址改为192.168.30.1,结束IP地址改为192.168.30.254。其余的默认即可。这样自定义的VMnet6网段就设置好了。
在网络适配器上选择VMnet6,另外一个选桥接模式即可。到这里我们基本上把Director的网络配置搞定了。
Director的IP地址具体情况
Director的路由信息
开启路由转发功能
[root@centos7 ~]# echo net.ipv4.ip_forward=1 >> /etc/sysctl.conf
[root@centos7 ~]# sysctl -p
net.ipv4.ip_forward = 1
2、配置路由器的网络环境,路由器上的一个网卡是属于VMnet6模式,一个属于仅主机模式。因为RS的响应报文要经过路由器原路返回给客户端,所以路由器的网关要指向LVS服务器的DIP,即192.168.30.3。
配置网络信息
[root@centos6 network-scripts]# vim ifcfg-eth1
DEVICE=eth1
BOOTPROTO=dhcp
ONBOOT=yes
[root@centos6 network-scripts]# vim ifcfg-eth0
DEVICE="eth0"
BOOTPROTO="static"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
NM_CONTROLLED="yes"
ONBOOT="yes"
TYPE="Ethernet"
UUID="68510e14-5bf8-45b9-bdfc-e556eec113fc"
HWADDR=00:0C:29:85:C7:DD
DEFROUTE=yes
PEERDNS=yes
PEERROUTES=yes
IPV4_FAILURE_FATAL=yes
IPV6_DEFROUTE=yes
IPV6_PEERDNS=yes
IPV6_PEERROUTES=yes
IPV6_FAILURE_FATAL=no
NAME="System eth0"
IPADDR=192.168.147.130
NETMASK=255.255.255.0
添加默认网关
[root@centos6 network-scripts]# route add default gw 192.168.30.3
[root@centos6 network-scripts]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.147.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.30.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1
0.0.0.0 192.168.30.3 0.0.0.0 UG 0 0 0 eth1
开启路由转发功能,这里路由器是使用centos6系统来充当,开启路由转发得操作和centos7系统有点不同。
[root@centos6 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 //把0改为1
3、配置后端两台RS服务器,其实服务器基本配置无需改动,跟上面一样即可,这里只需把RS的网关指向路由器即可。
192.168.147.132
[root@centos7 network-scripts]# cat ifcfg-ens33
# Generated by parse-kickstart
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
BOOTPROTO="static"
DEVICE="ens33"
IPADDR=192.168.147.132
NETMASK=255.255.255.0
GATEWAY=192.168.147.130 //网关改为192.168.147.130
ONBOOT="yes"
路由信息
[root@centos7 ~]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.147.130 0.0.0.0 UG 100 0 0 ens33
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
192.168.147.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.147.133
[root@centos7 network-scripts]# cat ifcfg-ens33
# Generated by parse-kickstart
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPADDR=192.168.147.133
GATEWAY=192.168.147.130
BOOTPROTO="static"
DEVICE="ens33"
ONBOOT="yes"
UUID="525fc9a7-ef27-46f6-a897-ee1f12032ccc"
路由信息
[root@centos7 network-scripts]# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.147.130 0.0.0.0 UG 100 0 0 ens33
192.168.147.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
4、Director上的LVS规则不变,直接用上面的规则即可。
[root@centos7 ~]# ipvsadm -A -t 10.10.20.175:80 -s wrr //wrr是加权轮询算法,默认是WLC
[root@centos7 ~]# ipvsadm -a -t 10.10.20.175:80 -r 192.168.147.132:80 -m -w 3 //-m表示采用nat模式,默认是DR模型,这里权重为3
[root@centos7 ~]# ipvsadm -a -t 10.10.20.175:80 -r 192.168.147.133:80 -m -w 1 //权重为1
[root@centos7 ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.10.20.175:80 wrr
-> 192.168.147.132:80 Masq 3 0 0
-> 192.168.147.133:80 Masq 1 0 0
5、测试,访问的Director的VIP,Director会通过NAT的地址转换,转发到后端的RS服务器上
[root@centos7 ~]# curl 10.10.20.175
RS133
[root@centos7 ~]# curl 10.10.20.175
RS132
[root@centos7 ~]# curl 10.10.20.175
RS132
[root@centos7 ~]# curl 10.10.20.175
RS132
[root@centos7 ~]# curl 10.10.20.175
RS133
[root@centos7 ~]# curl 10.10.20.175
RS132
[root@centos7 ~]# curl 10.10.20.175
RS132
[root@centos7 ~]# curl 10.10.20.175
RS132
总结:该实验的最主要在配置网络环境,只需把网络拓扑弄清,后面的操作就简单多了