LVS/NAT
LVS/NAT模式原理:(重点理解数据包的改变)
NAT工作模式,简单来说就是传统的NAT,进出流量都需要经过调度器,调度器会选择一个目的服务器,将进入流量的目标IP改写为负载均衡到的目标服务器,同时源IP地址也会改为调度器IP地址。机制简单,但限制大,IPVS需要维护每个映射关系,而且进出入流量都需要经过调度器,实际上这个会成为瓶颈。
LVS/NAT模式过程:
(a). 当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。 此时报文的源IP为CIP,目标IP为VIP
(b). PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链
(c). IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。 此时报文的源IP为CIP,目标IP为RIP
(d). POSTROUTING链通过选路,将数据包发送给Real Server
(e). Real Server比对发现目标为自己的IP,开始构建响应报文发回给Director Server。 此时报文的源IP为RIP,目标IP为CIP
(f). Director Server在响应客户端前,此时会将源IP地址修改为自己的VIP地址,然后响应给客户端。 此时报文的源IP为VIP,目标IP为CIP
LVS-NAT模式特性:
-
RS应该使用私有地址,RS的网关必须指向DIP
-
DIP和RIP必须在同一个网段内
-
请求和响应报文都需要经过Director Server,高负载场景中,Director Server易成为性能瓶颈
-
支持端口映射
-
RS可以使用任意操作系统
-
缺陷:对Director Server压力会比较大,请求和响应都需经过director server
LVS-NAT模式部署
实验环境:
一台Director:server1
版本:Red Hat Enterprise Linux Server release 6.5
双网卡:
eth0:172.25.81.1/24 (DIP:内网IP)
eth1:172.25.254.1/24(VIP:外网IP)
两台RealServer:
Server2:172.25.81.2/24(网关必须指向Director的DIP)
Server3:172.25.81.3/24(网关必须执行Director的DIP)
一台Client: 172.25.81.250
server1配置:
<1>添加网卡
<2>配置网络
[root@server1 ~]# cd /etc/sysconfig/network-scripts
[root@server1 network-scripts]# cp ifcfg-eth0 ifcfg-eth1
[root@server1 network-scripts]# vim ifcfg-eth1
[root@server1 network-scripts]# /etc/init.d/network restart
<3>添加ipvsadm策略
[root@server1 network-scripts]# ipvsadm -C ##清空之前的所有策略
[root@server1 network-scripts]# ipvsadm -A -t 172.25.254.1:80 -s rr ##添加地址为172.25.254.1:80的虚拟服务,指定调度算法为轮循
[root@server1 network-scripts]# ipvsadm -a -t 172.25.254.1:80 -r 172.25.81.3:80 -m ##添加真实服务器,指定传输模式为NAT
[root@server1 network-scripts]# ipvsadm -a -t 172.25.254.1:80 -r 172.25.81.2:80 -m ##添加真实服务器,指定传输模式为NAT
[root@server1 network-scripts]# /etc/init.d/ipvsadm save ##保存策略
<4>开启路由机制
永久开启:
[root@server1 ~]# vim /etc/sysctl.conf
[root@server1 ~]# sysctl -p
临时开启:
[root@server1 ~]# sysctl -a | grep ip_forward
[root@server1 ~]# sysctl -w net.ipv4.ip_forward=1
[root@server1 ~]# sysctl -p
<5>加载NAT模块
[root@server1 ~]# modprobe iptable_nat
真实服务器server2配置:
<1>添加网关
临时添加:
[root@server2 ~]# route add default gw 172.25.81.1 ##网关指向server1
<2>开启httpd服务
真实服务器server3配置:
<1>添加网关
临时添加:
[root@server3 ~]# route add default gw 172.25.81.1 ##网关指向server1
<2>开启httpd服务
测试:
客户端测试:
调度器调度情况显示: