章工运维 章工运维
首页
  • linux
  • windows
  • 中间件
  • 监控
  • 网络
  • 存储
  • 安全
  • 防火墙
  • 数据库
  • 系统
  • docker
  • 运维工具
  • other
  • elk
  • K8S
  • ansible
  • Jenkins
  • GitLabCI_CD
  • 随笔
  • 面试
  • 工具
  • 收藏夹
  • Shell
  • python
  • golang
友链
  • 索引

    • 分类
    • 标签
    • 归档
    • 首页 (opens new window)
    • 关于我 (opens new window)
    • 图床 (opens new window)
    • 评论 (opens new window)
    • 导航栏 (opens new window)
周刊
GitHub (opens new window)

章工运维

业精于勤,荒于嬉
首页
  • linux
  • windows
  • 中间件
  • 监控
  • 网络
  • 存储
  • 安全
  • 防火墙
  • 数据库
  • 系统
  • docker
  • 运维工具
  • other
  • elk
  • K8S
  • ansible
  • Jenkins
  • GitLabCI_CD
  • 随笔
  • 面试
  • 工具
  • 收藏夹
  • Shell
  • python
  • golang
友链
  • 索引

    • 分类
    • 标签
    • 归档
    • 首页 (opens new window)
    • 关于我 (opens new window)
    • 图床 (opens new window)
    • 评论 (opens new window)
    • 导航栏 (opens new window)
周刊
GitHub (opens new window)
  • linux

    • rsync

      • rsync用法及参数详解
      • rsync服务实现推送,拉取
    • dns

    • sed、awk、grep、find四剑客

    • LVM管理
    • sudo权限规划
    • linux修改网卡为eth0的两种方法
    • Logrotate入门了解及生产实践
    • linux中用dd命令来测试硬盘读写速度
    • linux 阿里云盘挂载错误
    • CentOS7安装Android SDK
    • centos7安装更新git
    • linux启动顺序
    • centos7升级openssl
    • expect工具的安装和使用方法
    • linux下使用v2ray
    • centos7安装java环境的两种方式
    • linux-centos7系统设置时区及同步时间
    • rsyslog日志系统:rsyslog配置文件
    • rsyslog的安装、使用、详解
    • safe-rm防止删除重要的文件
    • linux如何获取打开文件和文件描述符数量
    • LVS集群-DR模式
      • 服务概述:
        • Direct Routing(直接路由)
        • IP Tunneling(IP隧道)
        • Direct Routing 和IP Tunneling 区别:
        • DR模式实际拓扑图及工作DR方式工作流程图:
        • LVS DR模式工作原理:
      • 实战:配置LVS-DR集群
    • linux服务器安装ffmpeg
    • linux服务器安装samba
    • 使用openssl创建自签发证书
    • linux服务器部署next.js服务
    • linux服务器ionice命令使用方式
    • linux服务器curl命令常用操作
  • windows

  • 中间件

  • 网络

  • 安全

  • 存储

  • 防火墙

  • 数据库

  • 系统

  • docker

  • other

  • 监控

  • 运维
  • linux
章工运维
2024-07-19
目录

LVS集群-DR模式

# LVS-DR和LVS-IP TUN集群概述

# 服务概述:

# Direct Routing(直接路由)

director分配请求到不同的real server。real server处理请求后直接回应给用户,这样director负载均衡器仅处理客户机与服务器的一半连接。负载均衡器仅处理一半的连接,避免了新的性能瓶颈,同样增加了系统的可伸缩性。Direct Routing由于采用物理层(修改MAC地址)技术,因此所有服务器都必须在一个网段中。

# IP Tunneling(IP隧道)

director分配请求到不同的real server。real server处理请求后直接回应给用户,这样director负载均衡器仅处理客户机与服务器的一半连接。IP Tunneling技术极大地提高了director的调度处理能力,同时也极大地提高了系统能容纳的最大节点数,可以超过100个节点。real server可以在任何LAN或WAN上运行,这意味着允许地理上的分布,这在灾难恢复中有重要意义。服务器必须拥有正式的公网IP地址用于与客户机直接通信,并且所有服务器必须支持IP隧道协议。

# Direct Routing 和IP Tunneling 区别:

Direct Routing与IP Tunneling相比,没有IP封装的开销,但由于采用数据链路层(修改MAC地址)技术,所有服务器都必须在一个物理网段。

# DR模式实际拓扑图及工作DR方式工作流程图:

Lvs-dr的工作原理:Deiector收到请求,将请求转发给了我们的realserver,但是接下来的工作就是我们的realserver和我们的客户端进行通讯了,所以原理图如下

aed8e7cd1a267958.jpg

# LVS DR模式工作原理:

MAC转换过程

实例场景设备清单: director分发器,IP: 192.168.1.70, VIP : 192.168.1.63

a35ae2716395019e.jpg

client基本信息: IP:192.168.1.101向目标vip发出请求,Director接收。此时IP包头及数据帧头信息如下:

8a87d31ad5a718e2.jpg

Director分发器根据负载均衡算法选择一台active的realserver(假设是192.168.1.62),将此RIP所在网卡的mac地址作为目标mac地址,发送到局域网里。此时IP包头及数据帧头信息如下:

b2bf481d482dc083.jpg

realserver(192.168.1.62)在局域网中收到这个帧,拆开后发现目标IP(VIP)与本地匹配,于是处理这个报文。随后重新封装报文,发送到局域网。此时IP包头及数据帧头信息如下:

ed04a7f84ab72150.jpg

如果client与VS同一网段,那么client(192.168.1.101)将收到这个回复报文。如果跨了网段,那么报文通过gateway/路由器经由Internet返回给用户。

归纳一下:

1)接收client的请求,根据你设定的负载均衡算法选取一台realserver的ip;

2)以选取的这个ip对应的mac地址作为目标mac,然后重新将IP包封装成帧转发给这台RS;

3)在hash table中记录连接信息。

数据包、数据帧的大致流向是这样的:client --> VS --> RS --> client

以上就是对LVS/DR模式的原理介绍

为什么需要DR?  因为NAT模式效率太低。

DR方式特点?成本?都是公网地址

网络转发:

基于2层的数据报文的转发, 要比基于3层的网络转发效率要高

lvs-DR 是基于2层的转发, 所以在LVS中所有的模式, 效率是最好的

1):基于mac的数据报文转发, 是效率最好的, 但是是根据交换机的MAC地址表来实现的

MAC表主要告诉你, 到xxxx地方该走那个端口

如果交换不知道对方在哪儿, 这个时候, 他就要进行广播, 就问xxxx在哪儿, 如果对应的设备给了回应, 那么交换机也就更新了自己的MAC地址表 记录到xxxx需要走这个端口

2):2层设备不具有路由功能, 那么广播也就不具有跨路由的功能, 所有要实现mac地址广播, 必须在同一物理网段

3):vlan具有隔离广播的功能, 所有要能处理mac地址广播, 就应该在同一个VLAN中

因此: 如果要实现LVS-DR模式

1): 所有的设备应该在同一个物理网段

2): 所有的设备都应该在同一个广播域中

LVS-DR模式工作原理:

1), DR模式, 全程目标地址, 原地址不变, 因为DR模式工作于2层

2), 请求报文从客户端发出:

原地址: CIP   源MAC  CMAC    目标地址: VIP   目标mac: xxx

3), 请求报文到达机房防火墙之后, 会在防火墙的内网口进行广播, 找到VIP在哪儿 然后把包丢出去

原地址: CIP   目标地址: VIP

源MAC: FMAC        目标MAC: VMAC

4), 报文到达director之后, 解包, 发现目标mac是自己, 开始解析这个报文

处理完成, 通过自定义的一个调度算法, 转发报文到达其中一台RS上

原地址: CIP   目标地址: VIP

源mac: DMAC    目标MAC: RMAC

5), 数据报文到达RS之后, 进行节封装, 发现目标mac是自己, 开始解析, 发现VIP也有,开始处理

6), 处理完成之后, 数据直接通过RS流向客户端

# 实战:配置LVS-DR集群

分发器IP配置

从拓扑图看出我们的eth0有2个IP地址,所以我们需要配置eht0和eth0:1两个IP

DIP===ens33===192.168.1.70                 VIP===ens33:1===192.168.1.63

配置IP:

DIP: ens33      ip地址:  192.168.1.70

VIP: ens33:1      ip地址:  192.168.1.63

[root@xuegod63 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33  #以配置以下信息

IPADDR=192.168.1.70

NETMASK=255.255.255.0

GATEWAY=192.168.1.1

DNS1=202.96.134.133

网关:192.168.1.1

生成ens33:1配置文件

[root@xuegod63 network-scripts]# pwd

/etc/sysconfig/network-scripts

[root@xuegod63 network-scripts]# cp ifcfg-ens33 ifcfg-ens33:1

[root@xuegod63 network-scripts]# vim ifcfg-ens33:1   #写入以下内容

DEVICE=ens33:1

NM_CONTROLLED=yes

IPADDR=192.168.1.63

NETMASK=255.255.255.0

ONBOOT=yes

TYPE=Etherneten

BOOTPROTO=none

IPV6INIT=no

USERCTL=no

PREFIX=24

DEFROUTE=yes

IPV4_FAILURE_FATAL=yes

NAME="ens33:1"

HWADDR=00:0C:29:12:EC:1E   #Mac地址必需要写成和eth0一样,否则出不来eth0:1这个网卡设备

[root@xuegod63 network-scripts]# service network restart

[root@xuegod63 network-scripts]# ifconfig   #查看是否有ens33 和ens33:1

[root@xuegod63 network-scripts]# ifconfig

ens33      Link encap:Ethernet  HWaddr 00:0C:29:12:EC:1E

inet addr:192.168.1.70  Bcast:192.168.1.255  Mask:255.255.255.0

inet6 addr: fe80::20c:29ff:fe12:ec1e/64 Scope:Link

UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

RX packets:3266 errors:0 dropped:0 overruns:0 frame:0

TX packets:322 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:1000

RX bytes:239961 (234.3 KiB)  TX bytes:22832 (22.2 KiB)

ens33:1    Link encap:Ethernet  HWaddr 00:0C:29:12:EC:1E

inet addr:192.168.1.63  Bcast:192.168.1.255  Mask:255.255.255.0

UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

配置LVS-DR规则:

[root@xuegod63 network-scripts]# rpm -ivh /mnt/Packages/ipvsadm-1.25-9.el6.x86_64.rpm

ipvsadm -C 清空之前规则

[root@xuegod63 ~]# ipvsadm -A -t 192.168.1.63:80 -s rr

[root@xuegod63 ~]# ipvsadm -a -t 192.168.1.63:80 -r 192.168.1.62 -g

[root@xuegod63 ~]# ipvsadm -a -t 192.168.1.63:80 -r 192.168.1.64 -g

ipvsadm -S >/etc/sysconfig/ipvsadm-config 保存到配置文件

注: -g 表示DR模式 , -m 表示IP tun 模式

[root@xuegod63 ~]# ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.1.63:80 rr

-> 192.168.1.62:80              Route   1      0          0

-> 192.168.1.64:80              Route   1      0          0

注:三个LVS 模式中,只有NAT模式需要开启 路由转发功能。 DR和TUN模式不需要开启。

两台RealServer的IP配置:

xuegod62:

配置IP:192.168.1.62

1、配置ip  eth0,桥接模式

ifconfig eth0 192.168.1.62/24

2、回环接口

[root@xuegod62 ~]# ifconfig lo:1 192.168.1.63 netmask 255.255.255.255

生成回环口配置文件:

[root@xuegod62 network-scripts]# pwd

/etc/sysconfig/network-scripts

[root@xuegod62 network-scripts]# cp ifcfg-lo ifcfg-lo:1

[root@xuegod62 network-scripts]# cat ifcfg-lo:1

DEVICE=lo:1

IPADDR=192.168.1.63

NETMASK=255.255.255.255

#If you're having problems with gated making 127.0.0.0/8 a martian,

#you can change this to something else (255.255.255.255, for example)

ONBOOT=yes

NAME=loopback

3、网关指向公网出口路由器IP:

[root@xuegod62 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33

GATEWAY=192.168.1.1

4、启动80端口

echo  192.168.1.62 > /var/www/html/index.html

service httpd restart

2.2.3  关闭ARP转发(在两台RS上都需要同样的操作)。

同一个广播域: 配置了多个相同的VIP  是不允许的, 要想实现,就必须让外面的网络, 无法发现这个VIP的存在

因此 在Linux里面, 可以修改内核参数,  实现接口IP的广播不响应、不广播

arp_ignore = 1  表示只回答目标IP是访问本地网络对应接口的arp请求

arp_announce = 2  只宣告本机网卡直连网络所在的ip的arp广播

[root@xuegod62 ~]#  echo 1 > /proc/sys/net/ipv4/conf/ens33/arp_ignore

[root@xuegod62 ~]# echo 2 >  /proc/sys/net/ipv4/conf/ens33/arp_announce

永久生效:(注意realserver的实际link ok的网卡是不是ens33)

[root@xuegod62 ~]# vim /etc/sysctl.conf #最后添加

net.ipv4.conf.ens33.arp_ignore = 1

net.ipv4.conf.ens33.arp_announce = 2

或:

net.ipv4.conf.ens33.arp_ignore = 1

net.ipv4.conf.ens33.arp_announce = 2

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

[root@xuegod62 ~]# sysctl -p

参数说明:

arp_ignore 为:1  #  - 只回答目标IP地址是访问本网络接口(eth0)的ARP查询请求。

自己的理解:

在设置参数的时候将arp_ignore 设置为1,意味着当别人的arp请求过来的时候,如果接收的网卡设备上面没有这个ip,就不做出响应,默认是0,只要这台机器上面任何一个网卡设备上面有这个ip,就响应arp请求,并发送mac地址。

arp_announce  (宣告) 为2

2 - 对查询目标使用最适当的本地地址。例如,如果在eth0接口上接受到了一个VIP的arp请求包。内核判断这个VIP地址是不是eth0接口上的IP一样。如果一样,则回复这个包。如果不一样,就丢弃不回应。

配置real server xuegod64

配置IP: 192.168.1.64

1、配置ip  ens33 ,桥接模式

ifconfig ens33 192.168.1.64/24

2、回环接口

[root@xuegod64 ~]# ifconfig lo:1 192.168.1.63 netmask 255.255.255.255

生成回环口配置文件:

[root@xuegod64 network-scripts]# pwd

/etc/sysconfig/network-scripts

[root@xuegod64 network-scripts]# cp ifcfg-lo ifcfg-lo:1

[root@xuegod64 network-scripts]# cat ifcfg-lo:1

DEVICE=lo:1

IPADDR=192.168.1.63

NETMASK=255.255.255.255

#If you're having problems with gated making 127.0.0.0/8 a martian,

#you can change this to something else (255.255.255.255, for example)

ONBOOT=yes

NAME=loopback

3、关闭ARP转发。

[root@xuegod64 ~]# echo 1 > /proc/sys/net/ipv4/conf/ens33/arp_ignore

[root@xuegod64 ~]# echo 2 >  /proc/sys/net/ipv4/conf/ens33/arp_announce

永久生效:(注意realserver的实际link ok的网卡是不是eth0)

[root@xuegod64 ~]# vim /etc/sysctl.conf #最后添加

net.ipv4.conf.ens33.arp_ignore = 1

net.ipv4.conf.ens33.arp_announce = 2

或:

net.ipv4.conf.ens33.arp_ignore = 1

net.ipv4.conf.ens33.arp_announce = 2

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

[root@xuegod64 ~]# sysctl -p

4、网关指向公网出口路由器IP:

[root@xuegod64 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33

GATEWAY=192.168.1.1

5、启动80端口

echo  192.168.1.64 > /var/www/html/index.html

service httpd restart

客户端测试访问vip:

先测试real server  :

http://192.168.1.62

http://192.168.1.64

或物理机上测试:

http://192.168.1.63/

注: 测试时,不要在分发器上测试。那样测试是不行的

2.3  LVS的多种调度模式:

[root@xuegod63 ~]# ipvsadm -h

--scheduler    -s scheduler(ˈskejələr调度)  one of rr|wrr|lc|wlc|lblc|lblcr|dh|sh|sed|nq, the default scheduler is wlc.

循法
-s wrr 带权重的循环法
-s lc 最少连接法
-s wlc 带权重的最少连接法
-s lblc 基于本地的最少连接法
-s dh 目标散列法
-s sh 源散列法
-s sed 最短预期延迟法
-s nq 永不排队法

注:调度算法配置后立即生效,就像iptables配置规则一样。

2.3.1  每个调度算法详细说明:


1、rr  -  round robin

--- 在服务器池中无穷的循环中遍历

2、wrr  -  Weighted Round Robin

--- 基于集群节点可以处理多少来分配给每个节点一个权重值。权重值为2的服务器将收到权重值为1的服务器的两倍的连接数量。如果服务器的权重为0 ,则不会收到新的连接请求(但当前活动的已经建立的连接将不会丢失)。

3、lc  -  Least-Connection

--- 当新的请求到达director时,director查看活动和非活动的连接数量,以确定把请求分发给哪个服务器。

director将集群节点目前的活动连接数量x256 再加上不活动的连接数量,得到节点的开 销值。最低开销值的节点胜出,被分发给新的入站请求。(如果开销一样,则第一个节点被选中)

4、wlc  -  Weighted Least-Connection

--- 先如上算出集群节点的开销值,然后除以分配给其的权重值,最小值节点胜出,将入站请求分发给它。

5、lblc - Locality-Based  Least-Connection

--- 基于局部的最小连接,当real server是缓存服务器时用得比较多

6、lblcr  -  Locality-Based Least-Connection with Replication

--- 带复制的基于局部的最小连接,当real server是缓存服务器时用得比较多

7、dh  -  Destination Hashing

8、sh  -  Source  Hashing

--- 同一个ip的客户端总是分发给同一个real server。

让客户端总是能访问到自己的会话信息,这种机制叫会话保持。

基于ip地址标识客户端的缺点:很多内网用户会伪装成公网ip,来访问服务器,不能人为的控制负载均衡。

比较高级的方法是基于客户端提供我们的session id来实现会话保持。

haproxy(做负载均衡的软件)可以实现基于会话信息来判断保持会话。

扩展:

如何保持会话一致:

1、如果总是保持和一个RS会话,这台RS如果故障了,要确定另一个RS也有会话信息,所有的RS保持数据同步。

会话同步的方法:

1、所有的RS把自己的会话信息保存到数据库当中(memcached软件)。

9、sed  - Shortest Expected Delay最短延时预测  (Ci+1)/Ui  Ci连接数  Ui权重值

--- 在wlc方法上做了轻微改进,这些服务使用tcp,而且当群节点在处理每个请求时保持

在活动状态。

计算方法: 每个休群节点的开销值是通过将活动的连接数加1计算的。然后开销值除以

分配 给每个节点的权重,以取得SED值,具有最低SED值的集群节点胜出。

10、nq  -  Never  Queue没有队列,分配请求给空闲的服务器,没有空闲的就找响应最快的,

--- 如果集群节点中没有活动的连接 ,不管每个集群节点SED计算值的结果,它始终被

分配置服务的新入站请求。

HTTP的会话(session)信息:

cookies客户端(client)自己保存缓存

会话(session)服务器(server)端保存

2.3.2  实例:

例1:测试LVS 其它调度算法,如LVS-DR  wrr   diào dù

[root@xuegod63 ~]# ipvsadm -C

[root@xuegod63 ~]# ipvsadm -A -t 192.168.1.63:80 -s wrr

[root@xuegod63 ~]# ipvsadm -a -t 192.168.1.63:80 -r 192.168.1.62 -g -w 10

[root@xuegod63 ~]# ipvsadm -a -t 192.168.1.63:80 -r 192.168.1.64 -g -w 20

[root@xuegod63 ~]# ipvsadm -L -n --stats

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes

-> RemoteAddress:Port

TCP  192.168.1.63:80                     0        0        0        0        0

-> 192.168.1.62:80                     0        0        0        0        0

-> 192.168.1.64:80                     0        0        0        0        0

测试:

在物理机上,刷新9次这个链接:http://192.168.1.63/

查看:

[root@xuegod63 ~]# ipvsadm -L -n --stats

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes

-> RemoteAddress:Port

TCP  192.168.1.63:80                     9       45        0     6111        0

-> 192.168.1.62:80                     3       15        0     2037        0

-> 192.168.1.64:80                     6       30        0     4074        0

#一共9次连接, xuegod62:xuegod64  是 1:2 关系。  说明权重越大,获得的连接说越多。

例2:如果一个real server 的权重是0,将不再分配给他客户端的请求

[root@xuegod63 ~]# ipvsadm -C

[root@xuegod63 ~]#  ipvsadm -A -t 192.168.1.63:80 -s wrr

-s  wrr 加权轮循

[root@xuegod63 ~]#  ipvsadm -a -t 192.168.1.63:80 -r 192.168.1.62 -g -w 0

[root@xuegod63 ~]# ipvsadm -a -t 192.168.1.63:80 -r 192.168.1.64 -g -w 20

在物理机上,刷新9次这个链接:http://192.168.1.63/ (opens new window)

查看:

root@xuegod63 ~]# ipvsadm -L -n --stats

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port               Conns   InPkts  OutPkts  InBytes OutBytes

-> RemoteAddress:Port

TCP  192.168.1.63:80                     8       40        0     5432        0

-> 192.168.1.62:80                     0        0        0        0        0  #62的请求数为0

-> 192.168.1.64:80                     8       40        0     5432        0

另外:

ipvsadm -L -n --stats

发现进来的包是有的,但是出去的包为0

InPkts                  OutPkts

有                            0

因为数据包出去时,直接交给了real server,而没有交给Director

扩展:

ipvsadm 更多参数说明

-L -n  ==>  查看规则,显示内核虚拟服务器表

-L -n -c ==> 查看客户端连接分发器和real server 的情况

例1:[root@xuegod63 ~]# ipvsadm -L -n -c

IPVS connection entries

pro expire state       source             virtual            destination

TCP 01:33  TIME_WAIT   192.168.1.100:49698 192.168.1.70:80    192.168.1.62:80

TCP 01:26  TIME_WAIT   192.168.1.100:49690 192.168.1.70:80    192.168.1.64:80

TCP 01:57  TIME_WAIT   192.168.1.100:49739 192.168.1.70:80    192.168.1.62:80

-L -n --stats  ==>  查看分发情况

-L -n --rate  ==> 查看速率

• -Z --zero 虚拟服务表计数器清零(清空当前的连接数量等)

例1:[root@xuegod63 ~]# ipvsadm -Z

[root@xuegod63 ~]# ipvsadm -L -n --stats

IP Virtual Server version 1.2.1 (size=4096)

实例2:删除一条记录

[root@xuegod63 ~]# ipvsadm -d -t 192.168.1.63:80 -r 192.168.1.64

[root@xuegod63 ~]# ipvsadm -L -n

IP Virtual Server version 1.2.1 (size=4096)

Prot LocalAddress:Port Scheduler Flags

-> RemoteAddress:Port           Forward Weight ActiveConn InActConn

TCP  192.168.1.63:80 rr

-> 192.168.2.62:80              Masq    1      0          0

-C --clear 清除内核虚拟服务器表中的所有记录。

例3: 清空所有记录

[root@xuegod63 ~]# ipvsadm -C

微信 支付宝
上次更新: 2024/11/08, 12:33:03

← linux如何获取打开文件和文件描述符数量 linux服务器安装ffmpeg→

最近更新
01
shell脚本模块集合
05-13
02
生活小技巧(认知版)
04-29
03
生活小技巧(防骗版)
04-29
更多文章>
Theme by Vdoing | Copyright © 2019-2025 | 点击查看十年之约 | 鄂ICP备2024072800号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式