3. 流量分类与标记实战

在数据中心里,QoS 能否真正生效,第一步不在队列,而在“识别”。如果设备无法把不同租户、不同业务流准确区分出来,后面的调度、整形、丢弃策略都无从谈起。Arista EOS 的 QoS 分类体系遵循 MEF 与 DiffServ 的通用模型:先用 ACL 做精细匹配,再用 Class Map 把匹配结果组织成流量类别,最后用 Policy Map 决定这些类别被标记成什么、是否被信任、是否被限速。本节围绕这条链路,讲清多租户与业务流分类的落地方法。

一、分类、标记与信任边界的关系

分类(Classification)是“看包”,标记(Marking)是“改包”,信任(Trust)是“决定信不信上游已经改好的包”。三者顺序不能颠倒:先分类,再决定标记或信任,最后才进入队列调度。信任边界(Trust Boundary)指的是网络中“从哪一跳开始,设备承认报文自带的 DSCP/CoS 值”。在接入层,通常把边界设在连接服务器或租户设备的端口上,由接入交换机重新标记;在核心层则普遍启用 trust dscp,直接沿用上游标记,避免重复改写。

一个常见的误区是:在核心口也做 ACL 重标记。这会导致同一业务流在不同跳被反复改写,DSCP 语义漂移,端到端 PHB 无法保证。正确做法是边界标记、内部信任:接入侧完成分类与标记,汇聚与核心侧只信任并执行队列策略。

二、用 ACL 做多租户与业务流匹配

ACL 是分类的“眼睛”。在多租户场景中,租户通常以 VLAN、VRF 或源子网区分;业务流则以端口号、协议或 DSCP 区分。下面是一组教学示例(参数为合理假设,非实测结果):租户 A 使用 VLAN 110、子网 10.110.0.0/24,租户 B 使用 VLAN 120、子网 10.120.0.0/24;存储流量走 TCP 3260(iSCSI),语音走 UDP 5060(SIP)。

ip access-list TENANT-A-VOICE
   10 permit udp 10.110.0.0/24 any eq 5060
ip access-list TENANT-A-STORAGE
   10 permit tcp 10.110.0.0/24 any eq 3260
ip access-list TENANT-B-BULK
   10 permit ip 10.120.0.0/24 any

这里刻意把“租户”和“业务”拆成两条 ACL,而不是一条大 ACL。原因是 Class Map 需要按类别独立引用,拆开后策略可读性和可维护性都更好。注意 ACL 只做匹配,不在此处设置 DSCP,标记动作留给 Policy Map,职责分离更清晰。

三、Class Map:把匹配结果组织成类别

Class Map 是“分类容器”,它引用 ACL 或直接匹配 DSCP/CoS,并给类别命名。EOS 中 class-map type qos 用于 QoS 分类。示例:

class-map type qos match-any CM-TENANT-A-VOICE
   match access-group name TENANT-A-VOICE
class-map type qos match-any CM-TENANT-A-STORAGE
   match access-group name TENANT-A-STORAGE
class-map type qos match-any CM-TENANT-B-BULK
   match access-group name TENANT-B-BULK
class-map type qos match-any CM-DEFAULT
   match any

关键点是 match-any 与 match-all 的语义差异:match-any 表示“命中任一条件即属于该类”,match-all 表示“必须同时满足所有条件”。多租户分类通常用 match-any,因为一个类别往往由多条 ACL 条目组成。另外,CM-DEFAULT 用 match any 兜底,确保未被显式分类的流量有明确归宿,避免“无类可归”导致策略落空。

四、Policy Map:标记、信任与限速

Policy Map 把 Class Map 与动作绑定。动作包括 set dscp、set cos、trust dscp、police 等。下面给出一个完整的边界标记策略示例:

policy-map type qos PM-EDGE-MARKING
   class CM-TENANT-A-VOICE
      set dscp ef
      set cos 5
   class CM-TENANT-A-STORAGE
      set dscp af31
      set cos 3
   class CM-TENANT-B-BULK
      set dscp af11
      set cos 1
   class CM-DEFAULT
      set dscp 0
      set cos 0

这里语音标 EF(DSCP 46)、CoS 5;存储标 AF31(DSCP 26)、CoS 3;租户 B 大流量标 AF11(DSCP 10)、CoS 1;其余归零。标记完成后,在接口上应用:

interface Ethernet1
   service-policy type qos input PM-EDGE-MARKING

注意方向:input 表示在报文进入设备时分类标记,这是边界标记的标准位置。若在 output 应用,则标记发生在出队前,对本地队列调度已无意义,通常只用于出口重写。

五、信任边界的落地设计

信任边界的设计可以归纳为三条规则:第一,面向服务器/租户的端口不信任,一律用 Policy Map 重标记,防止租户伪造高优先级;第二,面向汇聚/核心的上行口信任 DSCP,用 trust dscp 沿用边界标记;第三,边界只设一次,避免多跳重复改写。下图展示了这一信任链与分类标记的数据流关系。

多租户业务流分类与信任边界数据流 租户 A VLAN 110 10.110.0.0/24 语音 / 存储 租户 B VLAN 120 10.120.0.0/24 大流量业务 接入交换机(信任边界) ACL 匹配 Class Map 分类 Policy Map 重标记 set dscp / set cos input 方向 汇聚 / 核心 trust dscp 沿用边界标记 队列调度 / 整形 不重复改写 出口 PHB 执行 标记结果:语音 EF/CoS5 存储 AF31/CoS3 租户B大流量 AF11/CoS1 默认 0/0 边界只标记一次,核心信任 DSCP,避免语义漂移

六、验证与排障要点

策略下发后,必须验证“分类是否命中、标记是否正确”。EOS 提供 show policy-map type qos interface Ethernet1 input 查看各类别的匹配计数;用 show interfaces Ethernet1 counters 观察流量是否进入预期队列。若某类别计数为 0,优先检查 ACL 是否命中、Class Map 是否被 Policy Map 引用、以及接口方向是否写反。

另一个高频问题是“标记了但没生效”。这通常是因为上游设备不信任 DSCP,或中间设备把 DSCP 重写为 0。排查顺序是:从边界口逐跳用 show ip interface 与抓包确认 DSCP 值,确认信任配置是否在每一跳一致。多租户环境下还要注意 VRF 与 ACL 的绑定关系,避免租户间 ACL 串用导致误分类。

建议把“租户—VLAN—子网—业务—DSCP/CoS”整理成一张对照表,作为分类策略的唯一事实来源。策略变更时先改表、再改配置,可显著降低多租户环境下的误标记风险。

总结来看,本节的核心链路是:ACL 负责“看清”,Class Map 负责“归类”,Policy Map 负责“标记与信任”,而信任边界决定“从哪一跳开始相信标记”。把这四件事在多租户场景中一一落实,后续的队列调度与拥塞治理才有可靠的基础。