自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(43)
  • 收藏
  • 关注

原创 BGP:06 手动汇总路由

当聚合路由重新进入AS_Set属性中列出的任何一个AS时,BGP将会检测到自己的AS号在聚合路由的AS_Set属性中,于是会丢弃该聚合路由,从而避免了路由环路的形成。如 R5 的BGP 路由表中存在有 172.16.1.0/24 的路由时,才触发其产生汇总路由,172.16.0.0/21 ,而当明细路由172.16.1.0/24 丢失,则 R5 不再通告该条汇总路由,那么就需要使用origin-policy 关键字了。R5通告的是属性没有经过任何修改的路由,其聚合路由的 Origin 属性是 i。

2024-01-29 15:26:46 1056

原创 BGP:05 BGP自动路由汇总

配置自动聚合后,BGP将按照自然网段聚合路由(例如非自然网段A类地址10.1.1.1/24和10.2.1.1/24将聚合为自然网段A类地址10.0.0.0/8),并且BGP向对等体只发送聚合后的路由。自动路由聚合是在自然边界路由器上自动执行的,在默认情况下,BGP的自动路由聚合功能是关闭的,并且BGP不会自动聚合BGP邻居发送的路由以及使用network 命令通告的路由。路由汇总,能有效地减少 BGP 路由器通告的路由条目数量,减小设备的路由表规模,并将拓扑变化产生的影响限制在一个相对更小的范围内。

2024-01-28 23:28:09 376

原创 BGP:04 fake-as

使用 fake-as 可以将本地真实的 AS 编号隐藏,其他 AS 内的对等体在指定本端对等体所在的AS 编号时,应该设置成这个伪AS 编号。R1 所在的 AS 100 不愿意改变配置指向 AS 2000,还是指向 AS 200。R2 R3 删掉 bgp 200 ,配置为 bgp 2000。改成 as 2000 后,R1 R2 之间是建立不了。设置了 fake-as 之后,邻居就能建立了。AS 200 变成 AS 2000。R2 上配置 fake-as。正常配置好,邻居都能建立。

2024-01-28 22:10:49 582

原创 BGP:03 BGP路由

下一跳为 3.3.3.3 而R1 是可以通过 OSPF 协议到在 3.3.3.3 的,路由可达了,就是可用且最优的。这是实验拓扑,IBGP 利用环回口建立邻居,IGP 协议为 OSPF, EBGP 通过物理接口建立邻居。在R1 上是无法到达 192.168.34.4 ,下一跳不可达,所以学习到的路由是不可用的。查看BGP路由,R3 上学习到的BGP 路由,都是可用且最优的。在R3 上查看BGP 的邻居关系,都是已建立。但在R1 R2 上看到的路由是有问题的,查看OSPF 邻居关系,邻居是建立好的。

2024-01-28 18:44:47 233

原创 BGP:02 BGP认证

如果两端的时间不一致,会协商,最后选择小的时间,在配置时如果hold 时间少于 20 ,会有提示信息的,提示邻居可能会有波动。选用Periodic Daily模式,每天 8点到 18 使用key-id 1对BGP报文做hash运算。认证是指路由器对路由信息来源的可靠性及路由信息本身的完整性进行检测的机制。cipher密钥会被加密,simpler是明文显示,但不影响邻居的建立。时间太长,认证之后,效果不明显,可以将计时器改的小一些。R1 做认证,R2 没做,邻居不能正常建立。先删掉R1 R2 上的简单认证。

2024-01-28 16:39:31 202

原创 BGP:01 BGP基本配置

例如,在一段时间内,对端升级或调整链路导致邻居频繁建立连接时,为了避免路由或邻居关系频繁震荡,需要暂时中断BGP邻居,则可以在较稳定的一端使用该命令。使用Loopback 接口建立BGP邻居关系比使用物理接口建立相比较,前者具有更好的稳定性,且能够减少设备资源的开销。BGP 没有自动建立邻居关系的能力,邻居关系必须通过手动配置来建立。可以通过物理接口,或环回口来建立邻居关系。2、当两台 BGP 路由器位于不同的AS 时(AS 编号不同),它们的邻居关系为 EBGP 邻居关系。使用环回口来建立BGP 邻居。

2024-01-28 14:40:55 283

原创 IS-IS:10 ISIS路由渗透

level-1 区域内的路由信息会通过 level-1-2 路由器通报给 level-2 区域,即 level-1-2 路由器会将学习到的 level-1 路由信息封装进 level-2 LSP ,并将些 level-2 LSP 传递给其他 level-2 和 level-1-2 路由器。IS-IS 路由渗透指的是Level 1-2 和Level-2 路由将自己知道的其他 Level-1区域以及Level-2区域的路由信息通报给指定的Level-1区域的过程。配置完成,查看一下邻居关系的建立。

2024-01-27 23:06:45 901

原创 IS-IS:09 ISIS路由过滤

在IS-IS 网络中,有时需要使用 filter-policy 工具对 IS-IS 路由进行过滤。这里所说的过滤,是指路由器在将自己IS-IS 路由表中的某些 IS-IS 路由纳入进自己的 IP 路由表的过程,一些满足了过滤条件的 IS-IS 路由将被限制纳入 IP 路由表中。需要注意的是, filter-policy 进行过滤的并非是生成那些 IS-IS 路由的 LSP ,所以 filter-policy 进行路由过滤之后,路由器中的 IS-IS 链路状态数据库和 IS-IS 路由表都不会受到任何影响。

2024-01-27 21:55:58 845

原创 IS-IS:08 ISIS路由引入

IS-IS 网络能够引入其他路由协议的路由和其他 IS-IS 协议进程的路由。IS-IS 协议在引入外部路由时,可以手动配置引入路由的开销值,并可以使用 route-policy 对引入的路由进行过滤。对于 External 类型的 cost ,在 IP 路由表中的 cost 值的计算方法为,64+ IS-IS 路由表中的 IntCost+ IS-IS 路由表中的 ExtCost。配置 OSPF IS-IS协议,R3环回口通过路由引入放到IS-IS中。在R2 上查看IS-IS路由表。

2024-01-27 20:41:59 395

原创 IS-IS:07 ISIS缺省路由

IS-IS 有两种缺省路由,第一种缺省路由是由 level-1 路由器在特定条件下自动产生的,它的下一跳是离它最近的 (cost 最小)level-1-2路由器。默认情况下,路由器使用default-route-advertise 命令发布缺省路由,无论自己是否有,都向邻接关系路由器发布。但如果R2连接骨干区域的链路发生故障,R2将不会再把自己产生的Level-1 LSP 的ATT位设置为1,而设置为 0。由R2 产生的,ATT位被设置为 1 的 Level-1 LSP。配置之后,R1 不再有缺省路由。

2024-01-27 19:05:32 1098

原创 IS-IS:06 ISIS路由汇总

level-1-2 路由器分别维护 level-1和 level-2 链路状态数据库,level-1-2 路由器能将 level-1 路由表中的路由(不必一定是直连路由)进行聚合后以 level-1 LSP 的形式发送给其他路由器,将 level-2 路由表中的路由(不必一定是直连路由)进行聚合后以 level-2 LSP 的形式发送给其他路由器,并且还能够将 level-1 路由表中的路由(不必一定是直连路由)聚合以后以 level-2 LSP 的形式发送给其他路由器。聚合后路由表没有任何变化。

2024-01-27 00:34:47 700

原创 IS-IS:05 ISIS开销值和协议优先级

采用auto-cost 计算确定接口开销值时,如果开销值类型为 wide ,则接口开销值=(参考带宽 / 接口带宽)x10 ,如果开销值类型为 narrow, 则接口开销值为与接口带宽绑定的固定值。如果没有为IS-IS接口配置任何开销值,IS-IS接口的默认开销为10,开销类型为narrow。IS-IS 路由协议的优先级值为 15, IS-IS 也拥有一系统的计时器,其中 hello timer 是用来控制 IS-IS hello 报文发送的时间间隔的。但却只发送开销类型为narrow的路由。

2024-01-26 22:11:04 1126

原创 IS-IS:04 DIS

在广播网络中,DIS 会周期性(默认为 10s)地发送携带 CSNP 消息的组播帧来实现链路状态数据库之间的同步,其中 level-1 DIS 使用的组播 MAC 地址为 018.C200.0014,而 level-2 DIS 使用的组播 MAC 地址为 018.C200.0015。伪节点只是一个逻辑上的概念,用来表示一个广播型网络本身,而DIS路由器是连接到这个广播网络的一台路由器,DIS和伪节点是两个不同的概念,只是DIS 代行了伪节点的职责而已。实验中的MAC 地址是随机生成的。

2024-01-26 18:58:32 985

原创 IS-IS:03 ISIS链路状态数据库

ATT位的作用:当某个区域的L1/L2路由器和其它区域有连接关系的时候,它将在它产生的L1 LSP中设置ATT bit,来告诉本区域中的L1路由器,它有一个区域出口点;如果有多个,选择一个离自己最近的设置了ATT bit的L1/L2路由器作为区域的缺省出口点,对于IP路由来说,具体表现就是L1路由安装一条指向该L1/L2路由的缺省路由0.0.0.0/0在路由表中。2.后面的00为分片号,当LSP的长度太长时,LSP会被分片,分片号的作用是为了重组被分片的LSP。查看Level-1 路由器的链路状态数据库。

2024-01-26 17:12:14 1058

原创 IS-IS:02 ISIS邻接关系

R1去往其他区域的各个网络路由是可以得到简化的,即可以利用缺省路由来代替,R1完全没有必要为Level-2 单独维护一张LSDB 和一张IS-IS路由表。可以看到R3与 R1既建立了 Level-1邻接关系,又建立了 Level-2邻接关系,R3与 R2既建立了 Level-1邻接关系,又建立了 Level-2邻接关系,但R3与R4只建立了 Level-2邻接关系。R1同时为Level-1和Level-2分别维护一个LSDB,Level-2的LSDB中不仅有R1所属区域的LSP,还有其他区域的LSP。

2024-01-26 15:04:51 473

原创 IS-IS:01 ISIS基本配置

isis作为链路状态协议,一个重要的原则是要保证整个网络中所有设备的lsdb数据库保持完全一致,这样才能保证各设备计算出的最小生成树(spf)是基于同一个拓扑,从而保证不会出现环路。isis报文作为链路层报文,发送和接收过程是没有分片的概念的,也就是说接口的mtu决定了可以收到的lsp的最大长度。但a的接口mtu为1000,b的接口mtu为2000,b的lsdb中有一条长度为1500的lsp。默认IS-IS 进程号为 1,配置路由器的网络实体名,即指定系统的区域ID和系统ID。

2024-01-20 23:02:05 1056

原创 OSPF:10 OSPF网络类型

现在的路由表,学习不全,学习不到R2 的环回口,R1 认为R3 是DR,所以只与R3传路由,R1 R2 之间出现了问题,要解决这个问题,就必须确保DR有且只有一个,R1 为总部设为DR ,R2 R3为分部设为DRother。2、broadcast 选DR/BDR , 不需要手工指邻居 10s。现在OSPF 邻居是建立不起来的,配置OSPF 的NBMA模式,需要手工指邻居。配置OSPF 的点到多点网络类型,P2MP 不需要指邻居,不需要DR/BDR。广播模式不需要指邻居,需要选DR/BDR。

2024-01-20 00:41:11 432

原创 OSPF:09 OSPF缺省路由

当设备无精确匹配的路由时,就可以通过缺省路由进行报文转发。可以在R4开启ospf默认路由时加上关键词 always , R5 接口开关,不影响其他路由的默认路由。假如在R4上面去tracert一条不存在的路由,那么路由就会在R5的路由上循环。现在企业内部已经互通了,但无法访问外部网络,还需要写入一条缺省路由指向外部。其实像上面这样R4 R5 如果互写默认路由,容易产生环回报文。也可以是 R4 不做默认路由,做静态路由,再加上 always。当R5 的接口关闭之后,R1 上就没有默认路由了。

2024-01-19 22:25:48 532

原创 OSPF:08 OSPF链路状态数据库

显示信息中,Type表示了 LSA 的类型,这里表示的是 Router LSA.不同类型的LSA的作用和泛洪范围是不相同的。当一台路由器产生一条LSA的时候,路由器会将LSA 的老化时间设置为0. LSA 在产生之后,无论是停留在路由器的LSDB内,还是在传递过程之中,老化时间都会不断增加。每一条 LSA 都会维护一个Seq#(序列号),产生这条LSA的路由器都默认会以 30分钟的周期泛洪这条LSA,每次泛洪时,序列号就加1.LSA 的序列号越大,表明这条LSA 越新。

2024-01-19 17:57:43 992

原创 OSPF:07 OSPF路由聚合

OSPF不支持自动路由聚合,仅支持手动路由聚合。两种机制:区域间路由聚合和外部路由聚合。在R2 上做是不起作用的,需要在 router-id 大的ABR 做,才起作用。查看R2的路由表,有明细的路由 20.0.1.0 2.0 3.0。也可以删掉 R4 的聚合,分别 在 R3 上做,达到一样的效果。再次查看R2的路由表,可以看到明细路由被聚合后的路由取代了。在没有聚合外部路由之前,在R2 上看到的是明细路由。用R3聚合外部路由之后,在R1上查看路由表。再次查看R2的路由表,外部路由已经被聚合。

2024-01-18 00:51:03 521

原创 OSPF:06 NSSA区域

只需要在 R2 R3 上去做,因为R2 R3是ABR/ASBR,可以通过命令“display ospf abr-asbr”来查看。nssa区域是在stub区域上改造的折中方案,最大的区别就是存在asbr,能将nssa中引入的路由发布到别的区域。可以通过抓包hello报文,在里面的 option 字段中看到N=1 E=0 表示是一个NSSA 区域。stub区域不能存在外部路由,stub区域引入的路由也不能发布出去。通过区域1学习到的外部路由已变成默认路由。再次查看R4的lsdb。查看R4 的LSDB。

2024-01-17 19:20:08 333

原创 OSPF:05 Stub区域

Stub 区域 和完全 Stub 区域的功能就是减少该区域中LSA 的数量,从而缩小LSA的规模,进而减少路由表中路由条目的数量,实现降低设备负担,增强网络稳定性,优化网络性能的目的。第一类外部路由的AS外部开销被认为和AS内部开销值是同一数量级的,因此第一类外部路由的开销值为AS内部开销值(路由器到ASBR的开销)与AS外部开销值之和。第二类外部路由的AS外部开销值被认为远大于AS内部开销值,因此第二类外部路由的开销值只是AS外部开销值,忽略AS内部开销值。N=0 E=0 :STUB区域。

2024-01-16 23:30:15 315

原创 OSPF:04 Forwarding address 转发地址

FA是ASBR通告的 Type 5 LSA中的字段,它的作用是告诉OSPF域内的路由器如何能够更快捷地到达LSA 5所通告路由的下一跳地址,以免OSPF内部路由器在广播网络上以ASBR为下一跳,再由ASBR自己转发到正确的下一跳,而产生额外的路由。1)在OSPF引入外部路由时,若产生的Type 5 LSA的FA地址为0.0.0.0,则其他路由器在计算到达该外部网络时,将考虑如何到达ASBR(即产生该Type 5 LSA的路由器)来计算出外部路由的下一跳地址。与上面的实验相比,R6 与R4之间没有物理连接。

2024-01-14 23:09:02 570

原创 OSPF:03 OSPF虚连接

OSPF网络的每个非骨干区域都必须与骨干区域通过 ABR 路由器直接连接,但在现实中,可能会因各种条件限制,导致非骨干区域与骨干区域无法直接连接,这时可以使用OSPF 虚连接来实现非骨干区域在与骨干区域在逻辑上直接相连。使用虚链路使区域2与区域0 逻辑相连,区域 1 做为传输区域,先做R1 R3之间的虚链路,vlink-peer 后面跟的是邻居的 router id。此时再查看R4的路由表 ,会发现已经可以学习到OSPF的路由,并且区域0的路由也已经在路由表中。查看R1与R2的虚连接状态。

2024-01-11 23:44:12 433

原创 OSPF :02 OSPF开销值、优先级

在支持10Gbit/s速率的情况下,推荐将带宽参考值提高到10000Mbit/s来分别为10 Gbit/s、1 Gbit/s和100Mbit/s的链路提供1、10和100的开销。以此,一个64kbit/s串口的开销为1562,一个E1接口(2.048 Mbit/s)的开销为48。在OSPF 协议中的网络类型为广播网络类型,即 Hello 报文的时间间隔为 10s, 邻居失效时间为 40s。因为经过R2 的路径有两个串口,一个串口开销为1562,所以总开销为 3126,远小于经过R3 的 cost 值。

2024-01-08 21:23:18 2450 1

原创 OSPF:01 OSPF基本配置

这是这个实验的拓扑图,本次实验是在华为的esnp环境中进行的。R1、R2和R3同在area 0区域,R2和R4在area 1区域,R3和R5在area 2区域。每个Router都创建一个环回接口。

2024-01-08 14:30:34 1233 1

原创 kubernetes的web用户界面--Dashboard

之前在kubernetes中完成的所有操作都是通过命令行工具kubectl完成的。其实,为了提供更丰富的用户体验,kubernetes还开发了一个基于web的用户界面(Dashboard)。用户可以使用Dashboard部署容器化的应用,还可以监控应用的状态,执行故障排查以及管理kubernetes中各种资源。

2023-08-04 01:37:38 463 1

原创 kubernetes安全认证

Kubernetes作为一个分布式集群的管理工具,保证集群的安全性是其一个重要的任务。所谓的安全性其实就是保证对Kubernetes的各种客户端进行认证和鉴权操作。

2023-08-04 01:17:13 300 1

原创 kubernetes数据存储

在kubernetes中,因为容器的生命周期可能很短,会被频繁地创建和销毁。那么容器在销毁时,保存在容器中的数据也会被清除。这种结果对用户来说,在某些情况下是不乐意看到的。为了持久化保存容器的数据,kubernetes引入了Volume的概念。Volume是Pod中能够被多个容器访问的共享目录,它被定义在Pod上,然后被一个Pod里的多个容器挂载到具体的文件目录下,kubernetes通过Volume实现同一个Pod中不同容器之间的数据共享以及数据的持久化存储。

2023-08-03 21:12:00 185 1

原创 kubernetes资源--Service解析

在kubernetes中,pod是应用程序的载体,我们可以通过pod的ip来访问应用程序,但是pod的ip地址不是固定的,这也就意味着不方便直接采用pod的ip对服务进行访问。为了解决这个问题,kubernetes提供了Service资源,Service会对提供同一个服务的多个pod进行聚合,并且提供一个统一的入口地址。通过访问Service的入口地址就能访问到后面的pod服务。

2023-08-03 02:13:33 106

原创 kubernetes资源--Pod控制器解析

Pod是kubernetes的最小管理单元,在kubernetes中,按照pod的创建方式可以将其分为两类:自主式pod:kubernetes直接创建出来的Pod,这种pod删除后就没有了,也不会重建控制器创建的pod:kubernetes通过控制器创建的pod,这种pod删除了之后还会自动重建什么是Pod控制器Pod控制器是管理pod的中间层,使用Pod控制器之后,只需要告诉Pod控制器,想要多少个什么样的Pod就可以了,它会创建出满足条件的Pod并确保每一个Pod资源处于用户期望的目标状态。

2023-08-02 00:57:30 216

原创 kubernetes入门操作

至此,已经掌握了Namespace、Pod、Deployment、Service资源的基本操作,有了这些操作,就可以在kubernetes集群中实现一个服务的简单部署和访问了,但是如果想要更好的使用kubernetes,就需要深入学习这几种资源的细节和原理。Pod控制器用于pod的管理,确保pod资源符合预期的状态,当pod的资源出现故障时,会尝试进行重启或重建pod。环境标签:"environment":"dev","environment":"test","environment":"pro"

2023-08-01 15:35:19 67 1

原创 kubernetes资源--Pod解析

为了解清楚Pod这种资源,就要先了解它的资源属性apiVersion: v1 #必选,版本号,例如v1kind: Pod   #必选,资源类型,例如 Podmetadata:   #必选,元数据name: string #必选,Pod名称namespace: string #Pod所属的命名空间,默认为"default"labels:    #自定义标签列表spec: #必选,Pod中容器的详细定义containers: #必选,Pod中容器列表。

2023-08-01 01:53:50 278 1

原创 在Centos上使用kubeadm搭建kubernetes集群

目的:搭建一个一主二从的kubernetes集群在所有节点上安装Docker 和kubeadm部署Kubernetes Master部署容器网络插件部署Kubernetes Node,将节点加入Kubernetes 集群中。

2023-07-31 02:07:22 324 1

原创 docker搭建私有镜像仓库

注意将私有仓库服务器ip修改为自己私有仓库服务器真实ip。打开浏览器 输入地址http://私有仓库服务器ip:5000/v2/_catalog,看到{"repositories":[]} 表示私有仓库搭建成功。注意这个打标签的centos7镜像id与没打标签的是一样的,所以删除的时候不能用id删除,否则就会一起删掉。{"insecure-registries":["私有仓库服务器ip:5000"]}接下来把打标签的centos7镜像删除,然后再从私有仓库拉下来。打完标签后上传镜像到仓库。

2023-07-28 17:22:43 128 1

原创 使用dockerfile简单自定义centos7镜像

通过dockerfile构建镜像,使用命令docker bulid –f dockerfile文件路径 –t 镜像名称:版本。• 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件 构建一个新的镜像开始工作了。自定义centos7镜像要求: 1. 默认登录路径为 /usr 2. 可以使用vim。” ,表示当前目录作为构建上下文,指定了构建Docker镜像所需的文件和目录。• 每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像。构建镜像完毕后,查看镜像。在命令后面记得跟个“

2023-07-27 22:58:40 1250 1

原创 docker容器转镜像

(注意:这里这个tomcat容器是有挂载数据卷的,转为镜像后所创建的容器是不会继承原本容器的数据卷。也就是说数据卷里面的数据并不会被转为镜像后所创建的容器继承,要在转为镜像之前把数据放到容器根目录下,才会被继承。然后把容器删除,使用“docker save -o”命令,把镜像打包压缩(这一步可能有点久)压缩完毕后,把镜像删除,通过“docker load –i ”命令把镜像从新加载出来。Docker 容器如何转为镜像,主要通过以下三个命令。转为镜像之后,再试着通过镜像创建容器。使用解压出来的镜像创建容器。

2023-07-27 21:29:32 1405 1

原创 docker应用部署--Redis

v $PWD/data:/data: 将主机上的 /data 目录挂载到 Redis 容器的 /data 路径,用于持久化 Redis 数据。-p 6380:6379: 将容器的 Redis 6379 端口映射到主机的 6380 端口。--requirepass 123456: 设置 Redis 密码,这里使用 "123456" 作为示例,你可以将其替换为你想要的密码。redis-server: 这是在 Redis 容器中要运行的命令,指定启动 Redis 服务。再到外部机器上,使用redis工具连接。

2023-07-27 15:03:45 38 1

原创 docker应用部署--Tomcat

在 /test 目录下写一个html文件,在里面简单地写一行代码。将主机中当前目录挂载到容器的webapps,充当资源目录。接着在 /tomcat 目录下创建一个test目录。出来的内容正是刚才创建的html文件里面的内容。然后在 /root 目录下创建tomcat目录。切换到 /tomcat 目录下,开始创建容器。将容器的8080端口映射到主机的8080端口。再到外部机器的浏览器上测试,也能正常运行。先准备好tomcat镜像,版本是最新的。创建成功后,查看容器状态。接着再用“curl”命令测试下。

2023-07-27 00:43:33 111 1

原创 docker应用部署--Nginx

将主机当前目录下的 /conf/nginx.conf 挂载到容器的 :/etc/nginx/nginx.conf。:将主机当前目录下的 logs 目录挂载到容器的/var/log/nginx。接着切换到 /html 目录下,写一个html文件,在里面简单地写一行代码。然后再 /nginx 目录下再创建一个conf目录,用于放置配置文件。创建完成后,查看 /nginx 目录,已经有对应的挂载目录。在 /root 目录下创建一个nginx目录,并切换进去。之后切回 /nginx 目录下,开始创建容器。

2023-07-27 00:04:07 76 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除