1.负载均衡 VS 反向代理区别
1.1 功能(原理)
- 负载均衡 lvs 请求做转发
- 反向代理 Nginx Haproxy 代替(代理)用户去请求 ,得到响应再反回给用户
1.2 4层与7层
7层协议 | ||
---|---|---|
应用层 | 协议: http https | |
表示层 | ||
会话层 | ||
传输层 | tcp/udp 端口 | |
网络层 | IP地址 | |
数据链路层**** | MAC地址 | |
物理层 | 010101001 比特 |
物理层,数据链路层,网络层,传输层的单位:
比特bit,帧frame,包packet,段segment
- 4层 LVS nginx(1.9版本支持) haproxy
- 7层 nginx haproxy
2.ARP协议
2.1 arp解析过程
https://www.cnblogs.com/csguo/p/7542944.html
DNS 域名----->ip地址 域名解析服务/系统
ARP ip------->MAC地址 地址解析协议(Address Resolution Protocol)
2.2 arp解析原理
- 发出广播消息 查询ip对应的mac地址
- 对应的机器会用单播的方式把自己的mac告诉对方
- 用户自己留1个arp缓存
- 每个主机都会在自己的 ARP 缓冲区中建立一个 ARP 列表,以表示 IP 地址和 MAC 地址之间的对应关系。
- 主机(网络接口)新加入网络时(也可能只是mac地址发生变化,接口重启等), 会发送免费ARP报文把自己IP地址与Mac地址的映射关系广播给其他主机。
- 网络上的主机接收到免费ARP报文时,会更新自己的ARP缓冲区。将新的映射关系更新到自己的ARP表中。
- 某个主机需要发送报文时,首先检查 ARP 列表中是否有对应 IP 地址的目的主机的 MAC 地址,如果有,则直接发送数据,如果没有,就向本网段的所有主机发送 ARP 数据包,该数据包包括的内容有:源主机 IP 地址,源主机 MAC 地址,目的主机的 IP 地址等。
- 当本网络的所有主机收到该 ARP 数据包时:
(A)首先检查数**据包中的 IP 地址是否是自己的 IP 地址**,如果**不是,则忽略该数据包。**
(B)如果是,则首先从数据包中取出源主机的 IP 和 MAC 地址写入到 ARP 列表中,如果已经存在,则覆盖。
(C) 然后将自己的 MAC 地址写入 ARP 响应包中,告诉源主机自己是它想要找的 MAC 地址。
- 源主机收到 ARP 响应包后。将目的主机的 IP 和 MAC 地址写入 ARP 列表,并利用此信息发送数据。如果源主机一直没有收到 ARP 响应数据包,表示 ARP 查询失败。
2.3 arp解析过程-抓包
[root@m01 ~]# arp -n
Address HWtype HWaddress Flags Mask Iface
172.16.1.51 ether 00:0c:29:c7:5d:dd C eth1
10.0.0.1 ether 00:50:56:c0:00:08 C eth0
10.0.0.254 ether 00:50:56:e1:eb:34 C eth0
[root@m01 ~]# arp -d 10.0.0.51 #删除MAC
[root@db01 ~]# ping 10.0.0.61 -c 1 #db01上ping
[root@m01 ~]# ping 10.0.0.51 -c 1 #m01上ping
2.4 Linux下抓包
arp解析过程:wireshark抓包流程
[root@m01 ~]# 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_2e:aa:48 -> Broadcast ARP 42 Who has 172.16.1.51? Tell 172.16.1.61
2 0.000263929 Vmware_c7:5d:dd -> Vmware_2e:aa:48 ARP 60 172.16.1.51 is at 00:0c:29:c7:5d:dd
[root@m01 ~]# arp -n
Address HWtype HWaddress Flags Mask Iface
172.16.1.51 ether 00:0c:29:c7:5d:dd C eth1
10.0.0.1 ether 00:50:56:c0:00:08 C eth0
10.0.0.51 ether 00:0c:29:c7:5d:d3 C eth0
10.0.0.254 ether 00:50:56:e1:eb:34 C eth0
tshark (wireshark) :
**-i ** 指定网卡 默认第1个网卡(非lo)
-f 指定过滤规则
-w 保存抓包的内容到文件中
抓包过滤语法 man wireshark-fifilter
arp欺骗
小故事源文链接:csguo
预防:
1.mac地址与ip地址绑定
2.使用企业安全软件
4. LVS介绍
LVS也叫做Linux虚拟服务器(Linux Virtual Server)创始人-章文嵩,是一个虚拟的四层交换器集群系统,根据目标地址和目标端口实现用户请求转发,本身不产生流量,只做用户请求转发,目前是负载均衡性能最好的集群系统。
相关链接:https://www.cnblogs.com/aubin/p/7718739.html
四种工作模式原理:https://blog.csdn.net/Running_free/article/details/77981201
LVS由于太nb 被写入到了Linux内核中 ip_vs
通过 keepalived(配置文件)或ipvsadm (命令)进行控制
ipvsadm ipvs admin
中国的开源软件:
Sersync
Jumpserver
MyCAT
4.1 lvs相关名词
CIP:客户端IP (client IP)
VIP:Virtual IP 向外提供服务的IP;通常此IP绑定域名
DIP:与内部主机RIP通信的IP,在Director主机上
RIP:Real Server IP;内部真正提供服务的主机
Director:负责调度集群的主机 LVS;也简称调度器、分发
VS:Virtual Server,虚拟服务器,也称为Director、
RS:Real Server(lvs),真正的服务器,集群中各节点
4.2 lvs集群的模式类型
lvs-nat:修改请求报文的目标IP,多目标IP的DNAT
lvs-dr:操纵封装新的MAC地址
lvs-tun:在原请求IP报文之外新加一个IP首部
lvs-fullnat:修改请求报文的源和目标IP
4.3LVS-DR模式(二层)
原理简述
当客户端向VIP发起请求时,[源CIP;目的VIP] 数据包通过路由器发送到Director。然后Director不修改其源IP 目的IP。经过调度后将目的MAC改为RS的MAC,RS收到数据之后发现目的IP为本机的L0接口就将其收下,然后处理数据后再将源IP改为L0目的IP为客户端CIP直接通过公网返回给客户端**
CIP--->VIP:源IP(客户端)→Director(修改为RS的mac)→目的IP(RS本地lo接口)
VIP--->CIP:源IP(RS本地lo接口)→通过公网→目的IP(客户端)
抑制RS端arp
LVS-DR模式的特点:
- LVS DR模式中 负责修改目标IP(VIP) mac地址 改为后端RS服务器的mac
- DR模式中 lvs主要处理用户的请求,响应通过后端RS服务器直接给用户
- LVS 与 后端RS服务器要在同一个局域网(网段)
- DR模式中 RS服务器要有公网ip地址
- 需要注意RS节点的VIP的绑定 (lo:vip/32) 和ARP抑制问题
- 由于DR模式的调度器仅进行了目的的MAC地址的改写,因此,调度器无法改变请求报文的目的端口。也就是说 LVS DR模式在二层数据链路层(MAC)工作,NAT模式是在三层网络层(IP)和四层传输层(端口)工作。
4.4 LVS-NAT模式(三层和四层)
原理简述
客户端向VIP发起请求连接,Director在经过调度之后选取RS,将本地端口与RS的端口做映射,然后RS返还数据Director将数据返还客户端
把客户端发来的数据包在Director调度器上将目的地址封装成其中一台RS的IP地址,并发至该RS来处理,RS处理完成后把数据包发给Director调度器,调度器再把数据包的源IP地址封装成为自己的IP,将目的地址封装成客户端IP地址,然后发给客户端。无论是进来的流量,还是出去的流量,都必须经过调度器。
CIP--->VIP--->RIP:源IP(客户端)→Director(客户端IP与RS做端口或IP映射)→目的IP(RS的IP)
RIP--->VIP--->CIP:源IP(RS的IP)→Director(将RS的IP映射为VIP)→目的IP(客户端IP)
特点:
- NAT Network Address Translation 网络地址转换
- 开启了内核转发功能 net.ipv4.ip_forward = 1 #/etc/sysctl.conf
- 通过NAT模式 可以实现 例如:端口转发 请求80 后端转发为8080
- lvs与后端RS服务器 可以不在一个局域网
4.5 LVS-TUNNEL 隧道模式
原理简述
客户端向VIP发送请求时,[源CIP;目的VIP],Director经过调度轮询后选择一个RS后使用隧道技术再次封装后向RS发送【源DIP;目的RIP [源CIP;目的VIP]】,RS通过隧道收到请求后拆开数据后得到[源CIP;目的VIP],发现目的IP为自己L0接口的IP得,后就把数据收下,找到数据后将数据直接通过公网返还给客户端[源VIP;目的CIP]
1.客户端将访问vip报文发送给LVS服务器;
2.LVS服务器将请求报文重新封装,发送给后端真实服务器;
3.后端真实服务器将请求报文解封,在确认自身有vip之后进行请求处理;
4.后端真实服务器在处理完数据请求后,直接响应客户端。
特点:
1.lvs和后端真实服务器上都要有vip。
2.不会成为瓶颈。
3.请求的报文不能太大。
优缺点:
1.快速
2.不安全,不能抵抗DOS攻击
4.6 FULL NAT转发模式
相关链接:https://blog.csdn.net/aaaaaab_/article/details/81331014
FULLNAT原理:
FULLNAT转发数据包是类似NAT模式,IN和OUT数据包都是经过LVS;唯一的区别:后端RS 或者交换机不需要做任何配置。
FULLNAT的主要原理是引入local address(内网ip地址),cip-vip转换为lip->rip,而 lip和rip均为IDC内网ip,可以跨vlan通讯
诞生原因:
在大规模的网络下,在淘宝的业务中,官方LVS满足不了需求;原因有3点,
- 刚才讲三种转发模式,部署成本比较高;
- 和商用的负载均衡比,LVS没有DDOS防御攻击功能;
- 主备部署模式,性能无法扩展;一个VIP下的流量特别大怎么办?
NAT模式与FULLNAT模式对比
相比NAT模式,FullNAT多了一个Local IP,IP地址转换时,源和目的IP都改了,即SNAT+DNAT。
图一为NAT模式 图二为FULLNAT模式
FULLNAT模式的优缺点:
FULLNAT一个最大的问题是:RS无法获得用户IP;为了解决这个问题我们提出了TOA的概念,主要原理是:将client address放到了TCP Option里面带给后端RS,RS上通过toa内核模块hack了getname函数,给用户态返回TCP Option中的client ip。
fullnat模式和nat模式相似,但是与nat不同的是nat模式只做了两次地址转换,fullnat模式却做了四次。
本地环回接口(或地址),亦称回送地址(loopback address)。
此类接口是应用最为广泛的一种虚接口,几乎在每台路由器上都会使用。常见于如下用途:
1 、作为一台路由器的管理地址
系统管理员完成网络规划之后,为了方便管理,会为每一台路由器创建一个loopback 接口,并在该接口上单独指定一个IP 地址作为管理地址,管理员会使用该地址对路由器远程登录(telnet ),该地址实际上起到了类似设备名称一类的功能。
但是通常每台路由器上存在众多接口和地址,为何不从当中随便挑选一个呢?
原因如下:由于telnet 命令使用TCP 报文,会存在如下情况:路由器的某一个接口由于故障down 掉了,但是其他的接口却仍旧可以telnet ,也就是说,到达这台路由器的TCP 连接依旧存在。所以选择的telnet 地址必须是永远也不会down 掉的,而虚接口恰好满足此类要求。由于此类接口没有与对端互联互通的需求,所以为了节约地址资源,loopback 接口的地址通常指定为32 位掩码。2 、使用该接口地址作为动态路由协议OSPF 、BGP 的router id 动态路由协议OSPF 、BGP 在运行过程中需要为该协议指定一个Router id ,作为此路由器的唯一标识,并要求在整个自治系统内唯一。由于routerid 是一个32 位的无符号整数,这一点与IP 地址十分相像。而且IP 地址是不会出现重复现象的,所以通常将路由器的router id 指定为与该设备上的某个接口的地址相同。由于loopback 接口的IP 地址通常被视为路由器的标识,所以也就成了router id 的最佳选择。
3、使用该接口地址作为BGP 建立TCP 连接的源地址
在BGP 协议中,两个运行BGP 的路由器之间建立邻居关系是通过TCP 建立连接完成的。
在配置邻居时通常指定loopback 接口为建立TCP 连接的源地址
5.LVS-DR模式搭建
5.1 准备环境
机器主机名 | ip eth0 | ip 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 |
lb01 lb02上下载软件
yum install -y ipvsadm
#关闭nginx负载均衡与keepalived
systemctl stop nginx.service keepalived.service systemctl disable nginx.service keepalived.service
web01 web02配置
#添加静态页面 curl 10.0.0.[7-8]/indexl.html web01 web02
为web01和web02配置nginx文件(配置相同)
[root@web01 ~]# cat /etc/nginx/nginx.conf #查看
user nginx;
worker_processes 1;
error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
#tcp_nopush on;
keepalive_timeout 65;
#gzip on;
include /etc/nginx/conf.d/*.conf; #include指向到conf.d/下
}
[root@web01 ~]# cat /etc/nginx/conf.d/01-blog.conf #web01配置站点
server {
listen 80;
server_name blog.oldboy.com;
access_log /var/log/nginx/access_www.log main;
root /app/nginx/html/blog; #指定站点目录
location / {
index index.php index.html index.htm;
}
location ~* \.(php|php5)$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
}
[root@web01 ~]# nginx -t #检查语法
[root@web01 ~]# systemctl restart nginx #重启nginx
web02相同配置
为web01和web02添加静态网页
[root@web01 ~]# cat /app/nginx/html/blog/index.html
web01
nginx server 10.0.0.7 web01
[root@web02 ~]# cat /app/nginx/html/blog/index.html
web02
nginx server 10.0.0.8 web02
在lb01上检查一下
[root@lb01 ~]# curl 10.0.0.[7-8]
[1/2]: 10.0.0.7 -->
--_curl_--10.0.0.7
web01
nginx server 10.0.0.7 web01
[2/2]: 10.0.0.8 -->
--_curl_--10.0.0.8
web02
nginx server 10.0.0.8 web02
5.2 LVS-DR模式部署
LVS
加载内核模块
modprobe ip_vs #直接运行ipvsadm -ln
[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 ~]# lsmod |grep ip_vs #检查内核模块
ip_vs 145497 0
nf_conntrack 133095 1 ip_vs
libcrc32c 12644 3 xfs,ip_vs,nf_conntrack
5.3 LVS服务器配置语句与参数
lb01 lb02
ip addr add 10.0.0.3/24 dev eth0 label eth0:0 #添加虚拟IP
ipvsadm -C #清空规则
ipvsadm --set 30 5 60 #设置tcp超市时间
ipvsadm -A -t 10.0.0.3:80 -s wrr -p 20 #创建池塘,设置轮询模式与报错时间
ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.7:80 -g -w 1 #添加RS服务器web01,选择模式并设置权重
ipvsadm -a -t 10.0.0.3:80 -r 10.0.0.8:80 -g -w 1 #添加RS服务器web02,选择模式并设置权重
ipvsadm -ln #查看LVS的配置情况
ipvsadm | |
---|---|
-C | 清除所有规则 |
-A | nginx创建池塘 |
-t | tcp协议 |
-s | scheduler 轮询算法 wrr(加权轮询) |
-p | persistent 会话报错的时间 20秒 默认是300s |
-a | 添加RS服务器(nginx server) |
-r | 指定RS服务器 ip |
-g | --gatewaing 使用DR模式 (-Directing Routing) |
-w | weight 权重 |
#lb01与lb02配置后的情况
[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@lb02 ~]# 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 ~]# 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
[root@lb01 ~]# #ipvsadm-save -n >/root/ipvsadm.rules #将lvs规则追加到文件
[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 ~]# cat /root/ipvsadm.rules #查看之前备份的规则
-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
[root@lb01 ~]# ipvsadm-restore 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
5.4 RS服务器配置参数语句
web01 web02
ip addr add 10.0.0.3/32 dev lo label lo:1 #添加本地回环地址 虚拟IP
[root@web01 ~]# ip a s lo
1: lo: 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 10.0.0.3/32 scope global lo:1 #此IP为本地回环地址
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
cat >>/etc/sysctl.conf<
5.5 测试lvs负载均衡注意事项:
- 不要再lvs本地进行测试
- lvs使用在高并发,