1. 核心内容

2. arp

2.1 arp解析过程

2.2 linux的arp缓存查看命令

1
arp -n   # 若无此命令,则需要安装 net-tools

2.3 手动缓存其他设备的mac地址,只需手动在该设备上ping对应设备的IP地址

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[root@lb01 ~]# arp -n
Address HWtype HWaddress Flags Mask Iface
10.0.0.1 ether 00:50:56:c0:00:08 C eth0
10.0.0.254 ether 00:50:56:f2:d4:34 C eth0
[root@lb01 ~]# ping 10.0.0.7
PING 10.0.0.7 (10.0.0.7) 56(84) bytes of data.
64 bytes from 10.0.0.7: icmp_seq=1 ttl=64 time=3.37 ms
64 bytes from 10.0.0.7: icmp_seq=2 ttl=64 time=1.27 ms
^C
--- 10.0.0.7 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 1.272/2.324/3.376/1.052 ms
[root@lb01 ~]# arp -n
Address HWtype HWaddress Flags Mask Iface
10.0.0.1 ether 00:50:56:c0:00:08 C eth0
10.0.0.7 ether 00:0c:29:8e:5d:df C eth0
10.0.0.254 ether 00:50:56:f2:d4:34 C eth0
[root@lb01 ~]#

2.4 通过抓包查看缓存mac地址过程

1
2
3
4
Vmware_86:09:1d	Broadcast	    ARP	60	Who has 10.0.0.7? Tell 10.0.0.5 #Broadcast为广播
Vmware_8e:5d:df Vmware_86:09:1d ARP 60 10.0.0.7 is at 00:0c:29:8e:5d:df
Vmware_c0:00:08 Vmware_86:09:1d ARP 42 Who has 10.0.0.5? Tell 10.0.0.1
Vmware_86:09:1d Vmware_c0:00:08 ARP 60 10.0.0.5 is at 00:0c:29:86:09:1d

5问:谁有7的mac地址?

7回:我有,地址是…….

7问:谁有5的mac地址?

5回:我有,地址是……

说明:第一次讯问为广播,一旦有回应之后,则进行缓存,下次再讯问则不是广播,而是直接按照缓存去一对一连接。

2.5 删除arp 缓存命令

1
2
# arp -d ip地址,例如:
arp -d 10.0.0.7

2.6 arp欺骗

3. lvs

4. lvs的工作模式

4.1 预备知识

4.2 nat模式

4.3 dr模式

4.4 dr模式环境准备

4.4.1 配置web01、web02
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# web01要能够访问http://10.0.0.7/oldboy.html
# web02要能够访问http://10.0.0.8/oldboy.html
[root@web01 ~]# cat /etc/nginx/nginx.conf
worker_processes 1;
events {
worker_connections 1024;
}
http{
server {
server_name www.oldboy.com;
listen 80;
root /usr/share/nginx/html/ ;
}
}

# 在oldboy.html中写入主机名
[root@web01 ~]# echo 'hostname' >/usr/share/nginx/html/oldboy.html

# 关闭nginx
[root@web01 ~]# pkill nginx

# 重启nginx
[root@web01 ~]# systemctl restart nginx
4.4.2 配置lb01、lb02
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 关闭lb01、lb02的keeplived  nginx负载均衡
[root@lb01 ~]# systemctl stop keepalived nginx
[root@lb01 ~]# systemctl disable keepalived nginx

# lb01安装ipvsadm
[root@lb01 ~]# yum install -y ipvsadm

# lb01手动添加vip
[root@lb01 ~]# ip addr add 10.0.0.3/24 dev eth0 label eth:0

# lb01手动添加池塘
[root@lb01 ~]# ipvsadm -A -t 10.0.0.3:80 -s wrr -p 20
#参数:-A 创建池塘(VIP:端口) -t tcp协议 -s 轮询算法 wrr 加强轮询 -p 会话保持时间,默认是300秒

# lb01手动添加RS服务器
[root@lb01 ~]# ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1
[root@lb01 ~]# ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.8:80 -g -w 1
# 参数:-a 添加RS服务器 -t tcp协议 -r 指定RS服务器(IP:端口) -g dr模式 -w 权重

# lb01查看ipvs规则
[root@lb01 ~]# ipvsadm -Ln #注意:与iptables进行区分(-nL)

# lb01查看ipvs规则及详细信息(查看具体流量信息)
[root@lb01 ~]# ipvsadm -Ln --stats

# 清空ipvs规则命令
[root@lb01 ~]# ipvsadm -C

# 设置tcp超时时间
[root@lb01 ~]# ipvsadm --set 30 # 常用超时时间为30 5 60

# 注意:ipvsadm是linux管理ip_vs的命令,无需启动操作,直接使用。
4.4.3 配置RS服务器(web)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# 所有RS服务器lo网卡绑定vip(永久)
[root@web01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-lo:1
DEVICE=lo:1
IPADDR=10.0.0.3
NETMASK=255.255.255.255
ONBOOT=yes
NAME=loopback

# 所有RS服务器抑制arp解析
cat >>/etc/sysctl.conf<<EOF
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.lo.arp_announce = 2 EOF

# 配置生效
sysctl -p

# RS服务器检查lo网卡
[root@web01 ~]# ip a s lo

# 注意:
# 1. 不要在lvs服务器本地进行curl测试,会失败;
# 2. lvs负载均衡当用户与访问量巨大的时候,才会使各个RS服务器的分配接近1:1,而平时测试访问量小的时 候,会长时间分配在同1台RS服务器上,要等1-2分钟才会变。

# 此时可以通过浏览器访问VIP网页测试
# 如访问失败,故障排查流程:
# 1. 浏览器通过负载均衡访问 10.0.0.3/oldboy.html
# 2. RS服务器通过ping/telnet连接负载均衡,查看是否成功
# 3. 在RS服务器上通过命令行curl 负载均衡vip网址
# 4. 浏览器单独访问RS服务器 RIP地址的网页,查看是否能正常访问
# 5. 查看RS服务器配置是否正确
4.4.4 lvs规则的备份与恢复
1
2
3
4
5
6
7
8
# 将ipvs规则打印到屏幕上
[root@lb01 ~]# ipvsadm-save -n

# 将ipvs规则保存到文件
[root@lb01 ~]# ipvsadm-save -n >/root/ipvsadm.conf

# 将ipvs规则从文件恢复
[root@lb01 ~]# ipvsadm-restore </root/ipvsadm.conf

5. lvs与keepalived配合使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# 清除lb上手动添加的VIP,最简单的办法是重启网卡
systemctl restart network

# 配置lb01的keepalived配置文件(主)
[root@lb01 ~]# vim /etc/keepalived/keepalived.conf
global_defs {
router_id lb01 #keepalived身份 id 每个keepalived 不同
}

vrrp_instance oldboy { #实例名称 在同1对主备之间 要一致
state MASTER #MASTER BACKUP
interface eth0 #指定网卡 公网网卡
virtual_router_id 62 #虚拟路由id 同1对 主备之间要一致 在同1个keepalived文件中要不同
priority 100 #优先级 主>备 相差50
advert_int 1 #interval 间隔 心跳间隔 秒 每隔1秒检查
authentication { #认证 方式
auth_type PASS #简单认证
auth_pass 1234 #在同1对 主备之间一直
}
virtual_ipaddress { #vip
10.0.0.3/24 dev eth0 label eth0:0
}
}

virtual_server 10.0.0.3 80 { #创建组 池塘
delay_loop 6
lb_algo wrr #轮询算法
lb_kind DR # lvs DR模式
nat_mask 255.255.255.0 #vip对应的子网掩码
persistence_timeout 50 #会话保持时间 -p
protocol TCP #协议 -t

real_server 10.0.0.7 80 { #rs服务器的配置
weight 1 #权重
TCP_CHECK { #-t TCP_CHECK 检查 传输层
connect_timeout 8
nb_get_retry 3 #number of get retry 重试的次数
delay_before_retry 3 #每次检查之前 等待3秒
connect_port 80 #检查端口
}
}

real_server 10.0.0.8 80 {
weight 1
TCP_CHECK {
connect_timeout 8
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}

# 重启lb01的keepalived,并查看ipvs规则
[root@lb01 ~]# systemctl restart keepalived.service
[root@lb01 ~]# ipvsadm -Ln

# 配置lb02的keepalived配置文件(备)
[root@lb02 ~]# vim /etc/keepalived/keepalived.conf
#GLOBAL CONFIGURATION 全局定义部分
global_defs {
router_id lb02 #keepalived身份 id 每个keepalived 不同
}
#VRRPD CONFIGURATION vrrp实例部分 虚拟路由冗余协议
##vrrp
vrrp_instance oldboy { #实例名称 在同1对主备之间 要一致
state BACKUP #MASTER BACKUP
interface eth0 #指定网卡 公网网卡
virtual_router_id 62 #虚拟路由id 同1对 主备之间要一致 在同1个keepalived文件中要不同
priority 50 #优先级 主>备 相差50
advert_int 1 #interval 间隔 心跳间隔 秒 每隔1秒检查
authentication { #认证 方式
auth_type PASS #简单认证
auth_pass 1234 #在同1对 主备之间一直
}
virtual_ipaddress { #vip
10.0.0.3/24 dev eth0 label eth0:0
#ip addr add 10.0.0.3/24 dev eth0 label eth0:0
}
}

virtual_server 10.0.0.3 80 { #创建组 池塘
delay_loop 6
lb_algo wrr #轮询算法
lb_kind DR # lvs DR模式
nat_mask 255.255.255.0 #vip对应的子网掩码
persistence_timeout 50 #会话保持时间 -p
protocol TCP #协议 -t

real_server 10.0.0.7 80 { #rs服务器的配置
weight 1 #权重
TCP_CHECK { #-t TCP_CHECK 检查 传输层
connect_timeout 8
nb_get_retry 3 #number of get retry 重试的次数
delay_before_retry 3 #每次检查之前 等待3秒
connect_port 80 #检查端口
}
}

real_server 10.0.0.8 80 {
weight 1
TCP_CHECK {
connect_timeout 8
nb_get_retry 3
delay_before_retry 3
connect_port 80
}
}
}

# 重启lb02的keepalived,并查看ipvs规则
[root@lb02 ~]# systemctl restart keepalived.service
[root@lb02 ~]# ipvsadm -Ln