3.3 使用MQC分类

使用MQC对数据分类需要3个步骤,分别使用3个命令,如下所示。

(1)使用class-map命令生成数据类。

(2)使用policy-map命令标记数据(DSCP,CoS等),标记后的数据才能区分出不同的类别。

(3)把第2步设置的策略应用在入口上,使用的命令是service-policy input。当数据从接口进入时,应按照策略进行标记。

3.3.1 class-map命令

命令语法如下:

            Border_A(config)# class-map [match-all | match-any] class-map-name
            Border_A(config-cmap)# match {match-criteria}

其中,

class-map-name——名字。

● match-all——当设定多个match条件时,满足所有条件的数据才是匹配的。

● match-any——当设定多个match条件时,数据满足一个条件即可。

match-criteria——设定的匹配条件。

如果在命令里既没有使用match-all,也没有使用match-any,系统默认使用的是match-all。

3.3.2 class- map示例

当设定匹配条件时,可以使用以下参数。

(1)ACL(名称或代码)。

            Border_A (config-cmap)# match access-group access-group

access-group——访问列表名称或代码。

例3-10:把两个ACL(subnet-a和subnet-b)定义的数据划归为一类。

            Router1(config)# ip access-list extended subnet-a
            Router1(config-std-nacl)# permit ip 192.168.200.0 0.0.0.255 any
            Router1(config-std-nacl)# end
            Router1(config)# ip access-list extended subnet-b
            Router1(config-std-nacl)# permit ip 192.168.300.0 0.0.0.255 any
            Router1(config)# class-map match-any class1
            Router1(config-cmap)# match access-group subnet-a
            Router1(config-cmap)# match access-group subnet-b
            Router1(config-cmap)# exit

(2)任意数据。

            Border_A (config-cmap)# match any

(3)调用其他class-map,即calss-map嵌套。

            Border_A( config-cmap)# match class-map class-name

class-name——其他class-map的名字。

例3-11:class2调用class1。

            Router1(config)# class-map match-any class2
            Router1(config-cmap)# match class-map class1
            Router1(config-cmap)# exit

(4)CoS值。

            Border_A  (config-cmap)#  match  cos  cos-value1[cos-value2  [cos-value3
    [cos-value4]]]

cos-value——CoS值,最多4个。在同一个match语句里的多个值,匹配一个值即满足条件。

例3-12:把CoS=2和CoS=3的数据划归一类。

            Router1(config)# class-map match-all class3
            Router1(config-cmap)# match cos 2 3
            Router1(config-cmap)# exit

(5)目的MAC地址。

            Border_A (config-cmap)# match destination-address mac address

address——目的MAC地址(十六进制)。

例3-13:

            Router1(config)# class-map match-any class4
            Router1(config-cmap)# match destination-address mac 00:01:0c:00:12:34
            Router1(config-cmap)# exit

(6)数据进入的接口。

            Border_A (config-cmap)# match input-interface interface-name

interface-name——入口编号。

(7)DSCP值。

            Border_A (config-cmap)# match dscp dscp-value

dscp-value——DSCP值,最多7个。在同一个match语句里的多个值,匹配一个值即为满足条件。既可以匹配IPv4数据包,也可以匹配IPv6数据包。

例3-14:把DSCP=2,DSCP=3,DSCP=30,AF=11的数据划归一类。

            Router1(config)# class-map match-all class5
            Router1(config-cmap)# match dscp 2 3 30 af11
            Router1(config-cmap)# exit

(8)IP优先级。

            Border_A (config-cmap)# match precedence ip-precedence-value

ip-precedence-value——IP优先级值,最多4个值。在同一个match语句里的多个值,匹配一个值即满足条件。既可以匹配IPv4数据包,也可以匹配IPv6数据包。

(9)实时传输协议端口。

            Border_A (config-cmap)# match ip rtp  starting-port-number  port-range

starting-port-number——起始端口号。

port-range——端口号范围,自起始端口号之后的端口号范围。

例3-15:匹配自端口号2024及其后100个端口号(2024~2124)。

            Router1(config)# class-map match-all class6
            Router1(config-cmap)# match ip rtp 2024100
            Router1(config-cmap)# exit

(10)MPLS标签。

            Border_A (config-cmap)# match mpls experimental topmost exp-values

exp-values——MPLS实验字段标记值。

(11)反向选择条件。

            Border_A (config-cmap)# match not match-criteria

match-criteria——不是该条件的其他情况都匹配。

例3-16:把不是RTP协议的数据归类。

            Router1(config)# class-map match-all class7
            Router1(config-cmap)# match not rtp
            Router1(config-cmap)# exit

(12)协议。

            Border_A (config-cmap)# match protocol protocol-name

protocol-name——协议名称。

(13)源MAC地址。

            Border_A (config-cmap)# match source-address mac address

address——源MAC地址(十六进制)。

(14)RTP(使用NBAR分类时使用的命令)。

            Border_A (config-cmap)# match protocol RTP [ audio | video | payload-type
    payload-type-code ]

audio——音频数据。

video——视频数据。

payload-type-code——数据类型代码。0~23保留给音频数据,24~33保留给视频数据,34~64用户可以自定义。使用代码比仅使用“audio”或“video”关键词产生的匹配更严格。多个类型代码之间使用逗号分隔,也可以使用连线符表示代码区间。代码的表达形式可以是十进制、十六进制和二进制。

例3-17:匹配数据类型代码为2,4,6,7~16的音频数据。

            Router1(config)# class-map class8
            Router1(config-cmap)# match protocol rtp palyload-type 2,4,6,0x7-0x10
            Router1(config-cmap)# exit

提示:根据IOS版本和设备平台的不同,支持的匹配条件会有所不同。这里并没有列出所有可用的匹配条件。读者在使用的时候请注意查阅产品文档和IOS版本。

3.3.3 policy-map命令

使用policy-map命令可对已经使用class-map命令分类的数据进行标记。

语法如下:

            Border_A (config)# policy-map policy-name
            Border_A (config-pmap)# class {class-default | class-name }
            Border_A (config-pmap-c)# set tag

policy-name——自定义的名称。

class-name——使用class-map命令生成的数据类的名称。

class-default——默认的数据类。系统把不属于任何分类的数据自动归为默认类。默认数据类不需要事先定义,直接调用即可。默认类数据的CoS=0,DSCP=0。

tag——为数据设置的标记值。

标记值可以是以下几种。

(1)CoS值。

            Border_A (config-pmap-c)# set cos cos-value

cos-value——CoS值,取值范围为0~7。

(2)DSCP值。

            Border_A (config-pmap-c)# set ip dscp ip-dscp-value

ip-dscp-value——DSCP值,取值范围为0~63。

(3)IP优先级值。

            Border_A (config-pmap-c)# set ip precedence ip-precedence-value

ip-precedence-value——IP优先级值,取值范围为0~7。

(4)MPLS实验字段值。

            Border_A (config-pmap-c)# set mpls experimental value

value——实验字段值,取值范围为0~7。

(5)QoS组。

            Border_A (config-pmap-c)# set qos-group qos-group-value

qos-group-value——用户自定义的组ID号,范围为0~99。该命令的作用是把满足某条件的数据人为地划分到一个组里,以便在其他设备上识别。

(6)信任数据携带的标记值。

            Border_A (config-pmap-c)# trust {cos | dscp | ip-precedence}

提示:根据IOS版本和设备平台的不同,可被支持的命令有所不同。这里并没有列出所有的用法,请读者在使用的时候查阅产品文档和IOS版本。

3.3.4 policy-map示例

例3-18:对class1的数据标记DSCP=AF21。

            Router1(config)#ip access-list extended subnet-a
            Router1(config-std-nacl)#permit ip 192.168.200.0 0.0.0.255 any
            Router1(config-std-nacl)#end
            Router1(config)#ip access-list extended subnet-b
            Router1(config-std-nacl)#permit ip 192.168.300.0 0.0.0.255 any
            Router1(config)# class-map match-any class1
            Router1(config-cmap)# match access-group subnet-a
            Router1(config-cmap)# match access-group subnet-b
            Router1(config-cmap)# exit
            Router1(config)# policy-map policy-map-1
            Router1(config-pmap)# class class1
            Router1(config-pmap-c)# set dscp af21
            Router1(config-pmap-c)# end

注意:虽然没有调用class-default,系统仍然把非class1的数据放置在class-default里,并设置DSCP=0(默认值)。

例3-19:设置音/视频数据的CoS=5,其他数据的CoS=1。

            switch(config)# class-map match-all class6
            switch(config-cmap)# match ip rtp 2024100
            switch(config-cmap)# exit
            switch (config)# policy-map policy-map-2
            switch (config-pmap)# class class6
            switch (config-pmap-c)# set cos 5
            switch (config-pmap-c)# exit
            switch (config-pmap)# class class-default
            switch (config-pmap-c)# set cos 1
            switch (config-pmap-c)# end

例3-20:设置class3 数据的DSCP=af11,class4 数据的DSCP=af21,class5 数据的DSCP=af31,不属于上述三个类别的数据的DSCP=af13。

            switch (config)# class-map match-all class3
            switch (config-cmap)# match cos 2 3
            switch (config-cmap)# exit
            switch (config)# class-map match-any class4
            switch (config-cmap)# match destination-address mac 00:01:0c:00:12:34
            switch (config-cmap)# exit
            switch (config)# class-map match-any class5
            switch (config-cmap)# match input-interface f0/10
            switch (config-cmap)# exit
            switch (config)# policy-map policy-map-3
            switch (config-pmap)# class class3
            switch (config-pmap-c)# set dscp AF11
            switch (config-pmap-c)# exit
            switch (config-pmap)# class class4
            switch (config-pmap-c)# set dscp AF21
            switch (config-pmap-c)# exit
            switch (config-pmap)# class class5
            switch (config-pmap-c)# set dscp AF31
            switch (config-pmap-c)# exit
            switch (config-pmap)# class class-default
            switch (config-pmap-c)# set dscp AF13
            switch (config-pmap-c)# end

3.3.5 service-policy命令

该命令把policy-map应用在接口上,对进入该接口的数据进行分类和标记。其语法如下:

            Border_A (config-if)# service-policy input policy-map-name

policy-map-name——使用的policy-map的名字。

3.3.6 MQC应用示例

例3-21:交换机连接IP电话,桌面PC与IP电话相连。假设数据VLAN=10,地址为172.16.10.0/24;语音VLAN=100,地址为192.168.100.0/24。

            Distri-Switch3 (config)# ip access-list extended voice-traffic
            Distri-Switch3 (config-ext-nacl)# permit ip 192.168.100.0 0.0.0.255 any
            Distri-Switch3(config-ext-nacl)# ip access-list extended data-application
            Distri-Switch3(config-ext-nacl)# permit tcp 172.16.10.0 0.0.0.255 any eq 1521
            Distri-Switch3(config-ext-nacl)# permit tcp 172.16.10.0 0.0.0.255 any eq 1810
            Distri-Switch3(config-ext-nacl)# permit tcp 172.16.10.0 0.0.0.255 any eq 2481
            Distri-Switch3(config-ext-nacl)# permit tcp 172.16.10.0 0.0.0.255 any eq 7778
            Distri-Switch3(config-ext-nacl)# exit
            Distri-Switch3(config)# class-map  Class-A
            Distri-Switch3(config-cmap)# match access-group name voice-traffic
            Distri-Switch3(config-cmap)# exit
            Distri-Switch3(config)# class-map  Class-B
            Distri-Switch3(config-cmap)# match access-group name data-application
            Distri-Switch3(config-cmap)# exit
            Distri-Switch3(config)# policy-map sample-policy1
            Distri-Switch3(config-pmap)# class Class-A
            Distri-Switch3(config-pmap-c)# trust cos
            Distri-Switch3(config-pmap-c)# exit
            Distri-Switch3(config-pmap)# class Class-B
            Distri-Switch3(config-pmap-c)# set dscp af21
            Distri-Switch3(config-pmap-c)# exit
            Distri-Switch3(config-pmap)# class class-default
            Distri-Switch3(config-pmap-c)# set dscp af13
            Distri-Switch3(config-pmap-c)# exit
            Distri-Switch3(config-pmap)# exit
            Distri-Switch3(config)# interface GigabitEthernet 1/0/13
            Distri-Switch3(config-if)# switchport access vlan 10
            Distri-Switch3(config-if)# switchport mode access
            Distri-Switch3(config-if)# switchport voice vlan 100
            Distri-Switch3(config-if)# spanning-tree portfast
            Distri-Switch3(config-if)# service-policy input sample-policy1
            Distri-Switch3(config-if)# exit
            Distri-Switch3(config)# mls qos map cos-dscp  0  8  16  24  32  46  48  56

由于设置了class-default数据的DSCP=af13,该端口的CoS值由DSCP-CoS的映射表计算而得。

如果在端口上使用了“mls qos trust”命令,则该命令会在应用了service-policy命令后失效。

3.3.7 class-map嵌套

class-map嵌套也叫class-map调用,即由一个class-map语句调用另一个class-map语句,从而达到灵活分类数据的目的。

例3-22:class-map嵌套例子。

class4使用的是match-any关键词,即匹配3个条件中任意一个条件的数据都是符合要求的。

class5调用了class4,并且使用的是match-all关键词,这样的结果是匹配class4中任意一个条件并且同时匹配class5中其他条件的数据才是符合要求的。

policy-map命令调用的是class5,这样就产生了{[A or B or C]and D}的匹配结果。如果不使用class-map嵌套,在一个class-map里是不可能产生这样的结果的,因为在一个class-map里不能同时使用match-any和match-all。程序如下所示。

            Router(config)# access-list 2 permit 10.10.0.0 0.0.255.255
            Router(config)# class-map match-any class 4
            Router(config-cmap)# match protocol ip
            Router(config-cmap)# match qos-group 3
            Router(config-cmap)# match access-group 2
            Router(config-cmap)# exit
            Router(config)# class-map match-all class5
            Router(config-cmap)# match class-map class4
            Router(config-cmap)# match destination-address mac 00:01:00
            Router(config-cmap)# exit
            Router(config)# policy-map sample-policy 2
            Router(config-pmap)# class class5
            Router (config-pmap-c)# set dscp af41
            Router (config-pmap-c)# exit
            Router(config-cmap)# exit
            Router (config)# interface GigabitEthernet 2/0
            Router (config-if)# service-policy input sample-policy 2
            Router (config-if)# end

3.3.8 policy-map嵌套

类似于class-map调用,policy-map也可以调用。policy-map嵌套形成的是具有分层结构的策略。

例3-23:policy-map嵌套。

            Switch(config)# class-map inner-class
            Switch(config-cmap)# match mpls experimental 2
            Switch(config-cmap)# exit
            Switch(config)# class-map outer-class
            Switch(config-cmap)# match vlan 203
            Switch(config-cmap)# exit
            Switch(config)# policy-map inner-policy
            Switch(config-pmap)# class inner-class
            Switch(config-pmap-c)# set mpls experimental 5
            Switch(config-pmap-c)# exit
            Switch(config-pmap)# exit
            Switch(config)# policy-map outer-policy
            Switch(config-pmap)# class outer-class
            Switch(config-pmap-c)# service-policy inner-policy
            Switch(config-pmap-c)# exit
            Switch(config-pmap)# exit
            Switch(config)# interface GigabitEthernet1/1/2
            Switch(config-if)# switchport trunk encapsulation isl
            Switch(config-if)# switchport mode trunk
            Switch(config-if)# service-policy input outer-policy

在本例中,inner-class匹配的条件是EXP=2,outer-class匹配的条件是VLAN=203。Inner-policy的目的是把EXP=2的数据更改为EXP=5。Outer-policy调用inner-policy,执行的结果是在VLAN203中,EXP=2的数据都被改写为EXP=5。

提示:inner-class定义的数据集合应该小于或等于outer-class定义的数据集合。

3.3.9 检查配置的命令

(1)查看class-map的命令。

语法如下:

            Switch# show class-map class-map-name

例3-24:查看名字叫ipp5的class-map。

            Switch# show class-map ipp5
            Class Map match-all ipp5 (id 1)
            Match ip precedence 5
            Switch#

输出显示名字叫ipp5的class-map使用的关键词是match-all,匹配的是IP优先级等于5的数据包。

(2)查看policy-map的命令。

语法如下:

            Switch# show policy-map policy_name

例3-25:查看名字叫ipp5-policy的policy-map。

            Switch# show policy-map ipp5-policy
            Policy Map ipp5-policy
            class ipp5
            set ip precedence 6

(3)查看接口上应用的policy-map。

语法如下:

            Switch#  show  policy-map  interface  {vlan  vlan_ID  |{FastEthernet  |
    GigabitEthernet} slot/interface}

例3-26:查看端口5/36上应用的policy-map。

            Switch# show policy-map interface FastEthernet 5/36
            service-policy input: policy-1
            class-map: c-1 (match-any)
            238474 packets
            match:access-group 100
            38437 packets
            class-map:class-default (match-any)
            0 packets
            match:any
            0 packets
            Switch#

输出显示该端口在入口方向(input)上应用了名字叫policy-1的策略。Policy-1调用了c-1(match access-group 100),有38437个数据包匹配。没有数据匹配默认数据类。

提示:根据设备平台和IOS版本的不同,命令的输出结果会有所不同。