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 沿用边界标记;第三,边界只设一次,避免多跳重复改写。下图展示了这一信任链与分类标记的数据流关系。
六、验证与排障要点
策略下发后,必须验证“分类是否命中、标记是否正确”。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 串用导致误分类。
总结来看,本节的核心链路是:ACL 负责“看清”,Class Map 负责“归类”,Policy Map 负责“标记与信任”,而信任边界决定“从哪一跳开始相信标记”。把这四件事在多租户场景中一一落实,后续的队列调度与拥塞治理才有可靠的基础。