LVS的NAT模型实现

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在同一网段的模型。具体拓扑如下图所示。
LVS的NAT模型实现_第1张图片
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不在在同一网段的模型,中间有路由器隔开。具体拓扑如下图所示。
LVS的NAT模型实现_第2张图片
1、我们先把上图的网络拓扑环境搭建好,首先在Director上配置两个网卡,一个是桥接模式,一个是自定义的vmnet6模式。VIP属于桥接模式,与客户端相连,用于模拟公网地址,DIP属于vmnet6模式,与路由器相连。因为,客户端的请求报文要通过Director上的LVS规则转到后端的RS服务器上,而Director与RS之间隔了路由器,无法直连,所以DIP的网关要指向路由器上与它相连的网卡地址,即192.168.30.2。同时,Director上要开启路由转发功能。

在VMware上点击编辑——>虚拟网络编辑器——>添加网络——>选择VMnet6
LVS的NAT模型实现_第3张图片
LVS的NAT模型实现_第4张图片
点击VMnet6把子网IP改为自己想要的网段,这里改为192.168.30.0,接着点击“DHCP设置”,把起始IP地址改为192.168.30.1,结束IP地址改为192.168.30.254。其余的默认即可。这样自定义的VMnet6网段就设置好了。
LVS的NAT模型实现_第5张图片
在网络适配器上选择VMnet6,另外一个选桥接模式即可。到这里我们基本上把Director的网络配置搞定了。
LVS的NAT模型实现_第6张图片
Director的IP地址具体情况
LVS的NAT模型实现_第7张图片
LVS的NAT模型实现_第8张图片
Director的路由信息
LVS的NAT模型实现_第9张图片
开启路由转发功能

[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

总结:该实验的最主要在配置网络环境,只需把网络拓扑弄清,后面的操作就简单多了

你可能感兴趣的:(LVS的NAT模型实现)