LVS - ipvsadm 基础配置.note
·不同LVS模式的区别:
简单说明:
NAT模式下,LVS必须作为网关,因为流量回客户端必须经过LVS(除非在Web上使用策略路由,让回客户端的流量走lvs,其他流量走网关)
DR模式下,LVS不能够作为网关,且必须与后端服务器同网段
TUN模式,限制没有那么严格,可以和后端服务器同网段,也能作为后端服务器的网关,也能与后端服务器不同网段# 不同模式在ipvsadm中使用不同的参数来指定:
ipvsadm -a -t [公网地址:端口] -r [后端服务器地址:端口] -[模式]
## -m //NAT模式
## -g //DR模式
## -i //TUN(隧道)模式·如果要转发 https:
如果要转发https的流量,直接将 80端口改为 443即可,因为LVS是四层转发,直接根据端口转发,不会像其他反向代理一样会受限于证书
步骤:
1、将LVS的80端口改为 443
2、将 DNAT(DR模式下)的 80端口改为 443
3、将 后端服务器(DR模式下)DNAT的 80端口改为 443·lvs 支持的调度模式:
LVS 默认使用的模式是 wlc
# 在 ipvsadm 中使用 -s 参数指定:
-s rr //轮询模式(Round Robin),将请求平均分给 RS
-s wrr //加权轮询(Weighted RR),在轮询的基础上再根据权重来分配(权重越高,请求越多)
-s lc //最少连接(Least Connection),把新连接分配给当前连接数最少的 RS
-s wlc //加权最少连接(Weighted Least Connection),根据权重,把新连接分配给当前连接数最少的 RS
-s sh //源地址哈希(Source Hash),同一个客户端 IP 总是 hash 到同一台 RS,实现“会话保持”(如果Web中有wordpress,就必须使用这个模式)
-s dh //目标地址哈希(Destination Hash),按目标 IP hash,通常用于 LVS 作为透明代理或缓存前端
-s lblc //基于本地性的最少连接(Locality-Based Least Connection),于多层缓存结构,同一个 URL 尽量落到同一台 RS,提高缓存命中率
-s lblcr //lblc with replication,比 lblc 更智能,增加副本复制机制,适用于大型缓存系统(CDN 内部使用过)
-s sed //最短期望延时(Shortest Expected Delay),数学模型更优,对短连接 web 请求性能优秀
-s nq //不排队(Never Queue),如果 RS 是空闲的,会直接使用它,而不进行调度算法的计算。适用于:要求响应极低延迟的业务·有一个弊端:
ipvsadm没有检测机制,无法检测到后端服务器是否宕机,若是后端服务器故障,lvs无法感知,仍然会将数据包发送给故障的服务器,这样就导致客户端访问有概率丢包,因此就需要使用 lvs + keepalived 来感知后端服务器是否正常运行一、配置 NAT模式:
·环境:
# 架构:
Client → LVS
|
+-- Web1: 192.168.10.1 (GW=192.168.10.254)
+-- Web2: 192.168.10.2 (GW=192.168.10.254)在NAT模式下,后端Web只需要能够访问到LVS即可,因为流量是通过LVS来代转发的,但是还是需要默认路由,虽然后端web不需要访问到Client,但是有些流量没有默认路由时,无法发送给LVS
1、配置 LVS:
需要开启IPv4转发功能(net.ipv4.ip_forward=1)
ipvsadm -l //查看规则(默认没有规则)
ipvsadm -C //清空规则在 man ipvsadm 中有 example配置参考
# 安装ipvs:
apt install -y ipvsadm
# 配置ipvs:
## 语法:ipvsadm -A -t [LVS地址:端口] -s [模式]
## 语法:ipvsadm -a -t [LVS地址:端口] -r [后端服务器地址:端口] -m
## -m 代表 NAT模式
ipvsadm -A -t 1.1.1.254:80 -s rr //设置模式为 轮询
ipvsadm -a -t 1.1.1.254:80 -r 192.168.10.1:80 -m【端口可写可不写】 //设置后端服务器
ipvsadm -a -t 1.1.1.254:80 -r 192.168.10.2:80 -m //设置后端服务器
ipvsadm-save -n > /etc/ipvsadm.rules //保存规则(不加 -n 也可以)
# 查看规则:
ipvsadm -l
2、配置重启自动加载规则:
前提是规则得先保存到 /etc/ipvsadm.rules中,否则规则都是空的怎么加载
vim /etc/default/ipvsadm
## 参数解析:
# AUTO="true" //设置开机自启动
# DAEMON //在 LVS 主/备之间同步连接状态(一般用于keepalived环境下)
# IFACE //只有当DAEMON使用 master 或 backup 模式时,此配置才有意义,配置监听LVS主备之间连接的接口。
3、配置后端web服务器:
# web1:
apt install -y apache2
# web2:
apt install -y nginx·客户端测试:
在NAT模式下,客户端必须访问LVS的VIP才会被成功代理:

二、配置 DR模式:
·环境:
# 架构:
Client → Router
|
+-- LVS: 192.168.10.10 (GW=192.168.10.254)
+-- Web1: 192.168.10.1 (GW=192.168.10.254)
+-- Web2: 192.168.10.2 (GW=192.168.10.254)·注意:需要开启路由功能:
# 因为这台机器不是网关,所以很容易忘记开启路由转发功能:
vim /etc/sysctl.d/route.conf //创建新文件
sysctl --system
1、配置 LVS(在LVS机器上):
需要开启IPv4转发功能(net.ipv4.ip_forward=1)
apt install -y ipvsadm在 man ipvsadm 中有 example配置参考
## 语法:ipvsadm -A -t [LVS地址:端口] -s [模式]
## 语法:ipvsadm -a -t [LVS地址:端口] -r [后端服务器地址:端口] -g
## -g 代表 DR模式
# 80端口:
ipvsadm -A -t 192.168.10.10:80 -s rr
ipvsadm -a -t 192.168.10.10:80 -r 192.168.10.1:80 -g
ipvsadm -a -t 192.168.10.10:80 -r 192.168.10.2:80 -g
ipvsadm-save -n > /etc/ipvsadm.rules
# 443端口:
ipvsadm -A -t 192.168.10.10:443 -s rr
ipvsadm -a -t 192.168.10.10:443 -r 192.168.10.1:443 -g
ipvsadm -a -t 192.168.10.10:443 -r 192.168.10.2:443 -g
ipvsadm-save -n > /etc/ipvsadm.rules80端口和443端口的转发是能够同时存在的
2、配置重启自动加载规则:
前提是规则得先保存到 /etc/ipvsadm.rules中,否则规则都是空的怎么加载
vim /etc/default/ipvsadm
## 参数解析:
# AUTO="true" //设置开机自启动
# DAEMON //在 LVS 主/备之间同步连接状态(一般用于keepalived环境下)
# IFACE //只有当DAEMON使用 master 或 backup 模式时,此配置才有意义,配置监听LVS主备之间连接的接口。
3、配置 DNAT,将流量转发给LVS(在Router上):
vim /etc/ntables.conf
不需要配置SNAT,因为流量回来之后就能够匹配刚刚那条DNAT直接回去了
当然配置了SNAT也不会出现问题
4、处理ARP问题(在每台后端服务器上):
因为LVS DR模式不会修改数据包,直接将数据包发送给后端服务器,此时该数据包的目标地址还是 LVS的IP地址,因此后端服务器不会接受,因此我们需要使用防火墙,匹配目标地址为 LVS IP地址的数据包,使用REDIRECT重定向到本机,强制本机接收它
# iptables:
## 语法:iptables -t nat -A PREROUTING -d [LVS的IP] -p tcp --dport 80 -j REDIRECT
iptables -t nat -A PREROUTING -d 192.168.10.10 -p tcp --dport 80 -j REDIRECT
# iptables -t nat -A PREROUTING -d 192.168.10.10 -p tcp -dport 443 -j REDIRECT
# nftables:
vim /etc/nftables.conf
## 这里的IP要写 LVS的IP地址
这里只演示一台Web的配置
·或使用另一种方式:
在debian 13中,这种方式已经失效,必须使用 nftables 防火墙 redirect 才能成功
all 是用于所有当前接口
default 是用于所有新增接口(例如新加一个网卡,或重启 lo接口,那么它的所有配置都是默认的,只有改default才能影响它)
# 配置ARP抑制:
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 1 > /proc/sys/net/ipv4/conf/default/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 2 > /proc/sys/net/ipv4/conf/default/arp_announce
# 或:
vim /etc/sysctl.d/arp.conf
·测试:

·443:
按照最上面写的,将所有80端口改为443即可:

三、配置 TUN 模式:
注意,该模式下,后端web服务器必须监听 0.0.0.0:80 地址,不能只监听本机IP,因为tun模式会直接把数据包发给用ipip封装发给后端服务器,包里面的目标地址不变,还是 1.1.1.100
但是这个 nginx / apache2 默认就是 监听所有接口,所以除了排错环境外,都无需考虑
1、不需要在后端服务器上配置DNAT了
2、需要将LVS类型改为 TUN模式
3、需要在后端服务器上创建一个ipip隧道·环境:
Web1:192.168.10.1
Web2:192.168.10.2
Director:192.168.10.11;1.1.1.254
Client1:1.1.1.11、配置 lvs(Director):
本机开启路由功能
apt -y install ipvsadm1)加载模块:
modprobe ip_vs
modprobe ip_vs_rr
modprobe ipip //加载模块后,就会出现tunl0接口
# 持久化模块(重启不失效)
vim /etc/modules-load.d/modules.conf
2)设置LVS IP,并配置持久化:
ip addr replace 1.1.1.100/32 dev ens37
# 重启会失效,因此写进计划任务:
## 这里使用 replace 而不是add,是因为replace可以多次执行,add多次执行会报错
vim /etc/crontab
3)配置 接收 LVS-TUN 流量:
# 设置允许接收 源地址/目标地址 与本机地址一样的数据包
vim /etc/sysctl.d/route.conf
4)配置 LVS(ipvsadm):
apt -y install ipvsadm
ipvsadm -C
ipvsadm -A -t 1.1.1.100:80 -s rr
ipvsadm -a -t 1.1.1.100:80 -r 192.168.10.1:80 -i
ipvsadm -a -t 1.1.1.100:80 -r 192.168.10.2:80 -i
ipvsadm -Ln
ipvsadm-save -n > /etc/ipvsadm.rulesdirector机器上tunl0接口是down的,不用管

·配置重启自动加载规则:
前提是规则得先保存到 /etc/ipvsadm.rules中,否则规则都是空的怎么加载
vim /etc/default/ipvsadm
## 参数解析:
# AUTO="true" //设置开机自启动
# DAEMON //在 LVS 主/备之间同步连接状态(一般用于keepalived环境下)
# IFACE //只有当DAEMON使用 master 或 backup 模式时,此配置才有意义,配置监听LVS主备之间连接的接口。
2、配置 后端服务器(Real Server):
两台后端配置一样
1)加载模块:
modprobe ipip
vim /etc/modules-load.d/modules.conf
2)为 tunl0 接口配置 IP:
# 配置接口IP
ip link set tunl0 up
ip addr replace 1.1.1.100/32 dev tunl0 //添加VIP地址
# 因为上面的的命令都是单次的,因此我们可以将它写入 /etc/netowrk/interfaces 文件中:
vim /etc/network/interfaces
3)配置 arp 忽略:
# 配置 arp忽略:
vim /etc/sysctl.d/route.conf
实际测试下来只需要一条:

·如果配置了防火墙,要放行 protocol 4:
不需要在 lvs 上放行,需要在 real server的input,和 real server 与 lvs 之间的链路上放行(假设lvs和real server之间有防火墙,就需要在forward上放行)
ip protocol 4 accept
·lvs 本机防火墙还需要放行 sport:
因为客户端收到ipip封装的包后,会回一个包给 lvs director设备,因此要 forward 需要放行 sport 80、443
