arp -n # 若无此命令,则需要安装 net-tools
2.3 手动缓存其他设备的mac地址,只需手动在该设备上ping对应设备的IP地址
[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地址过程
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 缓存命令# arp -d ip地址,例如:
arp -d 10.0.0.7
2.6 arp欺骗
描述:A和B都连接与同一个交换机,并都通过这个交换机上网,即A和B也都缓存着这个交换机的mac地址,突然有一天B大量的发出广播“交换机的mac地址是我B设备的mac地址”,慢慢的其他设备会逐渐替换并缓存B广播的这个假消息,导致其他设备误认为B设备为交换机,导致不能上网了。
3. lvs
lvs专业名称为:linux virtual server 即linux虚拟服务器
因为lvs处理请求支持的并发特别高,以至于lvs模块嵌入到了linux内核中,即 ip_vs
管理 ip_vs 有两种方式:通过ipvsadm管理命令 和 keepalived(keepalived for lvs)
4. lvs的工作模式 dr direct routing 直接路由模式(使用较多) nat (使用较多) tun 隧道模式(使用少) full nat(使用少) 4.1 预备知识 名词 用户 用的IP地址为:CIP 负载均衡 负载均衡利用高可用软件生成的的IP地址为:VIP 负载均衡设备本身的IP地址为:DIP 真实服务器(RS服务器) 真实服务器的IP地址为:RIP 4.2 nat模式 用户访问过程: 用户发出请求时携带源IP(CIP)、目标IP(VIP)到达复杂均衡服务器,lvs执行DNAT,将用户数据包的目标IP地址修改为RIP(网络设备会保存修改记录用于相同访问使用)发给RS服务器,RS服务器收到并处理后将RIP设为源IP、CIP设为目标IP发送给lvs,lvs执行SNAT,将RS服务器发来的源IP由RIP修改为VIP,即此时的数据包源IP为VIP,目标IP为CIP,由负载均衡发给用户。 此过程只涉及IP地址,不涉及mac地址。 特点: lvs与RE服务器可以不再同一局域网 用户访问端口和后端RS服务器响应的端口可以不一致 nat模式流量出入都要经过lvs,效率、性能不高 4.3 dr模式用户访问过程:
用户发出请求时携带源IP(CIP)、目标IP(VIP)到达复杂均衡服务器,lvs将用户数据包的目标IP的mac地址修改为RS服务器的mac地址(随机选择任一台RS服务器)发给RS服务器,RS服务器收到后校对mac地址时发现与自己mac地址一致,所以接受并解封装数据包,因为所有RS服务器的lo网卡已经绑定了VIP,所以拆数据包时发现目标IP与自己绑定的VIP一致,所以RS服务器将处理结果直接发给用户。
小知识:windows中删除arp缓存方法
# 用管理员权限打开cmd
arp -d
为什么要做arp抑制
因为所有RS服务器的lo回环网卡都绑定了VIP,所以lvs服务器以及所有RS服务器都有了VIP,当用户查询具有VIP的服务器的mac地址时,如果不做抑制,则lvs服务器以及所有RS服务器都会同时响应用户的请求,这样就发生混乱导致用户不能正常访问,给所有RS服务器做arp抑制之后,用户请求时,RS服务器不会响应,仅lvs服务器响应,则用户可以正常访问。
特点
lvs dr模式中,lvs只负责转发并修改用户请求的目标mac地址,称为dmact lvs dr模式中,后端RS服务器处理完的数据直接响应给用户 lvs dr模式中,RS服务器也要有公网IP lvs dr模式中,支持更高的并发数,几万甚至几十万 lvs dr模式中,lvs服务器和后端RS服务器必须在同一个局域网 lvs dr模式中,用户请求过来的端口是不能修改的,所以后端RS服务器就要开启用户访问的端口 4.4 dr模式环境准备 4.4.1 配置web01、web02# 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
# 关闭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)
# 所有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规则的备份与恢复
# 将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配合使用
# 清除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