1、DR模式:
1.1、lvs三种模式:
-
nat 地址转换
-
DR 直接路由模式
-
tun 隧道模式
1.2、DR模式的特点:
-
调度器在整个lvs集群当中是最重要的,在nat模式下,即负载接收请求,同时根据负载均衡的算法转发流量,响应发送给客户端。
-
DR模式:调度器依然负责接收请求,同时也根据负载均衡算法转发到RS,响应直接由RS响应给客户端。
-
直接路由 Direct Routing是一种
二层转发模式
。二层转发的是数据帧
。根据源mac地址和目的mac地址
进行转发。 -
不会修改数据包源ip和目的ip,根据数据包的mac地址进行转发。
-
DR模式下,lvs也是维护一个虚拟的ip地址,所有的请求都是发送到这个vip,既然是走二层转发,当客户端的请求到达调度之后,根据负载均衡的算法选择一个RS,修改vip服务器的目的mac变成RS的mac地址,RS处理完成请求之后,根据报文当中客户端的源mac的地址,直接把响应发送到客户端即可,不需要走调度器。
调度器配置了vip,RS上也配置了vip地址。
-
vip地址冲突,调度器和RS都在同一网段,ARP通信的紊乱。因为整个局域网广播,所有的设备都收到了。
-
怎么把lo这个回环的响应把它屏蔽掉,只有服务器本机的物理ip地址响应。
修改内核参数:
-
arp_ignore=1------#服务器系统的物理ip地址才会响应请求,lo不会响应ARP请求。
-
2、返回报文时,vip地址还在,怎么样能让客户端来接收到响应
-
arp_announce=2---#系统不使用ip数据包的源地址来响应请求,直接发送物理接口的ip地址。
1、调度器的ip地址和RS的ip要在同一网段,数据先进行二层转发。
2、RS是一个公网地址,互联网可以直接访问RS的地址(不用)。
3、DR模式是走内核转发,内核来判断数据包的地址,根据RS的地址把数据包重新封装,修改mac地址。
4、调度器的地址只可以做为集群访问的入口,不能作为网关。5、所有的RS上的lo(本地回环地址)都要配置vip地址。


DR模式的实现:
nignx1:RS1 192.168.168.10+vip
nginx2: RS2 192.168.168.20+vip
VIP: 192.168.168.100
test1:调度器vip
test2:客户端
调度器上
vim /etc/sysctl.conf
net.ipv4.ip_forward=0
#关闭数据包转发功能
net.ipv4.conf.all.send_redirects=0
#禁止系统发送icmp重定向的消息。回环地址不接受ping得消息。只针对真实得ip地址。
net.ipv4.conf.default.send_redirects=0
#禁止默认网络接口发送icmp重定向的消息。
net.ipv4.conf.ens33.send_redirects=0
#针对ens33设备,禁止发送icmp重定向消息。
-
-A 添加虚拟服务器 vip
-
-D 删除虚拟服务器地址
-
-s指定负载均衡的调度算法
-
-a 添加真实服务器
-
-d 删除真实服务器
-
-t 指定vip的地址和端口
-
-r 指定rip的地址和端口
-
-m使用nat模式
-
-g 使用DR模式
-
-i 使用隧道模式
-
-w 设置权重
-
-p 60:连接保持60设置保持时间
-
-l:列表查看
-
-n:数字化展示
-
-m指定模式为nat模式
设置ip地址为192.168.168.100的地址添加到回环接口,作为lvs的vip。通过路由的模式转发到RS
能让vip识别到RS真实的服务器。
route add -host 192.168.233.100 dev lo:0
vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore = 1
#设置回环接口忽略来自任何接口的ARP请求net.ipv4.conf.lo.arp_announce =2
设置回环地址仅仅公告本地的ip地址,但是不响应ARP请求net.ipv4.conf.all.arp_ignore = 1
#设置所有接口忽略来自任何接口的ARP请求net.ipv4.conf.all.arp_announce =2
#设置所有接口仅仅公告本地的ip地址,但是不响应ARP请求。
3、在Linux系统中,net.ipv4.conf.all.arp_ignore
是一个内核参数,用于控制网络接口如何处理收到的ARP(地址解析协议)请求。这个参数特别在服务器和网络设备中配置,以减少因ARP欺骗或其他网络攻击而带来的安全风险。
当设置 net.ipv4.conf.all.arp_ignore = 1
时,这意味着系统将只回答目标IP地址为本机接收接口上的地址的ARP请求。换句话说,如果ARP请求的目标IP地址与接收该请求的接口上的IP地址不匹配,那么系统将忽略这个ARP请求。这个设置对于增强系统对ARP欺骗攻击的抵抗能力特别有用。
具体来说,arp_ignore
参数可以有多个值,每个值代表不同的行为:
0
(默认值):回应任何网络接口上的任何ARP请求,只要请求的目标IP地址与本机上的某个IP地址匹配。1
:只回应目标IP地址是接收接口的IP地址的ARP请求。这有助于防止将接口用作其他机器的代理。2
:仅当ARP请求的目标IP地址是接收接口的IP地址,并且该接口是主要的(即,如果接口配置了多个IP地址,则只回应与主要IP地址匹配的ARP请求)。
4、在Linux系统中,net.ipv4.conf.all.arp_announce
是一个内核参数,用于控制网络接口在发送ARP(地址解析协议)请求或响应时使用的IP地址选择策略。这个参数对于防止ARP欺骗和网络地址冲突特别有用,因为它允许系统更加谨慎地选择用于ARP通信的源IP地址。
当设置 net.ipv4.conf.all.arp_announce = 2
时,这意味着系统将在发送ARP请求或响应时,只使用与请求的目标IP地址在同一子网上的接口的主IP地址(如果有的话)。如果没有这样的接口,则不发送ARP请求或响应。这个设置可以帮助减少因ARP欺骗而导致的网络问题,因为它限制了可以发送ARP流量的接口和IP地址。
arp_announce
参数可以有以下几个值:
0
(默认值):选择任意接口上的任意IP地址进行ARP请求或响应。这可能会导致安全问题,因为攻击者可能能够诱骗系统使用不应该用于ARP通信的IP地址。1
:尽量避免使用非请求接口上的IP地址作为ARP请求的源IP地址。但是,如果没有其他选择,仍然可能会使用非请求接口上的IP地址。2
:只使用与请求的目标IP地址在同一子网上的接口的主IP地址(如果有的话)。这是最为严格的设置,有助于防止ARP欺骗。
lvs的三种工作模式:
NAT | DR | TUN | |
---|---|---|---|
优点 | 配置简单,地址转换 | 性能最好 | WAN可以实现较远距离的数据包转送 |
缺点 | 性能瓶颈 | 不支持跨网段 | 专用通道,需要开通VPN(花钱) |
RS要求 | 无限制 | 必须要静止非物理接口的ARP响应 | 要支持隧道模式 |
RS数量 | 10-20 | 100台 | 100台 |
修改vip的轮询算法:
ipvsadm -E -t 192.168.233.100:80 -s wrr
ipvsadm -e -t 192.168.233.100:80 -r 192.168.233.61:80 -w 3
2、面试题
简述lvs的三种模式和他们的区别:
LVS的工作模式及其工作过程:
LVS 有三种负载均衡的模式,分别是VS/NAT(nat 模式)、VS/DR(路由模式)、VS/TUN(隧道模式)。
1、NAT模式(VS-NAT)
原理:首先负载均衡器接收到客户的请求数据包时,根据调度算法决定将请求发送给哪个后端的真实服务器(RS)。
然后负载均衡器就把客户端发送的请求数据包的目标IP地址及端口改成后端真实服务器的IP地址(RIP)。
真实服务器响应完请求后,查看默认路由,把响应后的数据包发送给负载均衡器,负载均衡器在接收到响应包后,
把包的源地址改成虚拟地址(VIP)然后发送回给客户端。
优点:集群中的服务器可以使用任何支持TCP/IP的操作系统,只要负载均衡器有一个合法的IP地址。
缺点:扩展性有限,当服务器节点增长过多时,由于所有的请求和应答都需要经过负载均衡器,
因此负载均衡器将成为整个系统的瓶颈。
2、直接路由模式(VS-DR)
原理:首先负载均衡器接收到客户的请求数据包时,根据调度算法决定将请求发送给哪个后端的真实服务器(RS)。
然后负载均衡器就把客户端发送的请求数据包的目标MAC地址改成后端真实服务器的MAC地址(R-MAC)。
真实服务器响应完请求后,查看默认路由,把响应后的数据包直接发送给客户端,不需要经过负载均衡器。
优点:负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户。
所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,也能处理很巨大的请求量。
缺点:需要负载均衡器与真实服务器RS都有一块网卡连接到同一物理网段上,必须在同一个局域网环境。
3、IP隧道模式(VS-TUN)
原理:首先负载均衡器接收到客户的请求数据包时,根据调度算法决定将请求发送给哪个后端的真实服务器(RS)。
然后负载均衡器就把客户端发送的请求报文封装一层IP隧道(T-IP)转发到真实服务器(RS)。
真实服务器响应完请求后,查看默认路由,把响应后的数据包直接发送给客户端,不需要经过负载均衡器。
优点:负载均衡器只负责将请求包分发给后端节点服务器,而RS将应答包直接发给用户。
所以,减少了负载均衡器的大量数据流动,负载均衡器不再是系统的瓶颈,也能处理很巨大的请求量。
缺点:隧道模式的RS节点需要合法IP,这种方式需要所有的服务器支持"IP Tunneling"。
lvs集群当中的高可用架构只是针对调度器的高可用。
基于vrrp来实现调度器的主和备。
高可用的HA架构。
主调度器,备调度(多台)
在主调度器正常工作的时候,备完全处于冗余状态(待命)。不参与集群的运转,只有当主调度器出现故障时,备才会承担主调度器的工作。主调度器恢复功能时,主继续作为集群的入口,备继续处于冗余状态(取决于优先级)。
keepaliva基于vrrp协议来实现高可用的方案。
1、组播地址:
224.0.0.18根据组播地址来进行通信,主和备之间发送报文。确定对方是否存活。
2、根据优先级的大小来确定主和备的位置。
3、故障切换,主挂了,备来继续工作,主恢复了,备继续等待。
4、主和备之间的切换是vip地址的切换。
keepalive是专门为了lvs而出现的,但不是lvs专用的。


3、lvs和nginx做负载均衡的区别:
lvs是四层转发 内核态 ip+端口 四层代理
nginx 四层代理 也可以七层代理
lvs(DR模式)+nginx+tomcat
lvs实现四层转发+nginx实现7层转发(动态)
访问lvs的vip地址可以实现动静分离。

4、实验操作1、DR模式实现:

DR模式的实现:
nignx1:RS1 192.168.168.10
nginx2: RS2 192.168.168.20
VIP: 192.168.168.100
test1:调度器 192.168.168.50
test2:客户端 192.168.168.60
test1:调度器
modprobe ip_vs 启动内核
yum -y install ipvsadm* 安装lvs管理工具
root@test5 \~\]# cd /etc/sysconfig/network-scripts/
\[root@test5 network-scripts\]# vim ifcfg-ens33:0
DEVICE=ens33:0 ##添加虚拟网卡
ONBOOT=yes
IPADDR=192.168.168.100
NETMASK=255.255.255.0
ifup ens33:0
ifconfig

vim /etc/sysctl.conf
net.ipv4.ip_forward=0
#关闭数据包转发功能
net.ipv4.conf.all.send_redirects=0
#禁止系统发送icmp重定向的消息。###lo回环接口不接收icmp消息。只针对真实的ip地址。
net.ipv4.conf.default.send_redirects=0
#禁止网络接口发送icmp重定向的消息。
net.ipv4.conf.ens33.send_redirects=0
#针对ens33设备,禁止发送icmp重定向消息。
sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
调度器开启转发
ipvsadm -A -t 192.168.168.100:80 -s rr
[root@test5 opt]# ipvsadm -a -t 192.168.168.100:80 -r 192.168.168.10:80 -g
[root@test5 opt]# ipvsadm -a -t 192.168.168.100:80 -r 192.168.168.20:80 -g
[root@test5 opt]# ipvsadm-save > /etc/sysconfig/ipvsadm
[root@test5 opt]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.168.100:80 rr
-> 192.168.168.10:80 Route 1 0 0
-> 192.168.168.20:80 Route 1 0 0
设置虚拟回环接口
服务器1:
vim /usr/local/nginx/html/index.html
this is nginx1
systemctl restart nginx
服务器2:
vim /usr/local/nginx/html/index.html
this is nginx2
systemctl restart nginx
同时开启:
DEVICE=lo:0
IPADDR=192.168.168.100
NETMASK=255.255.255.255
ONBOOT=yes
cd /etc/sysconfig/network-scripts/
vim /etc/sysctl.conf
route add -host 192.168.168.100 dev lo:0
设置ip地址为192.168.168.100的只添加到回环接口,做为lvs的vip。通过路由的模式转发到RS,能让vip识别到真实的服务器。
vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore = 1
#设置回环接口忽略来自任何接口的ARP请求
net.ipv4.conf.lo.arp_announce = 2
#设置回环地址仅仅公告本地的ip地址,但是不响应ARP请求
net.ipv4.conf.all.arp_ignore = 1
##设置所有接口忽略来自任何接口的ARP请求
net.ipv4.conf.all.arp_announce = 2
##设置所有接口仅仅公告本地的ip地址,但是不响应ARP请求。
sysctl -p
curl 192.168.168.100

## 5、DR模式+nginx+tomcat:


DR模式的实现:
nignx1:RS1 192.168.168.10
nginx2: RS2 192.168.168.20
VIP: 192.168.168.100
test1:调度器 192.168.168.50
test2:客户端 192.168.168.60
test1:调度器
modprobe ip_vs 启动内核
yum -y install ipvsadm\* 安装lvs管理工具
\[root@test5 \~\]# cd /etc/sysconfig/network-scripts/
\[root@test5 network-scripts\]# vim ifcfg-ens33:0
DEVICE=ens33:0 ##添加虚拟网卡
ONBOOT=yes
IPADDR=192.168.168.100
NETMASK=255.255.255.0
ifup ens33:0
ifconfig

vim /etc/sysctl.conf
net.ipv4.ip_forward=0
#关闭数据包转发功能
net.ipv4.conf.all.send_redirects=0
#禁止系统发送icmp重定向的消息。###lo回环接口不接收icmp消息。只针对真实的ip地址。
net.ipv4.conf.default.send_redirects=0
#禁止网络接口发送icmp重定向的消息。
net.ipv4.conf.ens33.send_redirects=0
#针对ens33设备,禁止发送icmp重定向消息。
sysctl -p
net.ipv4.ip_forward = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.ens33.send_redirects = 0
调度器开启转发
ipvsadm -A -t 192.168.168.100:80 -s rr
[root@test5 opt]# ipvsadm -a -t 192.168.168.100:80 -r 192.168.168.10:80 -g
[root@test5 opt]# ipvsadm -a -t 192.168.168.100:80 -r 192.168.168.20:80 -g
[root@test5 opt]# ipvsadm-save > /etc/sysconfig/ipvsadm
[root@test5 opt]# ipvsadm -ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags
-> RemoteAddress:Port Forward Weight ActiveConn InActConn
TCP 192.168.168.100:80 rr
-> 192.168.168.10:80 Route 1 0 0
-> 192.168.168.20:80 Route 1 0 0
设置虚拟回环接口
服务器1:
vim /usr/local/nginx/html/index.html
this is nginx1
systemctl restart nginx
服务器2:
vim /usr/local/nginx/html/index.html
this is nginx2
systemctl restart nginx
同时开启:
DEVICE=lo:0
IPADDR=192.168.168.100
NETMASK=255.255.255.255
ONBOOT=yes
cd /etc/sysconfig/network-scripts/
vim /etc/sysctl.conf
route add -host 192.168.168.100 dev lo:0
设置ip地址为192.168.168.100的只添加到回环接口,做为lvs的vip。通过路由的模式转发到RS,能让vip识别到真实的服务器。
vim /etc/sysctl.conf
net.ipv4.conf.lo.arp_ignore = 1
#设置回环接口忽略来自任何接口的ARP请求
net.ipv4.conf.lo.arp_announce = 2
#设置回环地址仅仅公告本地的ip地址,但是不响应ARP请求
net.ipv4.conf.all.arp_ignore = 1
##设置所有接口忽略来自任何接口的ARP请求
net.ipv4.conf.all.arp_announce = 2
##设置所有接口仅仅公告本地的ip地址,但是不响应ARP请求。
sysctl -p
curl 192.168.168.100

nginx1和nginx2配置7层代理发送到tomcat
vim /usr/local/nginx/conf/nginx.conf
#keepalive_timeout 0;
keepalive_timeout 65;
upstream tomcat {
server 192.168.168.40:8080 weight=2;
server 192.168.168.90:8080 weight=1;
}
#gzip on;
server {
listen 80;
server_name localhost;
#charset koi8-r;
#access_log logs/host.access.log main;
location ~ .*\.jsp$ {
proxy_pass http://tomcat;
proxy_set_header HOST $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
#### tomcat1:
vim /usr/local/tomcat/conf/server.xml