一、负载均衡与反向代理的区别
1.1 功能(原理)
- 负载均衡lvs---请求做转发
- 反向代理Nginx Haproxy代替(代理)用户去请求,得到相应再返回给用户
1.2 4层 vs 7层
OSI 7层模型 | 相关内容 |
---|---|
应用层 | 协议:http、https |
表示层 | |
会话层 | |
传输层 | tcp/udp 端口 |
网络层 | ip地址 |
数据链路层 | MAC地址 |
物理层 | 0010101、网线设备 |
- 4层 LVS nginx(1.9)、haproxy
- 7层 nginx(1.9)、haproxy
二、ARP协议
2.1 ARP基础知识
DNS 域名-----解析---->ip地址(域名解析服务/系统 Domain Name Service/System)
ARP ip--------解析---->MAC地址
2.2 ARP解析过程
1>发出广播消息,查询ip对应的MAC地址
2>对应的机器会用单播的方式把自己的MAC地址告诉对方
3>用户自己留1个ARP缓存
2.3 arp解析过程-抓包
[root@m01 ~]# arp -d 10.0.0.51
[root@m01 ~]# arp -n
Address HWtype HWaddress Flags Mask Iface
10.0.0.51 ether 00:0c:29:37:ad:94 C eth0
10.0.0.254 ether 00:50:56:e2:d2:d2 C eth0
172.16.1.51 ether 00:0c:29:01:43:c3 C eth1
10.0.0.1 ether 00:50:56:c0:00:08 C eth0
[root@m01 ~]# ping 10.0.0.51 -c 1
PING 10.0.0.51 (10.0.0.51) 56(84) bytes of data.
64 bytes from 10.0.0.51: icmp_seq=1 ttl=64 time=1.22 ms
--- 10.0.0.51 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 1.225/1.225/1.225/0.000 ms
Linux中抓包显示:arp解析过程
在m01上安装wireshark:yum install -y wireshark
[root@m01 ~]# tshark -i eth1 -f arp
Running as user "root" and group "root". This could be dangerous.
Capturing on 'eth1'
1 0.000000000 Vmware_46:1a:d7 -> Broadcast ARP 42 Who has 172.16.1.51?
Tell 172.16.1.61
2 0.000242395 Vmware_37:ad:9e -> Vmware_46:1a:d7 ARP 60 172.16.1.51 is at
00:0c:29:37:ad:9e
3 5.016325835 Vmware_37:ad:9e -> Vmware_46:1a:d7 ARP 60 Who has
172.16.1.61? Tell 172.16.1.51
4 5.016345052 Vmware_46:1a:d7 -> Vmware_37:ad:9e ARP 42 172.16.1.61 is at
00:0c:29:46:1a:d7
tshark(Wireshark)参数:
-i 指定网卡 默认第1个网卡(非lo)
-f 指定过滤规则
-w 保存抓包的内容到文件中
抓包过滤语法 man wireshark-filter
问题: arp协议 3层?2层?
ip --- > mac
arp三层协议 工作在2层 3层ip----->2层mac地址
2.4 ARP病毒,欺骗故障
2.4.1 原理
2.4.2 预防
1>mac地址与ip地址绑定
2>使用企业安全软件
三、LVS相关名词
相关名词 | 含义 |
---|---|
CIP | Client IP |
VIP | Virtual IP |
DIP | Director 负载均衡IP |
RS服务器 | Real Server 真实服务器 |
RIP | Real Server IP地址 |
四、LVS 4个模式
LVS(Linux Virtual Sercer)是由章文嵩发明的;
lvs太强大,被写入到Linux内核中,叫ip_vs;
通过:keepalived(配置文件)或ipvsadm (命令)来控制
中文官网:http://zh.linuxvirtualserver.org/
4.1 DR模式(直接路由模式)<u>性能最好</u>
4.1.1 原理
4.1.2 特点
- lvs dr模式中 负责修改目标IP(VIP)mac地址 改为后端RS服务器的mac
- dr模式中 lvs主要处理用户的请求,响应通过后端rs服务器直接给用户
- LVS 与 后端RS服务器要在同一个局域网(网段)
- DR模式中 RS服务器公网ip地址
- 需要注意RS节点的VIP的绑定(lo:vip/32)和ARP抑制问题。
- 由于DR模式的调度器仅进行了目的MAC地址的改写,因此,调度器LB无法改变请求报文的目的端
口。LVS DR模式的办公室在二层数据链路层(MAC),NAT模式则工作在三层网络层(IP)和四
层传输层(端口)。
4.2 NAT模式(网络地址映射)
4.2.1 原理
4.2.2 特点
- NAT (Network Address Translation):网络地址转换
- 开启内核转发功能net.ipv4.ip_forward=1 #/etc/sysctl.conf
- NAT模式中,可以实现端口转发。如请求80,后端转发为8080
- lvs与后算RS服务器,可以不在一个局域网中
4.3 TUN隧道模式
4.4 FULL NAT模式
五、DR模式
5.1 环境准备
主机名 | 外网eth0 | 内网eth1 |
---|---|---|
lb01 | 10.0.0.5 | 172.16.1.5 |
lb02 | 10.0.0.6 | 172.16.1.6 |
web01 | 10.0.0.7 | 172.16.1.7 |
web02 | 10.0.0.8 | 172.16.1.8 |
5.2 在lb01和lb02上安装ipvsadm
注:如果有nginx和keepalived,请关闭nginx和keepalived,否则会冲突
yum install -y ipvsadm
5.3 在web01和web02上安装nginx,并配置oldboy.html
[root@web01 ~]# cat /usr/share/nginx/html/oldboy.html
web01 10.0.0.7
[root@web02 ~]# cat /usr/share/nginx/html/oldboy.html
web02 10.0.0.8
[root@web01 ~]# curl 10.0.0.[7-8]/oldboy.html
[1/2]: 10.0.0.7/oldboy.html --> <stdout>
--_curl_--10.0.0.7/oldboy.html
web01 10.0.0.7
[2/2]: 10.0.0.8/oldboy.html --> <stdout>
--_curl_--10.0.0.8/oldboy.html
web02 10.0.0.8
[root@web01 ~]#
5.4 DR模式部署
5.4.1 LVS配置
加载内核模块
modprobe ip_vs #直接运行ipvsadm -ln
1>在lb01上添加临时ip
[root@lb01 ~]# ip a add 10.0.0.3/24 dev eth0 label eth0:0
[root@lb01 ~]# ip a s eth0
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:3f:03:e3 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.5/24 brd 10.0.0.255 scope global eth0
valid_lft forever preferred_lft forever
inet 10.0.0.3/24 scope global secondary eth0:0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe3f:3e3/64 scope link
valid_lft forever preferred_lft forever
2>设置tcp超时时间
[root@lb01 ~]# ipvsadm --set 30 5 60
3>添加10.0.0.3的池塘
[root@lb01 ~]# ipvsadm -A -t 10.0.0.3:80 -s wrr -p 20
[root@lb01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.3:80 wrr persistent 20
4>给10.0.0.3的池塘添加规则
[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
[root@lb01 ~]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.3:80 wrr persistent 20
-> 10.0.0.7:80 Route 1 0 0
-> 10.0.0.8:80 Route 1 0 0
ipvsadm参数 | 含义 | 举例 |
---|---|---|
-C | 清除所有规则 | ipvsadm -C |
-A | 相当于nginx中创建池塘 | |
-t | 使用tcp协议 | |
-s | 轮询算法rr(普通轮询)、wrr(加权轮询) | |
-p | 会话保持的时间20秒,默认300秒 | |
-a | 添加RS服务器,相当于nginx中的server | |
-r | 指定RS服务器的ip | |
-g | 相当于--gatewaing,使用DR(Directing Routing)模式 | |
-w | weight权重 | |
-ln | 显示规则 | ipvsadm -ln |
lvs规则的配置备份(注意)
上面设置的内容ipvsadm -C
之后,就会被清除掉,估将这些配置要保存下来用ipvsadm-save -n
,然后导出到一个文件中,这样不小心清除了,可以用ipvsadm-restore
进行恢复
[root@lb01 ~]# ipvsadm-save -n \\将进行的配合进行保存
-A -t 10.0.0.3:80 -s wrr -p 20
-a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1
-a -t 10.0.0.3:80 -r 10.0.0.8:80 -g -w 1
\\将配置的内容导出到ipvsadm.rules文件中
[root@lb01 ~]# ipvsadm-save -n >/root/ipvsadm.rules
[root@lb01 ~]# ll
total 8
-rw-r--r-- 1 root root 113 Jul 4 17:01 ipvsadm.rules
[root@lb01 ~]# ipvsadm -C \\不小心清空规则
[root@lb01 ~]# ipvsadm -ln \\查看规则
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
[root@lb01 ~]# ipvsadm-restore</root/ipvsadm.rules \\恢复规则
[root@lb01 ~]# ipvsadm -ln \\查看规则
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 10.0.0.3:80 wrr persistent 20
-> 10.0.0.7:80 Route 1 0 0
-> 10.0.0.8:80 Route 1 0 0
[root@lb01 ~]#
5.4.2 RS服务器配置(web01和web02)
1>在web01和web02上都添加一个ip,绑定到lo
ip a add 10.0.0.3/32 dev lo label lo:1
2>在web01和web02上都配置抑制ip解析
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
这样lvs的dr模式就搭建完成了
5.4.3 测试lvs
1>注意事项:
- 不要在lvs本地进行测试
- lvs使用在高并发,访问量巨大的时候,估访问量和用户量比较高,请求比例才会接近1:1,不像nginx(应用场景)
2>抓包测试
通过抓包可以看出请求和响应的时候,修改的是mac地址,端口并没有发生变化