重发布及路由策略

目录

重发布

作用

条件

规则

名词解释点

单点重发布

双点重发布

路由策略

控制层流量和数据层流量

抓流量

ACL列表

前缀列表( ip-prefix)

实例演示

做策略

过滤策略(过滤器-策略)

路由策略(route-policy)

基本配置

路由策略使用

配置实验


重发布

        在同一个网络拓扑结构中,如果存在多种不同的路由协议,由于不同路由协议的机理各有不同,对路由的处理也不相同,这就在网络中造成了路由信息的隔离,在路由协议的边界设备上,将某种路由协议的路由信息引入另一种路由协议中,这个操作被称为路由引入(Route lmportation)或者路由重分发(Route Redistribution)。---这个技术的叫法比较多,也就是我们说的重发布。

作用

        在一个网络中,若运行多种路由协议或相同路由协议的不同进程;协议之间不能直接沟通计算,进程之间也是独立转发和运算的,所以,需要使用重发布来实现路由的共享。

条件

        1,必须存在ASBR设备---同时连接两种协议两个进程,同时学到两边的路由,之后进行路由共享。

重发布的操作就是在ASBR设备上,说明,重发布这个技术主要就应用在两个协议或者两个进程之间。都是两两之间完成的。

        2,必须关注种子度量值---起始度量值,A协议和B协议的开销计算逻辑是不一样,无法直接使用。故将A协议发布到B协议是,ASBR将不携带A协议的度量值,而是共享到B协议后,由ASBR设备在路由中添加一个起始度量值

不同动态路由协议设置的默认种子度量值不同,这点需要重点关注。

规则

        1,将A协议发布到B协议中,在ASBR中的B协议上配置---该规则定义的是重发布技术的配置位置规则。

        2,将A协议发布到B协议中,ASBR将会将所有通过A协议学习到的路由以及ASBR上宣告在A协议中的所有直连路由,全部共享到B协议中。---该规则定义的是重发布发布的内容规则。---这条规则是重发布学习的重中之重。

名词解释点

·单点---两个协议或两个进程之间存在一个ASBR

·双点---两个协议或两个进程之间存在两个ASBR

·多点---两个协议或两个进程之间存在多个ASBR

·单向---仅将A协议路由共享到B协议中

·双向---A/B协议的路由均共享

(因为重发布都是发生在两两之间的,所以,不存在多向)

单点重发布

针对重发布技术,仅需完成对单点重发布的学习即可。

(可以搭建以上拓扑环境,来完成单点重发布配置讲解。)

在进行配置讲解的时候,可以从三个方面来讲

· A-> B:—种动态路由协议发布到另外—种动态路由协议·静态->B:将静态路由导入到动态路由协议中

·直连->B:将直连路由导入到动态路由协议中

注意:这里拿将OSPE的路由信息重发布到RIP中进行演示。

A->B:一种动态路由协议发布到另外一种动态路由协议

[r2-rip-1]import-route ospf 1

结论:通过重发布技术将其他协议的路由信息导入到RIP中,其赋予的默认种子度量值为0。

修改种子度量值的方法:

1.在进程当中对全局进行修改:[r2-rip-1]default-cost 2

2.针对本次重发布进行修改:[r2-rip-1]import-route ospf 1 cost 3

注意:当以上两条命令同时执行时,将按照第2条,匹配更精确的命令来执行。

静态→B:将静态路由导入到动态路由协议中[r2-rip-1]import-route static

结论:

1.导入静态RIP赋予的种子度量值也是0。

2.重发布在导入的路由中无法导入缺省路由信息。

直连→>B:将直连路由导入到动态路由协议中[r2-rip-1]import-route direct

结论:

1.除了R1的直连网段外,所有直连都会导入

2.若ASBR进行了A->B的重发布以及直连->B的重发布,并且两次包含相同的路由信息,则将会优先学习直连->B的重发布信息。

双点重发布

单点重发布看完之后,我们再来看双点重发布(多点和双点差不多)。我们可以搭建如下拓扑:

思考---如果我们再R2和RA上同时做双向的重发布,会遇到哪些问题呢?

假设,R2上有一个环回2.0网段,在RIP进程中进行了宣告。因为R4也运行了RIP进程,所以,通过RIP进程R4A将学习到2.0网段的路由信息。之后,R2上进行重发布,将B2的RIP的路由重发布到OSPF中,则2.0网段的路由信息也将发布过来。(这个属于宣告在A协议的接口对应的直连网段),因为R4也运行了OSPF,所以,B4将通过QSPE学习到2.0网段的路由信息。R4通过两种协议学习到2.0网段的路由信息,按照优先级,则将学习OSPF的(事实并不会是如此,因为重发布的路由在OSPF中是以5类LSA通告的,其生成的路由默认优先级被定义为150,大于RIP的默认值100)。一旦学习了,R4的路由表将发生变化,之后将通过R3访问R2的环回。之后,如果R4也进行了重发布,则R4也会将2.0网段的路由信息重发布到RIP之中。(这属于通过A协议学习到的路由信息)。因为重发布过来会清除原先的度量值,所以在R1上到达2.0网段将形成一个负载均衡,同时走R2和R4,这很明显出现了选路不佳。这种现象就是所谓的路由回馈现象。严重的也会引起路由环路的产生。

在上图实验中,不存在路由回馈的问题,选路不佳的问题出现在R3至2.0的选路上!
 

结论:默认RIP和OSPE协议若进行双点重发布,由于两者的优先级不同,故第一台ASBR设备重发布动作结束后,将影响其他ASBR设备的路由表。使得路由可能被回传到源协议当中,发生路由回馈--A协议的路由重发布到B协议当中后,又被重新发布回A协议。路由回馈可能会导致选路不佳甚至路由环路的出现。---当然,因为华为设备将重发布到OSPF的路由的优先级设置为了150,所以,在上图所示情况下,是不会发生路由回馈的。

        当然,就算解决了路由回馈问题,多点的重发布还是存在其必然产生的问题---选路不佳。主要还是因为他清楚了原先的开销值导致的。---而这个问题,想要解决,是无法仅通过重发布技术来解决,而需要使用到路由策略了。

路由策略

在说路由策略之前,我们需要先了解两个名词。

控制层流量和数据层流量

1.控制层流量---路由协议传递路由信息产生的流量

2.数据层流量---设备访问目标地址时产生的流量

而所谓路由策略一在控制层面转发流量的过程中,截取流量,之后修改流量再转发或者不转发,最终达到影响路由器路由表的生成,干涉选路的效果。

(这个概念就和我们之前讲的ACL列表有点像,只不过ACL是针对数据层流量进行访问控制,路由策略主要针对的是控制层流量。)

路由策略的整体动作也是分为两部分的,一部分是先截取流量(抓流量),还有一部分就是针对流量进行修改或者不转发(做策略)。

抓流量

我们这里介绍抓取流量的方法主要有两种,一种是通过ACL列表来抓取流量;另一种是通过前缀列表(ip-prefix)来抓取流量。

ACL列表

因为ACL列表本身设计是为了抓取数据层流量的,所以,因为通配符的存在他可以灵活的匹配数字特征,但是,没有办法匹配路由信息中的掩码特征。所以,并不擅长控制层流量的抓取。

ACL在抓取路由信息时,只能按照数字特征来进行匹配。

例如我们抓取一条携带192.168.1.0/24路由信息的数据包,使用ACL列表抓取时只能如下抓取

[r2]acl 2000

[r2-acl-basic-2000]rule permit source 192.168.1.0 0

后面的0是通配符,代表所有的数字都不允许发生变化。

正式因为如此,如果需要我们在192.168.1.0/24,192.168.1.0/25,192.168.1.0/26中抓取到192.168.1.0/24,则ACL将无能为力,他只能按照数字特征抓,则意味着使用以上抓法将同时抓到携带这三种路由信息的数据包。

前缀列表( ip-prefix)

从名字上看JP前缀列表是一个列表形态的工具。它所匹配的对象是IP地址前缀,也就是路由条目。一个路由条目由目的网络地址(也被称为前缀)及掩码长度〈也被称为前缀长度)共同标识。使用ACL从一批路由中筛选出感兴趣的路由时,是无法指定被匹配对象的目的网络掩码长度的,但是IP前缀列表却可以做到,它除了能够指定被匹配对象的目的网络地址,还能指定目的网络掩码长度,从而实现对路由的精确匹配。

IP前缀列表可以包含一条或多条语句,每条语句都使用一个十进制的序号(Index)进行标识。在本例中,这个名称为abcd的IP前缀列表中只有一条语句,这条语句的序号为10,正如前面所说,您可以为一个IP前缀列表创建多条语句,每条语句使用不同的序号,所有的语句按照序号从小到大依序排列,这与ACL非常类似

前缀列表还可以进行范围匹配,下面的示例中增加了greater-equal (大于或等于)及less-equal(小于或等于)这两个关键字及参数,从而指定了掩码长度的范围。这条命令要求路由的目的网络地址的前16个比特位与172.16.0.0的前16个比特位相同。另外路由的目的网络掩码长度需大于或等于24,同时小于或等于32。只有满足上述条件的路由才会被该语句匹配。

如果一条语句中只是指定了greater-equal关键字(且没有指定less-equal关键字),则掩码长度的范围是大于或等于greater-equal关键字所指定的值,同时小于或等于32。而如果只是指定了less-equal关键字(且没有指定greater-equal关键字),则掩码长度的范围是大于或等于命令中指定的掩码长度,同时小于或等于less-equal关键字指定的值。

前缀列表的匹配规则:从上而下,逐一匹配,一旦匹配上则将按照该规则执行,不再向下匹配。末尾隐含拒绝所有的规则

IP前缀列表是一个重要的路由策略工具,能够作为路由过滤器被应用于各种场景,例如可以被Route-Policy调用,或者Filter-Policy调用等等,另外,也在BGP路由协议中被直接用于路由过滤。

实例演示

下面通过几个例子来加深大家对IP前缀列表的理解。假设有四条路由:172.16.0.0/16、172.16.0.0/24、172.16.0.0/30,172.16.1.1/32,它们都是用于测试的被匹配对象。通过不同的P前缀列表可以达到不同的结果。

1.ip ip-prefix aa index10 permit 172.16.0.0 24

上述语句要求路由的目的网络地址的前24个比特位需与172.16.0.0的前24个比特位相同,并且路由的目的网络掩码长度必须为24。因此aa这个P前缀列表只允许了四条路由中的172.16.0.0/24

2.ip ip-prefix bb index 10 permit 172.16.0.0 16 less-equal 24

上述语句要求路由的目的网络地址的前16个比特位需与172.16.0.0的前16个比特位相同并且路由的目的网络掩码长度须大于或等于16,且小于或等于24。因此bb这个I前缀列表允许了四条路由中的172.16.0.0/16及172.16.0.0/24。

3.ip ip-prefix cc index 10 permit 172.16.0.0 16 greater-equal 24

上述语句要求路由的目的网络地址的前16个比特位需与172.16.0.0的前16个比特位相同并且路由的目的网络掩码长度须大于或等于24(且小于或等于32,系统会自动在该命令后添加less-equal 32)。因此 cc这个Ip前缀列表允许了四条路由中172.16.0.0/24、172.16.0.0/30以及172.16.1.1/32。

4.ip ip-prefix dd index 10 permit 172.16.0.0 16 greater-equal 24 less-equal 30

上述语句要求路由的目的网络地址的前16个比特位须与172.16.0.0的前16个比特位相同并且路由的目的网络掩码长度须大于或等于24,且小于或等于30。因此dd这个IP前缀列表允许了四条路由中的172.16.0.0/24和172.16.0.0/30。

5.ip ip-prefix ee index 20 permit 172.16.0.0 24

上述IP前缀列表的名称为ee,它拥有两条语句。序号为10的语句要求路由的目的网络地址的前30个比特位须与172.16.0.0的前30个比特位相同,并且路由的目的网络掩码长度必须为30,而由于该语句的匹配模式为deny,因此四条路由中的172.16.0.0/30被该语句匹配住而且被拒绝。另外,序号为20的语句匹配路由172.16.0.0/24。由于IP前缀列表末尾隐含拒绝所有,因此最终四条路由中只有172.16.0.0/24被该P前缀列表所允许。

6. ip ip-prefix ff index 10 permit 0.0.0.0 0 less-equal 32

上述语句中,IP地址为0.0.0.0,这种形式的IP地址被称为通配地址,也即该地址能匹配任意的目的网络地址。因此该语句并不关心被匹配路由的目的网络地址,但是要求路由的目的网络掩码长度须大于或等于0,且小于或等于32,实际上所有的路由都满足上述要求,因此,该条语句相当于"允许所有"。因此四条路由都将被允许。ip ip-prefix gg index 10 deny 172.16.0.0 30

7.ip ip-prefix gg index 20 permit 0.0.0.0 0 less-equal 32

上述IP前缀列表的名称为gg,它拥有两条语句。序号为10的语句拒绝了路由172.16.0.0/30,而序号为20的语句则为允许所有,因此四条路由中,除了172.16.0.0/30之外,其他所有路由都被允许。

8.ip ip-prefix hh index 10 permit 0.0.0.0 0 greater-equal 32 less-equal 32

上述lP前缀列表将匹配网络掩码长度为32的任意路由,也就是匹配所有的主机路由,因此四条路由中,只有172.16.1.1/32被允许。

9.ip ip-prefix ii index 10 permit 0.0.0.0 0

这是一个非常特殊的语句,该语句允许的是默认路由0.0.0.0/0。

做策略

我们需要针对抓取到的流量执行对应的操作,修改其中内容或者是拒绝通过,这些操作都需要依靠策略来完成.我们这里主要给大家介绍的策略有两种.过滤策略(filter-policy)和路由策略(route-policy)

过滤策略(过滤器-策略)

Filter-Policy (过滤-策略),可以将其视为一种路由过滤器。下图展示了一个Filter-Policy的部署案例。R1、R2及Co_sw运行了RIPx2,CO_SW将服务器集群的网段发布到了RIP中,并将路由通过RIP通告给R1及R2,初始情况下,B1及R2都能学习到所有到达服务器集群网段的路由。现在网络中增加了一个需求:要求R1下联的PC不能访问服务器集群中的192.168.2.0/24网段,但是仍可以访问其他服务器网段。

要实现上述需求其实有多种方法,Filter-Policy使是其中之一。我们可以在CO_sw上部署Filter-Policy,将其通告给R1的RIP路由进行过滤,把192.168.2.0/24从路由更新中过滤掉,如此一来R1将无法再通过RIP获知到达

192.168.2.0/24的路由,那么PC用户也就无法再通过R1访问该网段了。

需要强调的是,Filter-Policy只能够对路由信息进行过滤,而无法对LSA进行过滤。

就使用搭建的双点重发布的环境,如果R2和R4都进行了重发布,则R1这边通过RIP学习到的到达OSPE网段都将是负载均衡,我们可以通过过滤策略来打破这个负载均衡,选取最佳的选路。比如,R2和R3之间的23.0.0.0/24网段,R1到达该网段,选择走R2为下一跳是最佳的选择,而不应该走R4。则我们可以将R4发来的路由信息进行过滤。

这个过滤策略在做的时候,做的位置是可以自行选择的,我们可以在R1上做,在R1收到R4发来的路由信息时,将其进行过滤,我们将这样的策略称为入方向的策略入方向的策略将影响自身;当然,我们也可以在RA上进行配置,让R4在给R1发路由信息的时候不去携带这条路由信息,我们将这样策略称为出方向的策略,出方向的策略影响他人

步骤:

1,抓取流量

(这里使用ACL列表抓取,当然也可以使用过滤列表进行抓取)

[r2]acl 2000

[r2-acl-basic-200orule deny s 23.0.0.0 0 ---注意,过滤列表本身没有过滤能力,所以,需要在抓取流量时使用拒绝动作。(后面写0代表完全按照数字特征来抓取路由信息)

[r2-acl-basic-2000]rule permit source any ---注意,在抓流量时,末尾一定要放通剩余流量否则将会把所有流量全部过滤掉。

2,在过滤策略中调用---这里时在RA上进行的出方向的调用,也可以在R1上进行入方向的调用

[r4-rip-1]filter-policy 2001 export GigabitEthernet 0/0/0 ---因为是进程中进行调用,所以需要选定策略影响的入接口

注意:过滤列表可以在OSPE中使用,但是,因为OSPF中传递的是拓扑信息,所以,无法进行出方向的过滤,只能进行入方向的调用,并且,调用的效果是仅将过滤抓取的路由信息不加表。

上图中,已经进行多点双向重发布,不存在路由回馈的问题(原因:其他协议路由再重发布进入OSPF时,优先级被修改为150).

所以上图仅考虑选路不佳的问题;在上图中R1去往23.1.1.0/24网段是等开销负载均衡的(原因:重发布后,原有协议的度量值被洗掉,仅保留种子度量值)。

原有路由表截图。

做法:通过使用前缀列表及过滤策略实现R1去往23.1.1.0/24 网段的路由仅从R1走。

第一种做法:在R1-R4的入口上调用过滤策略

步骤:

第一步:使用前缀列表抓取23.1.1.0/24网段(因为过滤是要拒绝,所以前缀列表书写拒绝).

[R1]ip ip-prefix 1 index 10 deny 23.1.1.0 24 //拒绝23.1.1.0/24

[R1]ip ip-prefix 1 index 20 permit 0.0.0.0 0 less-equal 32 //允许所有(末尾隐藏拒绝所有)。

第二步:书写过滤策略

[R1]rip 1

[R1-rip-1]filter-policy ip-prefix 1 import GigabitEthernet 0/0/1 //import 代表入方向

第三步:检查

第二种做法:在R4-R1的出口上调用过滤策略

同样方法,在R4上用前缀列表抓取流量,然后在R4的出口调用

路由策略(route-policy)

基本概念

Route-Policy是一个非常重要的路由策略工具,如下图所示,您可以把它想象成拥有一个或多个节点(Node)的列表,每一个节点都可以是一系列条件语句及执行语句的集合,这些节点按照编号从小到大的顺序排列。在每个节点中,用户可以定义条件语句及执行语句,这就有点像程序设计语言里的If-Then(如果-则)组合。在Route-Policy被执行的时候,设备从编号最小的节点开始进行路由匹配,如在途中首先看节点,设备对该节点中的条件语句进行匹配,如果被匹配的对象满足所有条件,则执行该节点中的执行语句,并且不会再继续往下一个节点进行匹配。而如果节点1中,有任何一个条件不满足,则前往下一个节点,也就是到节点2中去匹配条件语句,如果被匹配的对象满足所有条件,则执行该节点中的执行语句,如果不满足,则继续往下一个节点进行匹配,以此类推。

路由策略的匹配规则:自上而下,逐一匹配,一旦匹配上则将按照对应的规则来执行动作,I不再向下匹配。末尾隐含拒绝所有的规则

下图展示了一个 Route-Policy实例,该Route-Policy的名称为hcnp,一共有三个节点,序号分别是5,10和15。之所以在每个序号之间预留4个数,是为了考虑扩展性,这样一来用户如果需要插入新节点,则还有预留的序号可以使用。每个节点中都配置了条件语句(使用if-match命令定义)及执行语句(使用apply命令定义)。当该Route-Policy被调用且开始执行时,路由匹配的操作将从序号最小的节点--节点5开始进行。节点5中定义了多条if-match语句,只有当所有的if-match语句都满足时,才会执行y1所定义的动作。如果节点5中有任何一个条件不满足,则继续到下一个节点中进行匹配。

基本配置

1,创建—个Route-Policy节点

route-policy route-policy-name { permit | deny } node node

在设备的系统视图中使用上述命令,即可创建一个Route-Policy节点,并进入该Route-Policy节点的配置视图。在该命令中,Route-Policy 的名称可以根据需要自行定义.

在名称的后面,有两个关键字可以选择,它们用于指定该节点的匹配模式。

(1)Permit:指定该节点的匹配模式为允许。如果路由匹配的结果是满足该节点的所有if-match语句,则该路由被视为允许通过,该节点的apply语句将被执行,且不再进入下一个节点;如果该节点中有if-match语句不满足,则进入下一个节点继续匹配。

(2)Deny:指定节点的匹配模式为拒绝。如果节点的匹配模式为deny,则该节点的apply语句将不被执行。如果路由匹配的结果是满足该节点的所有if-match语句,那么Route-Policy的匹配过程立即结束,不会再进入下一个节点,而且满足该节点条件的路由被视为拒绝通过。如果该节点下有if-match语句不满足,则进入下一个节点继续匹配。

值得注意的是,当Route-Policy用于路由匹配时,被匹配对象(也就是路由条目)必须满足一个节点中的所有if-match语句(“与"的关系),才被认为匹配该节点。如果某条路由没有被Route-Policy的任何节点匹配,则该路由被视为拒绝通过该Route-Policy,也就是说,Route-Policy 的末尾隐含着一个类似拒绝所有的节点。当然,为了避免所有的路由都被拒绝通过,一个Route-Policy中必须至少有一个节点的匹配模式为permit。

2,(可选)配置if-match语句

在Route-Policy的节点视图下,使用if-match命令可定义匹配条件,所匹配的对象是路由信息的一些属性,例如路由的目的网络地址或掩码长度、度量值、标记或下一跳P地址等。常用的就是匹配ACL.或者前缀列表抓取的流量。

(1)匹配ACL:

if-match acl { acl-number | acl-name }

(2)匹配IP前缀列表:

if-match ip-prefix ip-prefix-name

一个节点中可以包含多条if-match语句,这些if-match语句之间是"与”的关系,也就是说所有的if-match语句必须同时满足,被匹配对象才被视为匹配该节点。一个节点中可以不包含任何if-match语句,当这种情况出现时,则视为匹配所有,也就是任何的被匹配对象都满足该节点的条件。

3,(可选)配置apply语句

在Route-Policy的节点视图下,使用apply命令指定需执行的动作,这些动作主要是对所匹配的路由的某些属性进行修改,例如修改路由的度量值、优先级值、标记等。以下是一些常用的apply命令。(后续BGP将大量使用路由策略来修改其中的路径属性)

(1)设置路由的度量值:

apply cost [+l- ] cost

(2)设置OSPE的度量值类型:

apply cost-type { type-1 / type-2 }

(3)设置路由的标记:

apply tag tag

一个节点中可以不包含任何apply语句,此时该节点只被用于执行路由过滤,而不用于设置路由的属性。

路由策略使用

路由策略使用:在上图中R3对192.168.2.0/24的选路存在相应的问题,现在的情况是等开销的

现在,通过路由策略来干涉选路,通过观察,我们需要在R4上通过路由策略来加大cost值的方法来干涉选路.

做法:

第一步:使用前缀列表抓取流量

[R4]ip ip-prefix 1 permit 192.168.2.0 24

第二步:创建路由策略

[R4]route-policy 1 permit node 10

lnfo: New Sequence of this List

[R4-route-policy]if-match ip-prefix 1

[R4-route-policy]apply cost + 10

[R4-route-policy]q

[R4]route-policy 1 permit node 20.

第三步:重发布时调用

[R4]ospf 1

[R4-ospf-1]import-route rip 1 route-policy 1 type 1 //必须修改Type1l

第四步:测试

配置实验

实验要求:R1创建4条环回,均宣告在RIP中。R2同时运行RIP和OSPE,需要在R2上进行重发布,将RIP的路由信息重发布到OSPE中。按照重发布的发布规则,将发布过来5条路由信息(R1的4条环回及12.0.0.0网段。)重发布后的五条路由信息分别做五种不同的处理,按图中所示。(12.0.0.0/24网段不做处理)。

步骤:

1.配IP地址

2.首先进行单点双向重发布,后R3路由表如下图所示

<R3>display ospf routing

3.做策略

第一步:使用前缀列表抓取各流量(此处不再使用acl)

[R2]ip ip-prefix a permit 1.1.1.0 24

[R2]ip ip-prefix b permit 2.2.2.024

[R2]ip ip-prefix c permit 3.3.3.024

[R2]in ip-prefix d permit 4.4.4.0 24

第二步:使用路由策略

[R2]route-policy celve deny node 10

Info: New Sequence of this List.

[R2-route-policy]if-match ip-prefix a

[R2-route-policy]q

[R2]route-policy celve permit node 20

Info: New Sequence of this List.

[R2-route-policy]if-match ip-prefix b

[R2-route-policy]apply cost 10

[R2-route-policy]q

[R2]route-policy celve permit node 30

Info: New Sequence of this List.

[R2-route-policy]if-match ip-prefix c

[R2-route-policy]apply cost-type type-1

[R2-route-policy]q

[R2]route-policy celve permit node 40

Info: New Sequence of this List.

[R2-route-policy]if-match ip-prefix d

[R2-route-policy]apply cost-type type-1

[R2-route-policy]apply tag 666

[R2]route-policy celve permit node 50

Info: New Sequence of this List.

第三步:重发布调用

[R2]ospf 1

[R2-ospf-1]import-route rip1 route-policy celve

第四步:测试

猜你喜欢

转载自blog.csdn.net/m2282475145/article/details/131953199