LVS-DR(Virtual Server via Direct Routing)原理说明与配置用例

LVS-DR(Virtual Server via Direct Routing)原理说明与配置用例

LVS-NAT(Virtual Server via NAT)原理说明与配置用例



LVS-DR模式是如何工作的?





用户请求负载均衡服务器(LinuxDirector),当数据封包(数据帧)到达负载均衡服务器后,负载均衡服务器根据调度算法选出一台真实服务器,将数据帧的MAC地址改写为真实服务器的MAC地址,然后发送出去,交换机会根据MAC地址将数据封包发送给真实服务器,真实服务器将处理完的结果直接返回给客户端。


是否感到困惑?让我们用一个实验来理解吧!

注意:在测试之前一定先关闭防火墙

注意:LVS负责均衡服务器与真实服务器必须在相同网段(因为转发是基于数据链层的),客户端随意。

真实服务器  

mac 00:0c:29:4e:80:4a     192.168.80.135:8080

mac 00:0c:29:c6:4e:63     192.168.80.136:8080

负载均衡服务器

mac 00:0c:29:16:0a:e1     192.168.80.138:8080

客户端

mac 00-50-56-C0-00-08    192.168.80.1

网络拓扑图如下:



@1 客户端访问负载均衡服务器192.168.80.138:8080,数据包是下面这样的。


原MAC目标MAC原IP原端口目标IP目标端口
00-50-56-C0-00-0800:0C:29:16:0A:E1192.168.80.159345192.168.80.1388080




@2 负责均衡服务器收到数据包后,根据调度算法选择一台真实服务器(假设选了192.168.80.136 00:0c:29:c6:4e:63),接下来将数据帧的目标MAC地址修改为192.168.80.136的MAC地址00:0c:29:c6:4e:63,将原MAC修改为自己的MAC,然后把数据包发出去,数据包是下面这样的。

  

原MAC目标MAC原IP原端口目标IP目标端口
00:0C:29:16:0A:E100:0C:29:C6:4E:63192.168.80.159345192.168.80.1388080

注意:可以看到LVS只修改 (原MAC) 与 (目标MAC),而目标IP地址并没有被修改,那么当数据包由交换机发送给(192.168.80.136)这台服务器的时候,136这台服务器的网卡会检查目标IP地址是否属于自己本机P地址,如果不是的话就会拒绝处理这个数据包,为了解决这个问题,我们需要在每台真实服务器的环回网卡上配置(192.168.80.138)这个IP为自己的本机IP,这样就可以处理数据包了。




@3 根据数据链层的转发规则,交换机会根据数据帧的mac地址将数据包转发给192.168.80.136   00:0C:29:C6:4E:63,由它来处理用户的请求,处理完成后把数据包直接发送给客户端,数据包如下。



@4 整个的TCP请求数据包抓包,可以看到,由192.168.80.1 发往 192.168.80.138的数据包都是成对出现的,这就是因为LVS收到数据包以后修改了MAC地址再次把数据包发送跟真实服务器,所以数据包全都是成对出现的,每一对数据包只有MAC地址不同。



在CentOS上安装与配置LVS负载均衡

1、在138服务器安装ipvsamd   yum install ipvsadm   可以参考  http://blog.csdn.net/nimasike/article/details/51932674

2、关闭所有机器的防火墙,测试时先关闭,测试通过后在开启固定端口。

3、在LVS负载均衡服务器添加转发规则列表。
添加一个虚拟服务并制定调度算法     -A 添加  -t IP与端口 -s 调度算法一共8种
注意:端口一定要与后端服务器端口一一致,因为转发包只修改MAC地址,目标端口不会修改。
ipvsadm -A -t 192.168.80.138:8080 -s rr  

添加后端服务器, -g 为DR模式
ipvsadm -a -t 192.168.80.138:8080 -r 192.168.80.135:8080 -g -w 1
ipvsadm -a -t 192.168.80.138:8080 -r 192.168.80.136:8080 -g -w 1

ipvsadm -S -n 查配置



4、由于我们没有使用VIP,而是直接使用了负载均衡服务器的真实IP,所以需要在LVS负载服务器配置真实服务器的MAC地址。

arp -s 192.168.80.135 00:0c:29:4e:80:4a
arp -s 192.168.80.136 00:0c:29:c6:4e:63

因为138会发送arp请求,询问135或136的mac地址,但由于138配置在了135和136的换回地址上,所以他们不会应答ARP。

相反,如果配置了VIP  那么135和136 的换回地址配置的是VIP,那么138在发送ARP请求,真实服务器就会应答。 


备注:上面的设置重启失效,如果希望重启后仍然有效则需要添加一个配置文件

vim /etc/ethers  没有就添加一个。

00:0c:29:4e:80:4a 192.168.80.135
00:0c:29:c6:4e:63 192.168.80.136
然后修改 /etc/rc.d/rc.local 这个文件,添加 arp -f 这句话, 最后给文件可执行权限 chmod +x /etc/rc.d/rc.local


可以arp -e看mac地址




5、将192.168.80.138这个IP 配置为真实服务器的换回地址,并设置ARP应答抑制。

启动 ./lvs_real.sh start

停止 ./lvs_real.sh stop

#!/bin/bash  
#description : start realserver
VIP=192.168.80.138
/etc/rc.d/init.d/functions
case "$1" in
start)
echo " start LVS of REALServer"
/sbin/ifconfig lo:0 $VIP broadcast $VIP netmask 255.255.255.255 up
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
;;
stop)
/sbin/ifconfig lo:0 down
echo "close LVS Directorserver"
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/lo/arp_announce
echo "0" >/proc/sys/net/ipv4/conf/all/arp_ignore
echo "0" >/proc/sys/net/ipv4/conf/all/arp_announce
;;
*)
echo "Usage: $0 {start|stop}"
exit 1
esac


arp_ignore  参数是定义linux主机在收到ARP请求数据包后,发送ARP响应数据包的条件级别,该参数的取值范围是0~8,各取值的意义分别是:

0(默认值)-- 只要ARP请求数据包所请求的IP地址属于任一本地地址(即任意一个本机配置的IP地址),就会回应ARP响应数据包,即使该IP地址不属于接收到ARP请求数据包的网卡。
1 -- 只有ARP请求数据包所请求的IP地址属于当前网卡的IP地址,才会回应ARP响应数据包。

2 -- 除了满足1的条件外,还要满足ARP请求数据包的发送方IP地址也属于当前网卡所属子网,这样才会回应ARP响应数据包。

4~7 -- 保留

8 -- 即使ARP请求数据所请求的IP地址属于任何一个本地地址,也不回应ARP响应数据包。

我们设置为1:因为我们把192.168.80.138这个IP设置真实服务器为lo口的环回地址,不能让他应答ARP请求,不然会导致ARP错乱。


arp_announce 默认情况下,它发出去的数据包的原IP地址是138,在发包之前它会先通过ARP请求到客户端的MAC地址,在发送ARP请求数据包的时候,里面的IP地址会用138这个地址,这样就会导致其它主机记录错误的MAC地址列表,实际应该用136这个IP去发送ARP请求。

举个例子:

假设linux主机有A、B两块网卡,其对应的IP地址分别为IP_A、IP_B,对应的MAC地址为MAC_A、MAC_B,假设一个应用程序准备与外部通信,它的socket绑定了源IP地址为IP_A,但是根据系统路由及相关设置,其通信数据包将会从B网卡发送,在发送数据包前,系统会通过网卡B发送ARP请求数据包。如果我们将arp_announce的值设定为0,那该ARP请求数据包的发送方IP地址是IP_A,而发送方MAC地址为MAC_B,这样就会在网络设备或对方主机的ARP地址表上留下IP_A与MAC_B的对应记录,但是实际正确的应该是IP_A对应MAC_A、IP_B对应MAC_B,所以这可能会引起潜在的网络问题,具体问题和表现与网络的拓扑结构及网络配置有关。而如果我们将arp_announce设置为2,那在发送ARP请求数据包时,发送方IP地址将不是IP_A,而是IP_B,这样就不会引起刚才所说的问题。至于arp_announce=1的情景,我还不是很清楚,所以无法举出具体的例子。

所以我们设置为2:这样在发送ARP请求时 虽然原IP用的是138  但实际ARP请求里写的IP是 真实服务器的IP。


6、访问http://192.168.80.138:8080/ 就可以进行负载均衡访问了,可以看到数据包被分发到真实服务器节点上了。



7、通过ipvsadm 命令添加的转发规则列表在重启后会失效,我们可以将其保存到配置文件中

ipvsadm-save -n > /etc/sysconfig/ipvsadm  将配置保存到文件中。

我们还可以做成启动服务,让系统开启自动加载配置文件。(CentOS7),其它版本原理类似。

vim  /lib/systemd/system/ipvsadm.service

[Unit]
Description=Initialise the Linux Virtual Server
After=syslog.target network.target

[Service]
Type=oneshot
ExecStart=/bin/bash -c "exec /sbin/ipvsadm-restore < /etc/sysconfig/ipvsadm"
#ExecStop=/bin/bash -c "exec /sbin/ipvsadm-save -n > /etc/sysconfig/ipvsadm"
ExecStop=/sbin/ipvsadm -C
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target



技术交流群:212320390

ifconfig eno16777736:0 192.168.80.138 netmask 255.255.255.255 broadcast  192.168.80.255 up

参考文章:

LVS-DR模式官方文档: http://www.linuxvirtualserver.org/VS-DRouting.html

ARP协议: http://blog.chinaunix.net/uid-13423994-id-5146098.html


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值