LVS NAT和DR模式搭建
【摘要】 总结
NAT模式:适用于简单的负载均衡场景,所有流量都经过负载均衡器,容易实现和管理。但是扩展性有限,因为负载均衡器可能成为瓶颈。
DR模式:适用于需要高性能和高可用性的场景,流量直接到达后端服务器,减少了负载均衡器的负担。但是配置相对复杂,需要保证VIP在各服务器之间的同步。
LVS NAT 模式搭建
三台服务器A、B、C:
(调度器dir,分发器) 在虚拟机设置里添加新网卡并设为仅主机模式连接,查看IP
内网网卡:192.168.31.128,网关保持不变(192.168.31.2)
外网网卡:192.168.229.128,不用设置,重启网络即可,此地址跟网卡设置里看到的地址保持一致
[root@qfedu.com ~]# setenforce 0 # 关闭selinux
[root@qfedu.com ~]# systemctl stop firewalld # 停止firewalld
[root@qfedu.com ~]# systemctl disable firewalld # 关闭firewalld
[root@qfedu.com ~]# yum install -y iptables-services # 安装iptables
[root@qfedu.com ~]# systemctl enable iptables # 添加iptables服务
[root@qfedu.com ~]# service iptables start # 启动iptables服务
[root@qfedu.com ~]# iptables -F # 清空iptables规则
[root@qfedu.com ~]# service iptables save # 保存空规则
1、创建 LVS 的 NAT 规则脚本
[root@qfedu.com ~]# vim /usr/local/sbin/lvs_nat.sh
#! /bin/bash
# director 服务器上开启路由转发功能
[root@qfedu.com ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
# 关闭icmp的重定向,开启icmp则无法将数据包转发至real server上,也无法返回
[root@qfedu.com ~]# echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
[root@qfedu.com ~]# echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
[root@qfedu.com ~]# echo 0 > /proc/sys/net/ipv4/conf/eth0/send_redirects
[root@qfedu.com ~]# echo 0 > /proc/sys/net/ipv4/conf/ens37/send_redirects
# director 设置nat防火墙
[root@qfedu.com ~]# iptables -t nat -F 清空所有规则
[root@qfedu.com ~]# iptables -t nat -X 清空所有链
[root@qfedu.com ~]# iptables -t nat -A POSTROUTING -s 192.168.31.0/24 -j MASQUERADE 增加路由转发规则
# director设置ipvsadm变量
IPVSADM='/usr/sbin/ipvsadm'
$IPVSADM -C # 清空所有规则
$IPVSADM -A -t 192.168.229.128:80 -s wlc -p 3 # 保持登陆时限persistent 设为0会报错
# 访问规则,-A指定转发模式,-t指定分发器ip, -s指定调度算法(rr,wrr,wlc,lc)-p登陆保持时限,3秒
$IPVSADM -a -t 192.168.229.128:80 -r 192.168.31.129:80 -m -w 1
# 转发规则,-a指定转发规则 -t指定director ip,-r指定real server ip -m指定NAT模式(masquerade) -w指定权重为1
$IPVSADM -a -t 192.168.229.128:80 -r 192.168.31.130:80 -m -w 1
# 转发规则,-a指定转发规则 -t指定director ip,-r指定real server ip -m指定NAT模式(masquerade) -w指定权重为1
2、给脚本设权
[root@qfedu.com ~]# chmod 755 /usr/local/sbin/lvs_nat.sh
3、执行脚本
[root@qfedu.com ~]# sh /usr/local/sbin/lvs_nat.sh
排错:当给主规则的登陆保持时限(persistent)设为0时,执行脚本会报错
[root@qfedu.com ~]# /usr/local/sbin/lvs_nat.sh
invalid timeout value `0' specified
Memory allocation problem
2、B: real server
(web服务器) 内网网卡:192.168.31.129 网关改为129.168.31.128
安装nginx,并启动,在默认主页里写入,real server 1 关闭selinux,清空防火墙规则
3、C: real server
(web服务器) 内网网卡:192.168.31.130 网关改为129.168.31.128
安装nginx,并启动,在默认主页里写入,real server 2 关闭selinux,清空防火墙规则
4、测试
浏览器里访问192.168.229.128,(A主机外网网卡地址)多刷新几次看结果,服务器的切换。
浏览器上因为有本地缓存的原因,虽已经设定了登陆保持时限为1秒,但每次刷新都会保持在real server 2主机上。可以在调度机里用 curl 192.168.229.128 测试访问,调度算法采用rr,效果更明显。
1、用 ipvsadm 命令查看转发规则
[root@qfedu.com ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.229.128:80 wlc persistent 1
-> 192.168.31.129:80 Masq 1 0 0
-> 192.168.31.130:80 Masq 1 0 0
2、查看 iptables nat 链的转发规则
[root@qfedu.com ~]# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 26 packets, 4015 bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 2 packets, 404 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 1 packets, 328 bytes)
pkts bytes target prot opt in out source destination
7 532 MASQUERADE all -- * * 192.168.31.0/24 0.0.0.0/0
LVS DR 模式搭建
三台服务器A、B、C:
1、A: load balancer
(调度器dir,分发器)
内网网卡:192.168.31.128,网关保持不变(192.168.31.2)
外网网卡:192.168.229.128,先不用理会,这里用不到
[root@a.qfedu.com ~]# setenforce 0 # 关闭selinux
[root@a.qfedu.com ~]# systemctl stop firewalld # 停止firewalld
[root@a.qfedu.com ~]# systemctl disable firewalld # 关闭firewalld
[root@a.qfedu.com ~]# yum install -y iptables-services # 安装iptables
[root@a.qfedu.com ~]# systemctl enable iptables # 添加iptables服务
[root@a.qfedu.com ~]# systemctl start iptables.service # 启动iptables服务
[root@a.qfedu.com ~]# iptables -F # 清空iptables规则
[root@a.qfedu.com ~]# service iptables save # 保存空规则
[root@a.qfedu.com ~]# yum -y install ipvsadm net-tools
1、创建 LVS 的 DR 规则脚本
写入以下内容:
[root@qfedu.com ~]# vim /usr/local/sbin/lvs_dr.sh
echo 1 > /proc/sys/net/ipv4/ip_forward # 打开路由转发
ipv=/usr/sbin/ipvsadm # 设置ipvsadm变量
vip=192.168.31.200 # 设置公用ip变量(virtual ip)
rs1=192.168.31.129 # 设置real server1ip的变量
rs2=192.168.31.130 # 设置real server2ip的变量
ifdown eth0 # 关闭网卡
ifup eth0 # 启动网卡,目的时清空临时设定的ip,避免重复设定
ifconfig eth0:2 $vip broadcast $vip netmask 255.255.255.255 up # 绑定vip到虚拟网卡eth0:2上
route add -host $vip dev eth0:2 # 为eth0:2网卡添加网关
$ipv -C # 清空规则
$ipv -A -t $vip:80 -s wrr # -A指定转发模式,-t指定director ip,-s指定调度算法 wrr加权轮询调度
$ipv -a -t $vip:80 -r $rs1:80 -g -w 1
# 指定转发规则,-a指定转发规则,-t指定调度器(director)ip,-r指定real server IP,-g指定转发模式为DR(gateway) -w指定权重
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1
# 指定转发规则,-a指定转发规则,-t指定调度器(director)ip,-r指定real server IP,-g指定转发模式为DR(gateway) -w指定权重
例子:
#!/bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward
ipv=/usr/sbin/ipvsadm
vip=192.168.152.200
rs1=192.168.152.132
rs2=192.168.152.133
ifdown eth0
ifup eth0
ifconfig eth0:2 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip dev eth0:2
$ipv -C
$ipv -A -t $vip:80 -s wrr
$ipv -a -t $vip:80 -r $rs1:80 -g -w 1
$ipv -a -t $vip:80 -r $rs2:80 -g -w 1
2、给脚本设权
[root@a.qfedu.com ~]# chmod 755 /usr/local/sbin/lvs_dr.sh
3、执行脚本
[root@a.qfedu.com ~]# sh /usr/local/sbin/lvs_dr.sh
4、查看路由上的 vip
[root@a.qfedu.com ~]# route -n
5、查看网卡 eth0 上的 vip
[root@a.qfedu.com ~]# ip addr
2、B: real server
(web服务器) 内网网卡:192.168.31.129 网关改回129.168.31.2
安装nginx,并启动,在默认主页里写入,real server 1 关闭selinux,清空防火墙规则
1、创建转发脚本
[root@b.qfedu.com ~]# yum -y install net-tools
[root@b.qfedu.com ~]# vim /usr/local/sbin/lvs_rs.sh
写入以下内容:
#/bin/bash
vip=192.168.31.200
#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
ifdown lo
ifup lo
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up绑定vip到虚拟网卡lo:0上
route add -host $vip lo:0为lo:0网卡添加网关
#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
arp_ignore:定义对目标地址为本地IP的ARP询问不同的应答模式0
0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求
1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求
2 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内
3 - 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应
4-7 - 保留未使用
8 -不回应所有(本地地址)的arp查询
arp_announce:对网络接口上,本地IP地址的发出的,ARP回应,作出相应级别的限制: 确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口
0 - (默认) 在任意网络接口(eth0,eth1,lo)上的任何本地地址
1 -尽量避免不在该网络接口子网段的本地地址做出arp回应. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.
2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送.
关于对arp_announce 理解的一点补充
其实就是路由器的问题,因为路由器一般是动态学习ARP包的(一般动态配置DHCP的话),当内网的机器要发送一个到外部的ip包,那么它就会请求 路由器的Mac地址,发送一个arp请求,这个arp请求里面包括了自己的ip地址和Mac地址,而linux默认是使用ip的源ip地址作为arp里面 的源ip地址,而不是使用发送设备上面的 ,这样在lvs这样的架构下,所有发送包都是同一个VIP地址,那么arp请求就会包括VIP地址和设备 Mac,而路由器收到这个arp请求就会更新自己的arp缓存,这样就会造成ip欺骗了,VIP被抢夺,所以就会有问题。
arp缓存为什么会更新了,什么时候会更新呢,为了减少arp请求的次数,当主机接收到询问自己的arp请求的时候,就会把源ip和源Mac放入自 己的arp表里面,方便接下来的通讯。如果收到不是询问自己的包(arp是广播的,所有人都收到),就会丢掉,这样不会造成arp表里面无用数据太多导致 有用的记录被删除。
在设置参数的时候将arp_ignore 设置为1,意味着当别人的arp请求过来的时候,如果接收的设备上面没有这个ip,就不做出响应,默认是0,只要这台机器上面任何一个设备上面有这个ip,就响应arp请求,并发送mac地址
例子:
#/bin/bash
vip=192.168.152.200
ifdown lo
ifup lo
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
2、给脚本设权
[root@b.qfedu.com ~]# chmod 755 /usr/local/sbin/lvs_rs.sh
3、执行脚本
[root@b.qfedu.com ~]# sh /usr/local/sbin/lvs_rs.sh
4、查看路由上的 vip
[root@b.qfedu.com ~]# route -n
5、查看网卡 lo 上的 vip
[root@b.qfedu.com ~]# ip addr
3、C: real server
(web服务器) 内网网卡:192.168.31.130 网关改回129.168.31.2
安装nginx,并启动,在默认主页里写入,real server 2 关闭selinux,清空防火墙规则
1、创建转发脚本
[root@c.qfedu.com ~]# yum -y install net-tools
[root@c.qfedu.com ~]# vim /usr/local/sbin/lvs_rs.sh
写入以下内容:
#/bin/bash
vip=192.168.31.200
#把vip绑定在lo上,是为了实现rs直接把结果返回给客户端
ifdown lo
ifup lo
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up绑定vip到虚拟网卡lo:0上
route add -host $vip lo:0为lo:0网卡添加网关
#以下操作为更改arp内核参数,目的是为了让rs顺利发送mac地址给客户端
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
arp_ignore:定义对目标地址为本地IP的ARP询问不同的应答模式0
0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求
1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求
2 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内
3 - 不回应该网络界面的arp请求,而只对设置的唯一和连接地址做出回应
4-7 - 保留未使用
8 -不回应所有(本地地址)的arp查询
arp_announce:对网络接口上,本地IP地址的发出的,ARP回应,作出相应级别的限制: 确定不同程度的限制,宣布对来自本地源IP地址发出Arp请求的接口
0 - (默认) 在任意网络接口(eth0,eth1,lo)上的任何本地地址
1 -尽量避免不在该网络接口子网段的本地地址做出arp回应. 当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理.
2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址. 如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送.
关于对arp_announce 理解的一点补充
其实就是路由器的问题,因为路由器一般是动态学习ARP包的(一般动态配置DHCP的话),当内网的机器要发送一个到外部的ip包,那么它就会请求 路由器的Mac地址,发送一个arp请求,这个arp请求里面包括了自己的ip地址和Mac地址,而linux默认是使用ip的源ip地址作为arp里面 的源ip地址,而不是使用发送设备上面的 ,这样在lvs这样的架构下,所有发送包都是同一个VIP地址,那么arp请求就会包括VIP地址和设备 Mac,而路由器收到这个arp请求就会更新自己的arp缓存,这样就会造成ip欺骗了,VIP被抢夺,所以就会有问题。
arp缓存为什么会更新了,什么时候会更新呢,为了减少arp请求的次数,当主机接收到询问自己的arp请求的时候,就会把源ip和源Mac放入自 己的arp表里面,方便接下来的通讯。如果收到不是询问自己的包(arp是广播的,所有人都收到),就会丢掉,这样不会造成arp表里面无用数据太多导致 有用的记录被删除。
在设置参数的时候将arp_ignore 设置为1,意味着当别人的arp请求过来的时候,如果接收的设备上面没有这个ip,就不做出响应,默认是0,只要这台机器上面任何一个设备上面有这个ip,就响应arp请求,并发送mac地址
例子:
#/bin/bash
vip=192.168.152.200
ifdown lo
ifup lo
ifconfig lo:0 $vip broadcast $vip netmask 255.255.255.255 up
route add -host $vip lo:0
echo "1" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "1" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "2" >/proc/sys/net/ipv4/conf/all/arp_announce
2、给脚本设权
[root@c.qfedu.com ~]# chmod 755 /usr/local/sbin/lvs_rs.sh
3、执行脚本
[root@c.qfedu.com ~]# sh /usr/local/sbin/lvs_rs.sh
4、查看路由上的 vip
[root@c.qfedu.com ~]# route -n
5、查看网卡 lo 上的 vip
[root@c.qfedu.com ~]# ip addr
4、测试
浏览器里访问192.168.31.200,(vip:vitrual ip)多刷新几次看结果,服务器的切换。
浏览器上因为有本地缓存的原因,虽已经设定了登陆保持时限为1秒,但每次刷新都会保持在real server 2主机上。可以在调度机里用 curl 192.168.31.200 测试访问,调度算法采用rr,效果更明显。
1、用 ipvsadm 命令查看转发规则
[root@a.qfedu.com ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.31.200:80 wrr
-> 192.168.31.129:80 Route 1 0 4
-> 192.168.31.130:80 Route 1 0 5
# ActiveConn是活动连接数,也就是tcp连接状态的ESTABLISHED;InActConn是指除了ESTABLISHED以外的,所有的其它状态的tcp连接
2、查看 iptables nat 链的转发规则
[root@a.qfedu.com ~]# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 89 packets, 13284 bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 40 packets, 4692 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 7 packets, 2296 bytes)
pkts bytes target prot opt in out source destination
48 3648 MASQUERADE all -- * * 192.168.31.0/24 0.0.0.0/0
总结
- NAT模式:适用于简单的负载均衡场景,所有流量都经过负载均衡器,容易实现和管理。但是扩展性有限,因为负载均衡器可能成为瓶颈。
- DR模式:适用于需要高性能和高可用性的场景,流量直接到达后端服务器,减少了负载均衡器的负担。但是配置相对复杂,需要保证VIP在各服务器之间的同步。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)