当前位置: 首页 > news >正文

LVS知识点整理及实践

LVS知识点整理及实践

  • LVS
    • lvs集群概念
    • lvs概念
    • lvs集群类型
      • lvs-nat模型
        • 数据逻辑:
      • lvs-DR模式
        • 数据传输和过程:
        • 特点:
      • lvs-tun模式
        • 数据传输过程:
        • 特点:
      • lvs-fullnet模式
        • 数据传输过程
    • lvs调度算法
      • lvs调度算法类型
      • lvs静态调度算法
      • lvs动态调度算法
      • 4.15版本内核以后新增调度算法
    • ipvsadm命令
      • lvs集群中的增删改
    • 实操实验:
      • lvs-nat模拟实验
          • lvs:
          • webserver1
          • webserver2
          • clent
      • lvs-DR模拟实验
        • 解决vip响应问题
        • 设备设置:
          • webserver1:
          • webserver2:
          • lvs:
          • route:
          • client:
        • lvs-火墙标记解决调度问题
        • 注意:

LVS

lvs集群概念

LVS(Linux Virtual Server):负责调度器,内核集成的虚拟服务器,主要用于多服务器的负载均衡,工作于网络层,可以实现高性能,高可用的服务集群技术,可以把许多服务器结合在一起形成一个更高性能的服务器

lvs概念

VSVirtual Server
RSReal Server
CIPClient IP
VIPVirtual server IP
DIPDirectory IP
RIPReal server IP

访问流程: CIP<---->VIP==DIP<---->RIP

lvs集群类型

集群类型说明
lvs-nat修改请求报文的目标ip,多目标IP的DANT
lvs-dr操作封装新的MAC地址
lvs-tun在原请求IP报文之外新加一个IP首部
lvs-fullmat修改请求报文的源和目标ip

lvs-nat模型

  • 本质是多目标IP的DNAT.通过将请求报文中的目标地址和目标端口修改为某挑出的RS和RIP和POST实现转发
  • RIP和DIP应在同意个ip网络,且应使用私网地址,RS的网关要指向DIP
  • 请求报文和相应报文都必须经由Director转发,Director易于成为系统瓶颈
  • 支持端口映射,可修改请求报文的目标PORT
  • VS必须是linux系统,RS可以是任意OS系统
数据逻辑:

在这里插入图片描述

  1. 客户端发送访问请求,请求数据包中含有请求来源(CIP),访问目标地址(VIP)访问目标端口(9000port)
  2. VS服务器接收到访问请求做DNAT把请求数据包中的目的地由VIP换成RS的RIP和相应端口
  3. RS1相应请求,发送相应数据包.包中的相应包为数据来源(RIP1)相应目标(CIP)相应端口(9000port)
  4. VS服务器接收到相应数据包,改变包中的数据来源(RIP1–>VIP),相应目标端口(9000->80)
  5. VS服务器把修改过报文的相应数据包回传给客户端
  6. lvs的NAT模式接收和返回客户端数据包时都要经过lvs的调度机,所以lvs的调度机容易阻塞

lvs-DR模式

数据传输和过程:

在这里插入图片描述

  1. 客户端发送数据帧给vs调度主机帧中内容为客户端IP+客户端的MAC+VIP+VIP的MAC
  2. VS调度主机接受到数据帧后把帧中的VIP的MAC改为了RS1中的MAC,此时帧中的数据为客户端IP+客户端的MAC+VIP+RS1的MAC
  3. RS1得到2中的数据包做出响应回传数据包,数据包中的内容为VIP+RS1的MAC+客户端IP+客户端IP的MAC
特点:
  1. Directory和各RS都配置有VIP

  2. 确保前端路由器将目标IP为VIP的请求报文发往Director

  3. 在全段网关做静态帮定VIP和Directory的MAC地址

    • 在RS上使用arptables工具

      arptables -A IN -d $VIP -j DROP
      arptables -A OUT -s $VIP -j mangle --mangle-ip-s $RIP
      
    • 在RS上修改内核参数以限制arp通告及应答级别

      /proc/sys/net/ipv4/conf/all/arp_ignore
      /proc/sys/net/ipv4/conf/all/arp_announce
      
  4. RS的RIP可以使用私网地址,也可以是公网地址,RIP与DIP在同一IP网络

  5. RIP的网关不能指向DIP,以确保响应报文不会经由Director

  6. RS的Director要在同一网络

  7. 请求报文要经由Director,但响应报文不经由Director,而由RS直接发往Client

  8. 不支持端口映射(端口不能修改)

  9. RS可适用大多数OS系统

lvs-tun模式

转发方式:不修改请求报文的IP首部(源IP为CIP,目标IP为VIP),而在原IP报文之外再封装一个IP首部 (源IP是DIP,目标IP是RIP),将报文发往挑选出的目标RS;RS直接响应给客户端(源IP是VIP,目标IP 是CIP)

数据传输过程:

在这里插入图片描述

  1. 客户端发送请求数据包,包内有源IP+vip+dport
  2. 到达vs调度器后对客户端发送过来的数据包重新封装添加IP报文头,新添加的IP报文头中包含 TUNSRCIP(DIP)+TUNDESTIP(RSIP1)并发送到RS1
  3. RS收到VS调度器发送过来的数据包做出响应,生成的响应报文中包含SRCIP(VIP)+DSTIP(CIP) +port,响应数据包通过网络直接回传给client
特点:
  1. DIP, VIP, RIP都应该是公网地址
  2. RS的网关一般不能指向DIP
  3. 请求报文要经由Director,但响应不能经由Director
  4. 不支持端口映射
  5. RS的OS须支持隧道功能

lvs-fullnet模式

数据传输过程

在这里插入图片描述

fullnat:通过同时修改请求报文的源IP地址和目标IP地址进行转发

CIP --> DIP

VIP --> RIP

  1. VIP是公网地址,RIP和DIP是私网地址,且通常不在同一IP网络;因此,RIP的网关一般不会指向DIP
  2. RS收到的请求报文源地址是DIP,因此,只需响应给DIP;但Director还要将其发往Client
  3. 请求和响应报文都经由Director
  4. 支持端口映射

注意: 此类型kernel默认不支持

lvs调度算法

lvs调度算法类型

ipvs scheduler:根据其调度时是否考虑各RS当前的负载均衡状态被分为两种:静态方法和动态方法

静态方法:仅根据算法本身进行调度,不考虑RS的负载情况

动态方法:主要根据每RS当前的负载状态及调度算法进行调度Overhead=value较小的RS将被调度

lvs静态调度算法

  1. RR:roundrobin轮询,RS分别被调用,当RS配置有差别时不推荐
  2. WRR:Weighted RR,加权轮询根据RS的配置进行加权调度,性能差的RS被调度的次数少
  3. SH:Source Hashing,实现session sticky,源地址hash;将来自于同一个IP地址的请求始终发往第一次挑中的RS,从而实现会话绑定
  4. DH:Destination Hashing,目标地址hash,第一次轮询调整度至RS,后续将发往同一个目标地址的请求始终发至第一次挑中的RS,典型使用场景是正向代理缓存场景中的负载均衡,如:宽带运营商

lvs动态调度算法

主要是根据当前的负载状态及调度算法进行调度Overhead=value较小的RS会被调度

  1. LC:最少连接(least connection)
    • 适用于长连接应用:负载值(Overhead)=活动链接数(activeconns)x256+非活动链接数(inactiveconns)
  2. WLC:权重最少连接(Weighted LC)
    • 初始链接高权重优先Overhead=(activeconns+1+inactiveconns)x256/weight
    • 但是,当node1的权重为1,node2的权重为10,经过运算前几次调度都会被node2承接
  3. SED:最短期望延迟(Shortest Expection Delay)
  4. NQ:第一轮询均匀分配,后续SED(Never Queue)
  5. LBLC:(Lacality-Based LC)动态的DH算法,使用场景:根据负载状态实现正向代理
  6. LBLCR:(LBLC with Replication)带复制功能的LBLC,解决LBLC负载不均衡的问题,从负载重的复制到负载轻的RS

4.15版本内核以后新增调度算法

  1. FO(Weighted Fai Over)调度算法:常用作灰度发布
    • 在此FO算法中,遍历虚拟服务所关联的真实服务器链表,找到还未过载(未设置IP_VS_DEST_F OVERLOAD标志)的且权重最高的真实服务器,进行调度
    • 当服务器承接大量链接,我们可以对此服务器进行过载标记(IP_VS_DEST_F OVERLOAD),那么vs调度 器就不会把链接调度到有过载标记的主机中。
  2. OVF(Overflow-connection)调度算法:基于真实服务器的活动连接数量和权重值实现。将新连接调度到权重值最高的真实服务器,直到其活动 连接数量超过权重值,之后调度到下一个权重值最高的真实服务器,在此OVF算法中,遍历虚拟服务相关 联的真实服务器链表,找到权重值最高的可用真实服务器。一个可用的真实服务器需要同时满足以下条 件:
    • 未过载(未设置IP_VS_DEST_F OVERLOAD标志)
    • 真实服务器当前的活动连接数量小于其权重值
    • 其权重值不为零

ipvsadm命令

核心功能:

  • ​ 集群服务管理:增删改
  • 集群服务的RS管理:增删改

lvs集群中的增删改

1.管理集群服务中的增删改

ipvsadm -A|E -t|u|f service-address [-s scheduler] [-p [timeout]]

选项说明
-A添加
-E修改
-ttcp服务
-uudp服务
-s指定调度算法默认为WLC
-p设置持久连接超时,持久连接可以理解为在同一个时间段同一个来源的请求调度到同一个Reslserver
-ffirewall mask火墙标记,是一个数字

2.管理集群中ReslServer的增删改查

ipvsadm -a|e -t|u|f service-address -r reslserver-address [-g|i|m] [-w weight]

选项说明
-a添加realserver
-e更改realserver
-ttcp协议
-uudp协议
-f火墙标记
-rrealserver地址
-g直连路由模式
-iipip隧道模式
-mnat模式
-w设定权重
-Z清空计数器
-C清空lvs策略
-L查看lvs策略
-n
–rate输出速率信息

实操实验:

lvs-nat模拟实验

环境:

lvs:

网卡:

​ eth0:nat模式 vip:172.25.254.100/24

​ eth1:仅主机 ip:192.168.0.100/24

[root@localhost ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection 
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
address1=172.25.254.100/24,172.25.254.2
method=manual
dns=114.114.114.114
[root@localhost ~]# cat /etc/NetworkManager/system-connections/eth1.nmconnection 
[connection]
id=eth1
type=ethernet
interface-name=eth1[ipv4]
address1=192.168.0.100/24
method=manual
[root@localhost ~]# nmcli connection reload 
[root@localhost ~]# nmcli connection up eth0
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/4)
[root@localhost ~]# nmcli connection up eth1
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/5)
[root@localhost ~]# 
#查看内核路由功能是否打开
[root@localhost ~]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 0
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0
[root@localhost ~]#
#打开内核路由功能
[root@localhost ~]# vim /etc/sysctl.conf
[root@localhost ~]# cat /etc/sysctl.conf | grep ip_forward
net.ipv4.ip_forward=1
[root@localhost ~]# 
#使设置生效
[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 1
#关闭防火墙和SELinux
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# 
#安装ipvs软件ipvsadm
[root@localhost ~]# dnf install ipvsadm -y
#加入调度策略
#增加虚拟服务器这里没有加入权重,如果需要加入权重则需要使用wrr
[root@localhost ~]# ipvsadm -A -t 172.25.254.100:80 -s rr
#添加调度策略
[root@localhost ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.10 -m
[root@localhost ~]# ipvsadm -a -t 172.25.254.100:80 -r 192.168.0.20 -m
[root@localhost ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
TCP  172.25.254.100:80 rr-> 192.168.0.10:80              Masq    1      0          0         -> 192.168.0.20:80              Masq    1      0          0         
[root@localhost ~]# 
#保存ipvsadm策略
[root@localhost ~]# ipvsadm -Sn /etc/sysconfig/ipvsadm-config 
[root@localhost ~]# cat /etc/sysconfig/ipvsadm-config 
-A -t 192.168.0.200:80 -s rr
-a -t 192.168.0.200:80 -r 192.168.0.10:80 -g 
-a -t 192.168.0.200:80 -r 192.168.0.20:80 -g 
webserver1

网卡:

​ eth0:仅主机 192.168.0.10 网关:192.168.0.100

[root@localhost ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection 
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address=192.168.0.10/24,192.168.0.100
dns1=114.114.114.114
#重启网卡
[root@localhost ~]# nmcli connection reload 
[root@localhost ~]# nmcli connection up eth0 
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/3)
#查看路由
[root@localhost ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.100   0.0.0.0         UG    100    0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     100    0        0 eth0
#查看路由
[root@localhost ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.25.254.2    0.0.0.0         UG    102    0        0 eth0
172.25.254.0    0.0.0.0         255.255.255.0   U     102    0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     103    0        0 eth1
[root@localhost ~]# 
#下载web服务编辑配置文件以供验证
[root@localhost ~]# dnf install httpd -y
[root@localhost ~]# echo webserver1:192.168.0.10 > /var/www/html/index.html 
[root@localhost ~]# cat /var/www/html/index.html 
webserver1:192.168.0.10
#重启httpd服务关闭防火墙和SELinux,之后可以在client中使用curl+ip测试能否访问
[root@localhost ~]# systemctl restart httpd
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]# 
webserver2

eth0:仅主机 192.168.0.20 网关:192.168.0.100

[root@localhost ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection 
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address=192.168.0.20/24,192.168.0.100
dns=114.114.114.114
#重启网卡
[root@localhost ~]# nmcli connection reload 
[root@localhost ~]# nmcli connection up eth0 
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/3)
#查看路由
[root@localhost ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.100   0.0.0.0         UG    100    0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     100    0        0 eth0
[root@localhost ~]#  
#下载web服务编辑配置文件以供验证
[root@localhost ~]# dnf install httpd -y
[root@localhost ~]# echo webserver2:192.168.0.20 > /var/www/html/index.html 
[root@localhost ~]# cat /var/www/html/index.html 
webserver2:192.168.0.20
#重启httpd服务关闭防火墙和SELinux
[root@localhost ~]# systemctl restart httpd
[root@localhost ~]# systemctl stop firewalld
[root@localhost ~]# setenforce 0
[root@localhost ~]#   
clent

网卡: etho NAT模式 172.25.254.200/24

[root@localhost ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection 
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
address1=172.25.254.200/24,172.25.254.100
method=manual
[root@localhost ~]#
#在server1和server2设置完httpd后的测试,lva并没有加入ipvsadm
[root@localhost ~]# curl 192.168.0.10
webserver1:192.168.0.10
[root@localhost ~]# curl 192.168.0.20
webserver2:192.168.0.20
[root@localhost ~]# 
#在lvs中计入ipvs后的测试
[root@localhost ~]# for i in {1..10}
> do
> curl 172.25.254.100
> done
webserver1:192.168.0.10
webserver2:192.168.0.20
webserver1:192.168.0.10
webserver2:192.168.0.20
webserver1:192.168.0.10
webserver2:192.168.0.20
webserver1:192.168.0.10
webserver2:192.168.0.20
webserver1:192.168.0.10
webserver2:192.168.0.20
[root@localhost ~]# 

lvs-DR模拟实验

解决vip响应问题

在DR模型上各主机上均需要配置VIP,解决地址冲突的方式有三种:

(1),在前端网关做静态绑定

(2),在各rs使用arptables

(3),在各RS修改内核参数,来限制arp响应的通告的级别

限制响级别:arp_ignore

  • 0:默认值:表示可使用本地任意接口上配置的任意地址进行响应
  • 1:仅在请求的目标IP配置在本地主机的接受的请求报文的接口上时,才给予响应

限制通告级别:

  • 0:默认值:把本机所有接口的所有信息向每个接口的网络进行通告
  • 1:尽量避免将接口信息向非直接连接网络进行通告
  • 2:必须避免将接口信息向非本网络进行通告
设备设置:

这里的web服务和lvs-nat模式的web服务一样,关闭了防火墙和SELinux

webserver1:

eth0:仅主机 192.168.0.10 网关:192.168.0.100

lo:充当vip 192.168.0.200/32

[root@localhost ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection 
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address=192.168.0.10/24,192.168.0.100
dns1=114.114.114.114
#添加vip也可以添加到其他网卡中
[root@webserver1 ~]# ip a a 192.168.0.200/32 dev lo 
#重启网卡
[root@localhost ~]# nmcli connection reload 
[root@webserver1 ~]# nmcli connection up lo 
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/3)
[root@localhost ~]# nmcli connection up eth0 
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/3)
[root@webserver1 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet 192.168.0.200/32 scope global lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 00:0c:29:fb:af:a1 brd ff:ff:ff:ff:ff:ffaltname enp3s0altname ens160inet 192.168.0.10/24 brd 192.168.0.255 scope global noprefixroute eth0valid_lft forever preferred_lft foreverinet6 fe80::131d:4d9:4af3:d18d/64 scope link noprefixroute valid_lft forever preferred_lft forever
#查看路由
[root@localhost ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.100   0.0.0.0         UG    100    0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     100    0        0 eth0
#配置vip不对外响应
[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore 
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce 
[root@webserver1 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce 
[root@webserver1 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
#配置http服务和关闭SELinux参考lvs-nat实验
webserver2:

eth0:仅主机 192.168.0.20 网关:192.168.0.100

lo:充当vip 192.168.0.200/32

[root@localhost ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection 
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
method=manual
address=192.168.0.20/24,192.168.0.100
dns=114.114.114.114
#添加vip也可以添加到其他网卡中
[root@webserver2 ~]# ip a a 192.168.0.200/32 dev lo 
#重启网卡
[root@localhost ~]# nmcli connection reload 
[root@webserver2 ~]# nmcli connection up lo
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/3)
[root@localhost ~]# nmcli connection up eth0 
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/3)
[root@webserver2 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet 192.168.0.200/32 scope global lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 00:0c:29:c9:3d:50 brd ff:ff:ff:ff:ff:ffaltname enp3s0altname ens160inet 192.168.0.20/24 brd 192.168.0.255 scope global noprefixroute eth0valid_lft forever preferred_lft foreverinet6 fe80::fa32:faf:d238:9326/64 scope link noprefixroute valid_lft forever preferred_lft forever
#查看路由
[root@localhost ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.100   0.0.0.0         UG    100    0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     100    0        0 eth0
#配置vip不对外响应
[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
[root@webserver2 ~]# echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
[root@webserver2 ~]# echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
#配置http服务和关闭SELinux参考lvs-nat实验
lvs:

eth0:仅主机 192.168.0.50/24 gateway:192.168.0.100

lo:充当vip 192.168.0.200/32

#设置ip
[root@lvs ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection 
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
address=192.168.0.50/24,192.168.0.100
method=manual
#添加vip也可以添加到其他网卡中
[root@lvs ~]# ip a a 192.168.0.200/32 dev lo 
#重启网卡
[root@localhost ~]# nmcli connection reload 
[root@lvs ~]# nmcli connection up lo 
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/8)
[root@localhost ~]# nmcli connection up eth0 
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/3)
[root@lvs ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet 192.168.0.200/32 scope global lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 00:0c:29:fd:a6:ea brd ff:ff:ff:ff:ff:ffaltname enp3s0altname ens160inet 192.168.0.50/24 brd 192.168.0.255 scope global noprefixroute eth0valid_lft forever preferred_lft foreverinet6 fe80::bbb1:4d5d:560:2123/64 scope link noprefixroute valid_lft forever preferred_lft forever
[root@lvs ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.100   0.0.0.0         UG    100    0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     100    0        0 eth0
#加入ipvsadm调度策略
[root@lvs ~]# ipvsadm -A -t 192.168.0.200:80 -s wrr
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.10:80 -g -w 1
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:80 -r 192.168.0.20:80 -g -w 2
[root@lvs ~]# 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.0.200:80 wrr-> 192.168.0.10:80              Route   1      0          0         -> 192.168.0.20:80              Route   2      0          0         
[root@lvs ~]# 
route:

eth0: NAT模式 172.25.254.100 gateway:172.25.254.2

eth1:仅主机模式 192.168.0.100

#配置网卡内容
[root@router ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection 
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
address1=172.25.254.100/24,172.25.254.2
method=manual
dns=114.114.114.114
[root@router ~]# cat /etc/NetworkManager/system-connections/eth1.nmconnection 
[connection]
id=eth1
type=ethernet
interface-name=eth1[ipv4]
address1=192.168.0.100/24
method=manual
#重启网卡
[root@router ~]# nmcli connection reload 
[root@router ~]# nmcli connection up eth0
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/6)
[root@router ~]# nmcli connection up eth1
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/7)
#查看网络信息
[root@router ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 00:0c:29:d0:65:d2 brd ff:ff:ff:ff:ff:ffaltname enp3s0altname ens160inet 172.25.254.100/24 brd 172.25.254.255 scope global noprefixroute eth0valid_lft forever preferred_lft foreverinet6 fe80::bf7:7246:70e2:bb83/64 scope link noprefixroute valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000link/ether 00:0c:29:d0:65:dc brd ff:ff:ff:ff:ff:ffaltname enp19s0altname ens224inet 192.168.0.100/24 brd 192.168.0.255 scope global noprefixroute eth1valid_lft forever preferred_lft foreverinet6 fe80::312a:e80c:80f6:2ca0/64 scope link noprefixroute valid_lft forever preferred_lft forever
[root@router ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.25.254.2    0.0.0.0         UG    102    0        0 eth0
172.25.254.0    0.0.0.0         255.255.255.0   U     102    0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     103    0        0 eth1
[root@router ~]# 
#打开内核路由
#检查是否打开了内核路由
[root@router ~]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 0
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0
#编辑配置文件
[root@router ~]# grep ip_forward /etc/sysctl.conf 
net.ipv4.ip_forward=1
[root@router ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@router ~]# sysctl -a | grep ip_forward
net.ipv4.ip_forward = 1
net.ipv4.ip_forward_update_priority = 1
net.ipv4.ip_forward_use_pmtu = 0
[root@router ~]#  
client:

eth0:NAT模式 172.25.254.200 gateway:172.25.254.100

[root@client ~]# cat /etc/NetworkManager/system-connections/eth0.nmconnection 
[connection]
id=eth0
type=ethernet
interface-name=eth0[ipv4]
address1=172.25.254.200/24,172.25.254.100
method=manual
#重启网卡
[root@client ~]# nmcli connection reload 
[root@client ~]# nmcli connection up eth0 
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/3)
[root@client ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.25.254.100  0.0.0.0         UG    100    0        0 eth0
172.25.254.0    0.0.0.0         255.255.255.0   U     100    0        0 eth0
#测试
[root@client ~]# for i in {1..10}; do curl 192.168.0.200; done
webserver1:192.168.0.10
webserver2:192.168.0.20
webserver2:192.168.0.20
webserver1:192.168.0.10
webserver2:192.168.0.20
webserver2:192.168.0.20
webserver1:192.168.0.10
webserver2:192.168.0.20
webserver2:192.168.0.20
webserver1:192.168.0.10
[root@client ~]#
lvs-火墙标记解决调度问题

在webserver1和webserver2安装mod_ssl模块让他们支持https

webserver1

[root@webserver1 ~]# dnf install mod_ssl -y
#重启httpd服务
[root@webserver1 ~]# systemctl restart httpd

webserver2

[root@webserver2 ~]# dnf install mod_ssl -y
#重启httpd服务
[root@webserver2 ~]# systemctl restart httpd

在lvs中追加加入调度策略

[root@lvs ~]# ipvsadm -A -t 192.168.0.200:443 -s rr
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.10:443 -g
[root@lvs ~]# ipvsadm -a -t 192.168.0.200:443 -r 192.168.0.20:443 -g
[root@lvs ~]# 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.0.200:80 wrr-> 192.168.0.10:80              Route   1      0          0         -> 192.168.0.20:80              Route   2      0          0         
TCP  192.168.0.200:443 rr-> 192.168.0.10:443             Route   1      0          0         -> 192.168.0.20:443             Route   1      0          0         
[root@lvs ~]# 

未加火墙前的测试:

client

这时候前一条是正确的当时后面应该是10

[root@client ~]# curl 192.168.0.200;curl -k https://192.168.0.200
webserver2:192.168.0.20
webserver2:192.168.0.20
[root@client ~]# 

lvs中为端口做标记,清空ipvsadm调度策略,写入火墙的策略

[root@lvs ~]# iptables -t mangle -nL
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         Chain INPUT (policy ACCEPT)
target     prot opt source               destination         Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
[root@lvs ~]# iptables -t mangle -A PREROUTING -d 192.168.0.200 -p tcp -m multiport --dports 80,443 -j MARK --set-mark 666
[root@lvs ~]# iptables -t mangle -nL
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
MARK       6    --  0.0.0.0/0            192.168.0.200        multiport dports 80,443 MARK set 0x42Chain INPUT (policy ACCEPT)
target     prot opt source               destination         Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
[root@lvs ~]# 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.0.200:80 wrr-> 192.168.0.10:80              Route   1      0          0         -> 192.168.0.20:80              Route   2      0          0         
TCP  192.168.0.200:443 rr-> 192.168.0.10:443             Route   1      0          0         -> 192.168.0.20:443             Route   1      0          0         
[root@lvs ~]# ipvsadm -C
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
[root@lvs ~]# ipvsadm -A -f 66 -s rr
[root@lvs ~]# ipvsadm -a -f 66 -r 192.168.0.10 -g
[root@lvs ~]# ipvsadm -a -f 66 -r 192.168.0.20 -g
[root@lvs ~]# ipvsadm -Ln
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
FWM  66 rr-> 192.168.0.10:0               Route   1      0          0         -> 192.168.0.20:0               Route   1      0          0         
[root@lvs ~]#   

测试:

clietn

[root@client ~]# curl 192.168.0.200;curl -k https://192.168.0.200
webserver2:192.168.0.20
webserver1:192.168.0.10
[root@client ~]# curl 192.168.0.200;curl -k https://192.168.0.200
webserver2:192.168.0.20
webserver1:192.168.0.10
[root@client ~]# curl 192.168.0.200;curl -k https://192.168.0.200
webserver2:192.168.0.20
webserver1:192.168.0.10
[root@client ~]# 
注意:

在配置vip不对外响应的时候需要永久设置的话可以使用sysctl -a | grep arp_ignore查看,把需要的内容写入到/etc/sysctl.conf中,然后再输入sysctl -p保存设定

[root@webserver1 ~]# sysctl -a | grep arp_ignore
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.default.arp_ignore = 0
net.ipv4.conf.eth0.arp_ignore = 0
net.ipv4.conf.lo.arp_ignore = 1
[root@webserver1 ~]# 

相关文章:

LVS知识点整理及实践

LVS知识点整理及实践 LVSlvs集群概念lvs概念lvs集群类型lvs-nat模型数据逻辑: lvs-DR模式数据传输和过程:特点: lvs-tun模式数据传输过程:特点: lvs-fullnet模式数据传输过程 lvs调度算法lvs调度算法类型lvs静态调度算法lvs动态调度算法4.15版本内核以后新增调度算法 ipvsadm命…...

Ubuntu gnome WhiteSur-gtk-theme类mac主题正确安装和卸载方式

目录 摘要目的安装和卸载特别说明 Ubuntu gnome WhiteSur-gtk-theme类mac主题正确安装和卸载方式 摘要 Ubuntu版本&#xff1a;ubuntu24.04 主题下载地址&#xff1a;https://github.com/vinceliuice/WhiteSur-gtk-theme 参考的安装教程&#xff1a;https://blog.51cto.com/u_…...

计算机毕业设计选题推荐-办公用品管理系统-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...

计算机毕业设计选题推荐-网上考试系统-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...

白骑士的Matlab教学基础篇 1.4 函数与脚本

系列目录 上一篇&#xff1a;白骑士的Matlab教学基础篇 1.3 控制流 函数和脚本是 MATLAB 编程中的基本组成部分&#xff0c;它们使得代码更加模块化、可重用和组织化。通过理解函数的定义与调用、参数与返回值&#xff0c;以及 MATLAB 脚本与批处理&#xff0c;可以显著提高编…...

Qt——多线程

一、QThread类 如果要设计多线程程序&#xff0c;一般是从QThread继承定义一个线程类&#xff0c;并重新定义QThread的虚函数 run() &#xff0c;在函数 run() 里处理线程的事件循环。 应用程序的线程称为主线程&#xff0c;创建的其他线程称为工作线程。主线程的 start() 函数…...

技术周总结 08.05-08.11周日(scala git回滚)

文章目录 一、08.06 周二1.1) 问题01 mac安装 scala:1. 使用 Homebrew2. 使用 SDKMAN!其他注意事项1. 确认 Scala 安装位置2. 设置 PATH 环境变量对于 zsh (macOS Catalina 及更高版本默认使用 zsh):对于 bash (如果您使用的是 bash shell): 3. 验证安装 二、08.09 周五2.1&…...

ffmpeg 命令图片和视频转换

1、截图 ffmpeg -i d:\input.mp4 -ss 0:0:10 d:\output.jpg //指定输出分辨率 ffmpeg -i d:\input.mp4 -y -f image2 -ss 0:0:10 -vframes 1 -s 640x360 d:\output.jpg 2、视频分拆图片 ffmpeg -r 输入帧率 -i d:\input.mp4 -r 输出帧率 "d:\outputDir\frame_%04d.jp…...

力扣 | 动态规划 | 在字符串的应用 | 最长回文子串、最长回文子序列、单词拆分、编辑距离

文章目录 1.最长回文子串2.最长回文子序列3.单词拆分4.编辑距离5. 共同点和思路6. 各个问题的思路和扩展1. 最长回文子串2. 最长回文子序列3. 单词拆分4. 编辑距离 在解答字符串动态规划的应用时&#xff0c;我们需要非常注意一个问题&#xff1a;   有时候我们定义 d p [ i …...

【docker】docker容器部署常用服务

1、容器部署nginx&#xff0c;并且新增一个页面 docker run -d -p 81:80 --name nginx2 nginx docker exec -it nginx2 /bin/bashcd /usr/share/nginx/html/ echo "hello world">>hello.html2、容器部署redis&#xff0c;成功部署后向redis中添加一条数据 do…...

CentOS 7.6 安装 Weblogic

注&#xff1a;本教程是以虚拟机作为安装环境&#xff0c;如果您公司需要安装 Weblogic 服务器&#xff0c;请先以虚拟机模拟安装一遍&#xff0c;否则出现失误&#xff0c;概不负责&#x1f601;。 一、环境 虚拟机&#xff1a;VMware Workstation 16 Linux&#xff1a;Cent…...

一键清除电脑隐私痕迹,Privacy Eraser助你轻松搞定!

前言 在数字时代&#xff0c;隐私就像是我们手中的细沙&#xff0c;不经意间就可能从指缝间溜走&#xff1b;你是否也曾担心&#xff0c;自己的每一次点击、每一次浏览&#xff0c;都可能成为别人眼中的“秘密”&#xff1f;别急&#xff0c;今天小江湖就要带你走进一款神秘的…...

火语言RPA桌面元素库使用方法

使用火语言RPA自动选取工具获得桌面中元素&#xff1a; 工具标识 桌面 分组下组件若有此标识&#xff0c;则包含选择元素工具&#xff0c;点击此标识会进行选择元素操作。 桌面元素库介绍 ① 根据元素名称筛选元素库中保存的元素 ② 元素库&#xff0c;显示已经保存的元素名…...

FTP.JBoss,Ldap,Rsync未授权访问漏洞(附带修复方法)

一.FTP未授权访问漏洞(匿名登陆) FTP 弱⼝令或匿名登录漏洞&#xff0c;⼀般指使⽤ FTP 的⽤户启⽤了匿名登录功能&#xff0c;或系统⼝令的⻓度太短、复杂度不够、仅包含数字、或仅包含字⺟等&#xff0c;容易被⿊客攻击&#xff0c;发⽣恶意⽂件上传或更严重的⼊侵⾏为。 漏…...

全新在线客服系统源码(pc+h5+uniapp+公众号小程序+抖音)附搭建接入教程

全新在线客服系统源码介绍 一、系统概述与优势 本系统是一款基于PHP的开源在线客服系统&#xff0c;支持PC端、移动端&#xff08;小程序&#xff09;、H5页面以及Uniapp多端接入。系统利用网络技术和人工智能技术&#xff0c;实现用户与客服人员的即时聊天沟通&#xff0c;有…...

为具有公网IPV6地址的服务器安装nextcloudAIO并使用NginxProxyManager配置反向代理

软件和硬件环境 ubuntu server 24.04&#xff0c;并已配置好ipv6公网地址&#xff0c;已安装好docker和docker-compose。一块单独的硬盘&#xff0c;用于单独存储nextcloud数据。&#xff08;非必需&#xff09;有一个能够正常解析的域名&#xff0c;并已配置好AAAA记录解析。…...

挖矿宝藏之TCP/IP

目录 一、TCP/IP简介 1.TCP自述 2.IP自述 二、TCP/IP 寻址 1.IP V6 2.域名 三、TCP/IP协议 一、TCP/IP简介 TCP/IP 指传输控制协议/网际协议&#xff08;Transmission Control Protocol / Internet Protocol&#xff09;&#xff0c;是供已连接因特网的计算机进行通信的…...

略谈set与map的pair封装与进入哈希

引子&#xff1a;之前我们讲了红黑树的自实现&#xff0c;与小小的接口实现&#xff0c;那set与map的pair封装是如何实现的呢&#xff1f;&#xff0c;今天我们来一探究竟&#xff0c;而且我们也要进入新章节--哈希 对于operator--()的封装&#xff1a; 注意&#xff1a;牢记思…...

android13 串口编号修改 串口名修改

总纲 android13 rom 开发总纲说明 目录 1.前言 2.技术分析 别名定义的语法规则 3.修改示例 使用别名 注意事项 4.不生效分析 5.编译查看 6.其他方法 7.彩蛋 1.前言 更改Android设备的串口编号涉及对系统深层次的配置进行修改,通常是为了解决硬件兼容性问题或满足特…...

工作中常用的软件竟可直接下载0.5m卫星影像(Esri影像、天地图、星图)、DEM、土地覆盖数据...

之前我们有介绍过在ArcGIS通过插件、WTMS或者lyr添加谷歌影像、天地图等各种在线图源。今天我们就来再整理一套既方便查看又方便下载的教程&#xff0c;软件就是我们常用的Global Mapper&#xff0c;有点强。 这里我们整理了一些我们工作学习中常用的一些数据下载方法&#xf…...

Phi-4-mini-reasoning科研协作:Jupyter Notebook嵌入式推理插件

Phi-4-mini-reasoning科研协作&#xff1a;Jupyter Notebook嵌入式推理插件 1. 模型简介 Phi-4-mini-reasoning是一个基于合成数据构建的轻量级开源模型&#xff0c;专注于高质量、密集推理的数据处理能力。作为Phi-4模型家族的一员&#xff0c;它经过专门微调以提升数学推理…...

【Typst源文件】Typst 纸张定义完全指南

Typst 通过 page 函数来定义纸张的尺寸、边距、方向等属性。通常使用 #set page() 规则在文档开头进行全局设置。 1. 基础纸张设置 1.1 使用标准纸张尺寸 Typst 支持丰富的标准纸张尺寸&#xff0c;只需传入纸张名称字符串即可&#xff1a; // 设置为 A4 纸张&#xff08;默…...

Intv_AI_MK11跨平台开发体验:在Windows WSL2中无缝使用GPU进行模型调试

Intv_AI_MK11跨平台开发体验&#xff1a;在Windows WSL2中无缝使用GPU进行模型调试 1. 为什么选择WSL2进行AI开发 对于习惯Windows系统的开发者来说&#xff0c;直接使用Linux环境进行AI模型开发往往面临诸多不便。WSL2&#xff08;Windows Subsystem for Linux 2&#xff09…...

实战应用:基于快马平台开发排序算法性能对比分析工具

今天想和大家分享一个特别实用的工具开发经历——用InsCode(快马)平台快速搭建了一个排序算法性能对比分析工具。这个项目不仅帮我巩固了算法知识&#xff0c;还意外发现了很多实际应用中的细节问题&#xff0c;特别适合用来理解不同排序算法的实战表现。 1. 为什么需要这个工…...

ED-最优设计实战:如何用Python实现鲁棒实验设计(附完整代码)

ED-最优设计实战&#xff1a;如何用Python实现鲁棒实验设计&#xff08;附完整代码&#xff09; 在数据科学和工程领域&#xff0c;实验设计是优化参数估计和模型性能的关键环节。传统D-最优设计虽然经典&#xff0c;但在面对参数不确定性时往往表现不佳。本文将带你深入理解ED…...

Ostrakon-VL扫描终端实战教程:像素特工式零售图像识别部署指南

Ostrakon-VL扫描终端实战教程&#xff1a;像素特工式零售图像识别部署指南 1. 像素特工终端介绍 想象你是一位未来世界的零售侦探&#xff0c;手持高科技扫描仪在商店里穿梭。Ostrakon-VL扫描终端就是你的数字助手&#xff0c;它能帮你"看"懂货架上的每一个细节。这…...

AI头像生成器开发者必备:GitHub项目管理核心技巧详解

AI头像生成器开发者必备&#xff1a;GitHub项目管理核心技巧详解 1. 引言&#xff1a;为什么GitHub对AI头像生成器项目至关重要 开发一个AI头像生成器项目时&#xff0c;你是否遇到过这些挑战&#xff1a;团队成员同时修改同一文件导致冲突、新功能上线后出现意外bug却无法快速…...

告别手速焦虑:Python大麦网自动抢票脚本终极指南

告别手速焦虑&#xff1a;Python大麦网自动抢票脚本终极指南 【免费下载链接】Automatic_ticket_purchase 大麦网抢票脚本 项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase 还在为心仪演出门票秒光而烦恼吗&#xff1f;每次热门演唱会开票…...

突破限制:NCM音乐格式转换与跨平台播放完全指南

突破限制&#xff1a;NCM音乐格式转换与跨平台播放完全指南 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 音乐文件解密是许多音乐爱好者面临的实际需求&#xff0c;尤其是当你希望在不同设备上自由播放从网易云音乐下载的NCM格式文…...

WSL2下USB串口设备‘失踪’?手把手教你找回/dev/ttyUSB0(以Quectel模块为例)

WSL2下USB串口设备消失的终极解决方案&#xff1a;从原理到实战 最近在WSL2环境下调试Quectel模块时&#xff0c;发现一个奇怪现象&#xff1a;lsusb明明能识别设备&#xff0c;但/dev/ttyUSB0却神秘失踪。这让我想起去年调试树莓派时遇到的类似问题&#xff0c;但WSL2的环境特…...