1. QINQ 技术核心概念与设计初衷
1.1 什么是 QINQ,为什么需要它
QINQ,业内也常叫“双层 VLAN 标签”“VLAN 堆叠”或者“Stacked VLAN”,本质上是 IEEE 802.1Q 协议的一个扩展用法。普通 802.1Q 的以太网帧里只带一层 VLAN Tag,总共 4 个字节,包含 12 位 VLAN ID,理论最多支持 4094 个可用 VLAN。这个数量在早期园区网里够用,但放到城域网、大型园区汇聚、多租户数据中心接入这些场景里,4094 个 VLAN 很快就不够分了。
QINQ 的做法很直接:在原有 802.1Q 帧的源 MAC 地址前面再插入一层 4 字节的 VLAN Tag,让一个帧同时携带两层标签。外层标签通常叫S-VLAN(Service VLAN,服务提供商 VLAN),内层标签叫C-VLAN(Customer VLAN,客户 VLAN)。外层标签由运营商或汇聚设备统一分配,用来标识不同的客户或不同的业务域;内层标签由客户自己规划,运营商不关心也不修改。这样一来,运营商侧只需要管理外层标签空间,客户侧可以自由使用自己的内层 VLAN 规划,两边解耦,VLAN 数量从 4094 扩展到 4094×4094,理论上接近 1600 万,实际部署中受芯片表项限制,但撑起几千个客户绰绰有余。
我最早接触 QINQ 是在一个园区多栋楼汇聚的场景里。每栋楼有自己的接入交换机,VLAN 规划各自独立,但汇聚到核心时 VLAN ID 冲突严重。当时试过重新规划全网 VLAN,牵一发动全身,后来改用 QINQ,每栋楼一个外层 VLAN,楼内 VLAN 原样保留,配置量小,改动范围可控,上线后一直很稳。
1.2 QINQ 的两种基本模式:基本 QINQ 与灵活 QINQ
QINQ 在交换机上的实现通常分两种模式,理解这两种模式是配置的前提。
基本 QINQ(Basic QINQ)也叫“端口-based QINQ”。它的逻辑是:一个物理端口收到所有带 Tag 的帧,统一打上同一个外层 VLAN Tag。比如端口 G0/0/1 配置外层 VLAN 100,那么从这个端口进来的所有帧,不管内层 VLAN 是多少,都会被加上 S-VLAN 100。这种模式配置最简单,适合“一个端口对应一个客户”的场景,比如一栋楼一个上行端口,或者一个租户一个接入端口。
灵活 QINQ(Selective QINQ)也叫“VLAN-based QINQ”。它允许根据内层 VLAN ID 的不同,给帧打上不同的外层 VLAN Tag。比如内层 VLAN 10 到 20 的帧打外层 VLAN 100,内层 VLAN 30 到 40 的帧打外层 VLAN 200。这种模式适合一个端口下挂多个客户或多个业务域的场景,比如一个小区接入交换机的一个上行口,下面有多个住户 VLAN,需要映射到不同的服务 VLAN。
选择哪种模式,核心看两点:一是端口下是否需要区分多个外层 VLAN,二是内层 VLAN 是否需要被运营商侧感知。如果只是简单隔离,基本 QINQ 足够;如果要做精细化业务区分,灵活 QINQ 更合适。
1.3 QINQ 帧结构变化与转发逻辑
普通 802.1Q 帧结构是:目的 MAC(6B)+ 源 MAC(6B)+ TPID(0x8100,2B)+ TCI(2B)+ 类型/长度(2B)+ 数据 + FCS。QINQ 帧在源 MAC 后面插入外层 Tag,变成:目的 MAC + 源 MAC + 外层 TPID(0x8100 或 0x88A8)+ 外层 TCI + 内层 TPID(0x8100)+ 内层 TCI + 类型/长度 + 数据 + FCS。外层 TPID 有些设备默认 0x8100,有些支持改成 0x88A8,后者是 IEEE 802.1ad 定义的服务标签 TPID,部分运营商网络要求用 0x88A8 来区分服务标签和客户标签。
转发逻辑上,接入交换机在入方向给帧加外层 Tag,在出方向剥掉外层 Tag。汇聚和核心交换机只根据外层 Tag 做转发,内层 Tag 对它们透明。这样运营商侧只需要维护外层 VLAN 的转发表,表项规模大幅缩小,转发效率也更高。
注意:QINQ 的外层 Tag 插入和剥离通常发生在“用户网络边缘”端口,也就是连接客户设备的端口。上行 trunk 口一般允许外层 VLAN 通过,不剥离标签。
2. 配置前的准备工作与关键参数规划
2.1 设备选型与版本确认
不是所有交换机都支持 QINQ,配置前必须先确认设备能力。通常接入层和汇聚层交换机需要支持 QINQ,核心层如果只做外层 VLAN 转发,普通三层交换机也能胜任。我一般会查三个东西:产品文档里的“QINQ 支持情况”、当前软件版本是否包含 QINQ 特性、以及芯片规格里外层 VLAN 表项数量。
以常见的企业级交换机为例,接入层设备通常支持基本 QINQ 和灵活 QINQ,但灵活 QINQ 的映射表项数量有限,比如 128 条或 256 条。如果映射规则超过表项上限,就得拆分到多个端口或升级设备。这个细节在规划阶段就要确认,否则配置到一半发现表项不够,返工很麻烦。
版本方面,不同厂商的命令行差异较大,但核心逻辑一致。我习惯先在一台测试设备上把命令跑通,再批量推到现网。测试时重点验证:外层 Tag 是否正确插入、内层 Tag 是否保留、上行口是否正常透传、下行口是否正常剥离。
2.2 VLAN 规划与外层标签分配原则
QINQ 规划的核心是外层 VLAN 的分配。我的经验是遵循几个原则:
- 外层 VLAN 全局唯一:在整个 QINQ 域内,每个外层 VLAN 只能对应一个客户或一个业务域,不能重复。比如客户 A 用外层 VLAN 100,客户 B 就不能再用 100。
- 外层 VLAN 与内层 VLAN 解耦:外层 VLAN 的编号空间和内层完全独立,客户内层可以用 1 到 4094 任意值,运营商侧不关心。
- 预留扩展空间:外层 VLAN 分配时按客户或楼栋分段,比如 100 到 199 给第一片区,200 到 299 给第二片区,方便后续扩容。
- 避免使用保留 VLAN:VLAN 1 通常作为默认 VLAN,不建议用于 QINQ 外层;VLAN 4095 在某些设备上是保留值,也要避开。
内层 VLAN 由客户自行规划,运营商侧不需要配置,但需要在接入端口上允许这些内层 VLAN 通过。如果客户内层 VLAN 有重叠,比如两个客户都用 VLAN 10,在基本 QINQ 下没问题,因为外层不同;但在灵活 QINQ 下,如果映射规则基于内层 VLAN,就需要确保同一端口下内层 VLAN 不冲突。
2.3 端口角色与链路类型确认
QINQ 配置涉及三类端口角色:
- 用户接入端口(UNI):连接客户设备,负责插入外层 Tag。通常是 access 或 hybrid 模式,配置 QINQ 使能。
- 上行 trunk 端口(NNI):连接汇聚或核心,负责透传双层 Tag。通常是 trunk 模式,允许外层 VLAN 通过。
- 级联端口:如果接入交换机有多级级联,级联口也需要透传双层 Tag,配置与上行口类似。
配置前要画一张简单的拓扑图,标清每个端口的角色和对端设备。我见过不少配置错误是因为端口角色搞混,比如把用户接入端口配成了 trunk,结果外层 Tag 没加上,或者上行口配成了 access,双层 Tag 被剥掉一层。
提示:如果接入交换机和汇聚交换机之间经过传输设备,要确认传输设备是否支持双层 Tag 透传。有些老传输设备会丢弃带双层 Tag 的帧,或者只识别外层 TPID 为 0x8100 的帧。
3. 基本 QINQ 配置实操与验证
3.1 基本 QINQ 配置步骤
基本 QINQ 的配置相对简单,核心是在用户接入端口上指定外层 VLAN。以下以某主流企业级交换机命令行风格为例,展示完整配置流程。不同厂商命令可能不同,但逻辑一致。
# 进入全局配置模式 system-view # 创建外层 VLAN vlan 100 description QINQ-SVLAN-CustomerA quit # 配置用户接入端口 interface GigabitEthernet0/0/1 port link-type dot1q-tunnel port default vlan 100 qinq enable quit # 配置上行 trunk 端口 interface GigabitEthernet0/0/24 port link-type trunk port trunk allow-pass vlan 100 quit这里的关键命令是port link-type dot1q-tunnel,它把端口设为 QINQ 隧道模式,收到带 Tag 的帧后不剥离内层 Tag,而是直接加上外层 VLAN 100。port default vlan 100指定外层 VLAN。qinq enable在某些设备上是必须的,用来显式开启 QINQ 功能。
上行口配置为 trunk,允许外层 VLAN 100 通过。注意这里只需要允许外层 VLAN,内层 VLAN 不需要在上行口放通,因为上行口转发时只看外层 Tag。
3.2 配置验证与抓包分析
配置完成后,验证分三步:
- 查看端口 QINQ 状态:用
display qinq interface GigabitEthernet0/0/1或类似命令,确认端口 QINQ 已使能,外层 VLAN 正确。 - 查看 MAC 地址表:用
display mac-address查看外层 VLAN 下是否学习到客户 MAC,确认转发正常。 - 抓包验证:在用户接入端口和上行端口分别镜像抓包,对比帧结构。用户侧应该是单层 Tag,上行侧应该是双层 Tag,外层 VLAN 100,内层 VLAN 保持客户原值。
我一般会在上行口抓包,重点看三个字段:外层 TPID 是否为 0x8100 或 0x88A8、外层 VLAN ID 是否为规划值、内层 VLAN ID 是否与客户侧一致。如果外层 Tag 没加上,检查端口是否真的进入了 dot1q-tunnel 模式;如果内层 Tag 被改了,检查是否有其他 VLAN 转换规则冲突。
注意:抓包时如果看到外层 TPID 是 0x8100,而规划要求 0x88A8,需要在全局或端口下修改 TPID 配置。部分设备支持
qinq ethernet-type 88a8这类命令。
3.3 基本 QINQ 的适用场景与局限
基本 QINQ 最适合“一个端口一个客户”的场景。比如园区里每栋楼一个上行端口,楼内 VLAN 规划不变,汇聚侧每栋楼一个外层 VLAN,配置量小,维护简单。我做过一个项目,12 栋楼,每栋楼一个外层 VLAN,接入交换机配置基本 QINQ,汇聚交换机只做外层 VLAN 转发,整个配置半天搞定,后续扩容也只是加外层 VLAN。
但基本 QINQ 的局限也很明显:一个端口只能对应一个外层 VLAN,如果端口下挂多个客户,就无法区分。比如一个小区接入交换机的一个上行口,下面有多个住户,每个住户需要独立的外层 VLAN,基本 QINQ 做不到。这时候就需要灵活 QINQ。
4. 灵活 QINQ 配置实操与映射规则设计
4.1 灵活 QINQ 的映射逻辑与配置命令
灵活 QINQ 的核心是“内层 VLAN 到外层 VLAN 的映射”。配置时通常用流分类(traffic classifier)或 VLAN 映射表来实现。以下以某主流设备为例,展示基于内层 VLAN 的灵活 QINQ 配置。
# 创建外层 VLAN vlan 100 description QINQ-SVLAN-Group1 vlan 200 description QINQ-SVLAN-Group2 quit # 配置流分类,匹配内层 VLAN 10-20 traffic classifier c1 operator or if-match vlan 10 to 20 quit # 配置流行为,打外层 VLAN 100 traffic behavior b1 remark vlan-id 100 quit # 配置流策略,绑定分类和行为 traffic policy p1 classifier c1 behavior b1 quit # 在用户接入端口应用流策略 interface GigabitEthernet0/0/1 port link-type hybrid qinq enable traffic-policy p1 inbound quit这里的关键是流分类匹配内层 VLAN,流行为打外层 VLAN。不同厂商命令差异较大,有的用qinq vlan-translation,有的用vlan-mapping,但逻辑都是“匹配内层,指定外层”。
4.2 映射规则设计中的常见坑
灵活 QINQ 配置中最容易出问题的是映射规则的优先级和冲突。我踩过几次坑,总结几个要点:
- 匹配顺序:如果多条规则匹配同一个内层 VLAN,设备通常按配置顺序或优先级匹配,先匹配到的生效。规划时要确保规则不重叠,或者明确优先级。
- 表项数量限制:灵活 QINQ 的映射表项通常有限,比如 128 条。如果内层 VLAN 范围很大,比如 1 到 1000,可能需要拆成多条规则,或者用范围匹配。配置前查清楚设备表项规格。
- 未匹配帧的处理:如果某个内层 VLAN 没有匹配到任何规则,帧可能被丢弃或走默认外层 VLAN。要明确默认行为,避免业务中断。
- 内外层 VLAN 冲突:外层 VLAN 和内层 VLAN 编号可以相同,但某些设备在特定模式下会冲突。我一般建议外层用高位段,比如 1000 以上,内层用低位段,减少混淆。
提示:灵活 QINQ 配置完成后,一定要用
display traffic policy或类似命令查看策略是否生效,再用抓包验证映射结果。我遇到过策略配置了但没应用 inbound 方向,结果外层 Tag 没加上,排查了半天。
4.3 灵活 QINQ 在 multi-tenant 场景的应用
灵活 QINQ 最典型的应用是多租户接入。比如一个园区有多个租户,每个租户有多个 VLAN,租户之间需要二层隔离。用灵活 QINQ,每个租户分配一个外层 VLAN,租户内 VLAN 映射到该外层 VLAN。汇聚侧只看到外层 VLAN,租户内 VLAN 对汇聚透明。这样租户可以自由规划内层 VLAN,运营商侧管理简单。
我做过一个类似项目,一个接入交换机下挂 5 个租户,每个租户 3 到 5 个 VLAN。用灵活 QINQ,配置 5 条映射规则,每个租户一个外层 VLAN。上线后租户内 VLAN 调整不需要运营商侧配合,租户自己改接入交换机配置就行,运维效率提升明显。
5. 常见问题排查与避坑经验实录
5.1 QINQ 配置后业务不通的排查思路
QINQ 配置后业务不通,排查顺序我一般按“从下到上、从外到内”来:
- 检查端口模式:用户接入端口是否真的进入了 QINQ 模式?用
display interface或display qinq确认。我见过端口配了port default vlan但没配qinq enable,结果外层 Tag 没加上。 - 检查外层 VLAN 是否创建:外层 VLAN 必须在全局创建,并且在上行口允许通过。如果外层 VLAN 没创建,帧会被丢弃。
- 检查上行口 trunk 配置:上行口是否允许外层 VLAN 通过?是否误配了
port trunk pvid导致外层 Tag 被剥掉? - 检查内层 VLAN 是否被意外修改:有些设备在 QINQ 模式下会默认修改内层 VLAN,需要显式配置保留内层 Tag。
- 抓包定位:在用户侧和上行侧分别抓包,对比帧结构。如果用户侧有 Tag,上行侧没有外层 Tag,问题在接入端口;如果上行侧有外层 Tag 但业务不通,问题在汇聚或核心。
5.2 常见问题速查表
| 问题现象 | 可能原因 | 排查方法 | 解决方法 |
|---|---|---|---|
| 上行口看不到外层 Tag | 接入端口未使能 QINQ | 查看端口 QINQ 状态 | 配置qinq enable和port link-type dot1q-tunnel |
| 外层 Tag 加上了但业务不通 | 上行口未允许外层 VLAN | 查看 trunk 允许 VLAN 列表 | 在上行口port trunk allow-pass vlan添加外层 VLAN |
| 内层 Tag 被修改 | 设备默认 VLAN 转换 | 抓包对比内外层 VLAN | 配置保留内层 Tag 或关闭默认转换 |
| 灵活 QINQ 映射不生效 | 流策略未应用或方向错误 | 查看流策略应用情况 | 在端口 inbound 方向应用流策略 |
| 部分 VLAN 业务不通 | 映射表项超限 | 查看映射表项数量 | 拆分规则或升级设备 |
| 传输设备丢包 | 传输设备不支持双层 Tag | 在传输两端抓包 | 更换传输设备或调整 TPID |
5.3 独家避坑经验
几个我在实际项目中踩过的坑,分享出来供参考:
- TPID 不一致导致丢包:有些运营商网络要求外层 TPID 为 0x88A8,设备默认是 0x8100。如果两端 TPID 不一致,帧会被丢弃。配置前确认对端要求,必要时修改 TPID。
- MTU 问题:QINQ 帧比普通帧多 4 字节,如果链路 MTU 刚好卡在边界,可能导致大包丢弃。建议在 QINQ 链路上适当增大 MTU,比如从 1500 调到 1504 或更高。
- MAC 地址表溢出:QINQ 下外层 VLAN 数量多,MAC 地址表可能比普通 VLAN 更容易溢出。监控 MAC 表使用率,必要时调整老化时间或升级设备。
- 级联端口配置遗漏:如果接入交换机有多级级联,级联口也需要透传双层 Tag。我见过只配了上行口,级联口没配,结果下级设备业务不通。
- 配置保存与重启:QINQ 配置通常需要保存后重启才完全生效,尤其是流策略类配置。配置完成后记得保存,并在维护窗口重启验证。
注意:QINQ 配置变更通常影响范围较大,建议在业务低谷期操作,并提前准备好回滚方案。我一般会先备份当前配置,再逐台设备变更,每台变更后立即验证业务。
6. QINQ 与相关技术的对比与选型建议
6.1 QINQ 与 VLAN 映射、VXLAN 的对比
QINQ 不是唯一的 VLAN 扩展方案,常见的还有 VLAN 映射和 VXLAN。三者的对比如下:
| 技术 | 扩展方式 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|---|
| QINQ | 双层 VLAN Tag | 城域网、园区汇聚、多租户接入 | 配置简单、兼容性好、成本低 | VLAN 数量仍有限、依赖二层网络 |
| VLAN 映射 | 内外层 VLAN 转换 | 单端口多客户、业务区分 | 灵活、可基于 VLAN 映射 | 表项有限、配置复杂 |
| VXLAN | MAC-in-UDP 封装 | 数据中心、大二层互联 | 扩展性强、支持三层承载 | 配置复杂、需要支持 VXLAN 的设备 |
选型时,如果只是园区内 VLAN 扩展,QINQ 足够;如果需要跨三层网络扩展二层,VXLAN 更合适;如果只是单端口多客户区分,VLAN 映射或灵活 QINQ 都可以。
6.2 什么场景下优先选 QINQ
根据我的经验,以下场景优先考虑 QINQ:
- 园区多栋楼汇聚:每栋楼一个外层 VLAN,楼内 VLAN 不变,配置量小。
- 多租户接入:每个租户一个外层 VLAN,租户内 VLAN 自由规划。
- 城域网客户接入:运营商侧用外层 VLAN 区分客户,客户侧 VLAN 透明。
- 现有网络改造:不想大改 VLAN 规划,只想在汇聚侧做隔离。
如果场景涉及跨三层网络、大规模租户隔离、或者需要 Overlay 能力,QINQ 可能不够,需要考虑 VXLAN 或其他方案。
6.3 选型时的关键考量因素
选型时我一般看几个因素:
- 设备支持能力:现有设备是否支持 QINQ,支持基本还是灵活,表项数量多少。
- 网络规模:外层 VLAN 数量需求,是否超过设备表项上限。
- 运维复杂度:QINQ 配置相对简单,VXLAN 需要更多运维投入。
- 成本:QINQ 通常不需要额外硬件,VXLAN 可能需要支持 VXLAN 的设备。
- 未来扩展:如果未来可能上云或跨数据中心,VXLAN 更有优势。
我个人体会是,QINQ 在园区和城域网场景里仍然是性价比很高的方案,配置简单、兼容性好、运维门槛低。只要规划好外层 VLAN,后续扩容和调整都很方便。灵活 QINQ 虽然配置复杂一些,但在多租户场景下能显著减少端口数量,长期看运维成本更低。
最后分享一个小技巧:QINQ 配置完成后,建议在汇聚侧做一个简单的流量统计,按外层 VLAN 统计进出流量。这样既能验证业务是否正常,也能为后续扩容提供数据支撑。我一般用display interface或 SNMP 采集外层 VLAN 的流量,观察一周左右,确认没有异常丢包或流量突增,再正式交付。