需要设备:三台VMWare虚拟机
分别为
node11-lvs(192.168.186.11)
node10(192.168.186.10)
node20(192.168.186.20)
虚拟机下LVS四层负载之DR模型的一个发包流程。
实战
为lvs服务器添加一个负载VIP
[root@node11-lvs ~]# ifconfig ens33:100 192.168.186.100/24
[root@node11-lvs ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:65:68:01 brd ff:ff:ff:ff:ff:ff
inet 192.168.186.11/24 brd 192.168.186.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet 192.168.186.100/24 brd 192.168.186.255 scope global secondary ens33:100
valid_lft forever preferred_lft forever
inet6 fe80::181b:1c30:bf89:8fa1/64 scope link tentative noprefixroute dadfailed
valid_lft forever preferred_lft forever
inet6 fe80::3ae7:833d:de3c:47c1/64 scope link noprefixroute
valid_lft forever preferred_lft forever
修改两个被负载节点的arp协议参数,添加隐藏VIP
隐藏VIP方法:对外隐藏,对内可见 :
kernel parameter:
目标mac地址为全F,交换机触发广播
/proc/sys/net/ipv4/conf/*IF*/
arp_ignore: 定义接收到ARP请求时的响应级别;
0:只要本地配置的有相应地址,就给予响应;
1:仅在请求的目标(MAC)地址配置请求
到达的接口上的时候,才给予响应;
arp_announce:定义将自己地址向外通告时的通告级别;
0:将本地任何接口上的任何地址向外通告;
1:试图仅向目标网络通告与其网络匹配的地址;
2:仅向与本地接口上地址匹配的网络进行通告;
两台节点分别执行
[root@node10 ens33]# echo 1 > /proc/sys/net/ipv4/conf/ens33/arp_ignore
[root@node10 ens33]# echo 2 > /proc/sys/net/ipv4/conf/ens33/arp_announce
[root@node10 ens33]# ifconfig lo:100 192.168.186.100 netmask 255.255.255.255
[root@node10 ens33]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet 192.168.186.100/32 scope global lo:100
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
解释一下这里的操作:
echo 1 > /proc/sys/net/ipv4/conf/ens33/arp_ignore 这个操作的目的是将网卡ens33的arp_ignore参数改为1,仅在请求的目标(MAC)地址配置请求到达的接口上的时候,才给予响应。也就是说,只有当lvs将包的目标mac地址转为被负载节点的mac地址时,实际节点时会进行响应的。而DR模式就是将负载的包下一跳MAC转为实际的目标MAC地址。
echo 2 > /proc/sys/net/ipv4/conf/ens33/arp_announce 这个操作目的是将网卡ens33的arp_announce参数改为2,仅向与本地接口上地址匹配的网络进行通告,隐藏环回接口,避免ip冲突。
ifconfig lo:100 192.168.186.100 netmask 255.255.255.255 为该节点添加隐藏IP192.168.186.100,使得访问192.168.186.100的包发送到这台节点时可以进行响应。掩码配置为255.255.255.255,是为了避免192.168.186.0冲突,如果配置为255.255.255.0,那么所有192.168.186.x号段的出向包在与掩码作&运算后都跳到了环回接口 192.168.186.100上,接收者仍然是自己,包出不去。
同样的操作在两台上面都执行一边。
在两台服务节点上安装服务,使用httpd启动一个简单的页面
#安装httpd
yum install -y httpd
#编写页面
vi /var/www/html/index.html
#内容编辑本节点IP 以作区分
192.168.186.10
启动httpd:
systemctl start httpd
安装完后访问http://192.168.186.10
为LVS服务器安装lvs调用程序ipvsadm 并设置规则
安装ipvsadm
yum install ipvsadm -y
配置监听端口,以轮询的方式转发
[root@node11-lvs ~]# ipvsadm -A -t 192.168.186.100:80 -s rr
添加负载节点,192.168.186.100:80 -> 192.168.186.10,以DR模式转发 权重为1
[root@node11-lvs ~]# ipvsadm -a -t 192.168.186.100:80 -r 192.168.186.10 -g -w 1
添加负载节点,192.168.186.100:80 -> 192.168.186.20,以DR模式转发 权重为1
[root@node11-lvs ~]# ipvsadm -a -t 192.168.186.100:80 -r 192.168.186.20 -g -w 1
测试 http://192.168.186.100
查看LVS窥探传输层的记录
[root@node11-lvs ~]# ipvsadm -lnc
IPVS connection entries
pro expire state source virtual destination
TCP 01:45 FIN_WAIT 192.168.186.1:56447 192.168.186.100:80 192.168.186.10:80
TCP 01:45 FIN_WAIT 192.168.186.1:56448 192.168.186.100:80 192.168.186.20:80
TCP 01:21 FIN_WAIT 192.168.186.1:56438 192.168.186.100:80 192.168.186.10:80
TCP 14:58 ESTABLISHED 192.168.186.1:56450 192.168.186.100:80 192.168.186.10:80
TCP 01:27 FIN_WAIT 192.168.186.1:56437 192.168.186.100:80 192.168.186.20:80
TCP 14:58 ESTABLISHED 192.168.186.1:56453 192.168.186.100:80 192.168.186.10:80
TCP 01:27 FIN_WAIT 192.168.186.1:56440 192.168.186.100:80 192.168.186.20:80
TCP 01:55 FIN_WAIT 192.168.186.1:56451 192.168.186.100:80 192.168.186.20:80
down其中一台的场景
down以后多次请求,查看窥探记录
[root@node10 ens33]# ifconfig lo:100 down
出现SYN_RECV包,说明LVS将包转发出去以后,服务端并没有响应到请求端,所以请求端的确认包无法发送到LVS
[root@node11-lvs ~]# ipvsadm -lnc
IPVS connection entries
pro expire state source virtual destination
TCP 01:53 FIN_WAIT 192.168.186.1:56568 192.168.186.100:80 192.168.186.20:80
TCP 00:52 SYN_RECV 192.168.186.1:56567 192.168.186.100:80 192.168.186.10:80
TCP 14:59 ESTABLISHED 192.168.186.1:56572 192.168.186.100:80 192.168.186.20:80
TCP 00:56 SYN_RECV 192.168.186.1:56571 192.168.186.100:80 192.168.186.10:80