最近有个朋友在搞网络改造,照着一张拓扑图把两台交换机之间的Trunk配好了,然后抓包发现一个很奇怪的现象:楼下明明只有VLAN 20的终端,可是在Trunk口上却能看到VLAN 10、VLAN 30的广播帧也在来回溜达。这个现象太典型了——Trunk口在默认状态下会把所有VLAN的流量都往对端送,不管对端到底需不需要。解决这个问题的核心手段,就是这次要聊的VLAN修剪(VLAN Pruning)。
这篇随手记不是给你抄认证题库的,而是从原理、配置命令、排查思路三个层面,把VLAN修剪这件事彻底讲明白。适合刚接触二三层交换的新手,也适合正在做网络优化、被Trunk上广播流量烦到的运维同学。看完你至少能回答三个问题:修剪到底在剪什么?三种主流的修剪方式怎么选择?出问题的时候怎么快速定位?
说实话,VLAN修剪在教科书里经常被一笔带过,但实际生产中它直接关系到广播风暴能不能被掐断、视频组播流会不会污染无关VLAN、以及Trunk带宽被谁偷走。越底层的细节,越容易被人忽略,可往往就是这些细节决定了一个网络的稳定性。
1. 先搞懂VLAN修剪到底修剪了啥
1.1 从一个“多管闲事”的Trunk说起
要理解修剪,得先从Trunk的默认行为说起。Trunk接口的设计初衷是承载多个VLAN的流量,它像一个多车道的传送带,VLAN 10的帧、VLAN 20的帧、VLAN 30的帧都可以在这条链路上跑。问题在于,传送带默认会对所有VLAN敞开,哪怕对端交换机上压根没有VLAN 20的活动端口,传送带依然会把VLAN 20的广播、组播、未知单播帧运过去。
为什么会这样?因为交换机的转发逻辑是:收到一个广播帧,查到目的MAC是广播地址,就把这个帧从同一个VLAN的所有Trunk口复制转发出去。它没法判断对端到底有没有这个VLAN的接收者。在没做任何限制的情况下,Trunk口从逻辑上就是一个无差别的广播域扩容器,一个VLAN广播,全网络所有交换机都能收到。
打个比方,Trunk就像一栋楼里的消防通道,默认状态是每一层都能通过消防通道走到另一层,哪怕某层根本没有房间需要这条路。VLAN修剪要做的事,就是明确告诉消防通道:B层不需要通到D层,那么B层和D层之间的通道直接锁死。
修剪的本质,是让Trunk口只放行“必要”的VLAN流量,把不需要跨越这条链路的VLAN从“放行列表”里剔除。它不会删除VLAN本身,也不会影响VLAN在接入口上的正常工作,只是对Trunk链路做了一个按需收口。
1.2 修剪的两种视角:动态声明式与静态过滤式
VLAN修剪听起来是一个名词,其实它是一类操作思路的总称。在真实设备上,实现修剪主要有两种形式。
静态方式就是人工在Trunk接口上声明“这个口只放行这几个VLAN”,用命令直接维护一个允许放行的VLAN列表。这种方式直观、可控,也是我日常最推荐的方式。缺点是网络拓扑变化时需要人工去逐台设备调整,漏改一台就可能出现该通的不通。
动态方式则由设备之间通过协议自动协商。交换机会向对端声明自己需要哪些VLAN,不需要的VLAN自动从Trunk放行列表里剔除。代表技术有某些厂商私有的VTP修剪(VTP Pruning)、IEEE 802.1Q标准体系下的GVRP以及它的后继者MVRP。动态修剪的好处是省人工,坏处是协议状态一旦搞不清楚,排障会非常痛苦。
两种视角并不是对立的。很多网络里先靠动态协议搭建大方向,再靠静态列表做关键节点收口。后面会展开讲具体命令,先把思路建立起来很重要:修剪不是某一台设备上的单个开关,而是你对整条Trunk链路“该放谁、不该放谁”的控制策略。
2. 不修剪会怎样?三个真实痛点
2.1 广播流量吞噬Trunk带宽
没有修剪的最直接后果,是Trunk链路上的广播流量呈“叠加态”。
假设一台汇聚交换机下面接了20个接入交换机,全网规划了30个VLAN,每个VLAN每秒钟各自产生2000个广播帧,每个广播帧平均算500字节。在没有修剪的情况下,每一个VLAN的广播都会被复制到每一条Trunk上。单条Trunk每秒要承载的广播流量就是:2000帧 × 30个VLAN × 500字节 ≈ 3000万字节/秒,约合240Mbps。
这还不是广播风暴,只是日常正常的ARP广播和DHCP请求,就让一条1Gbps的Trunk吃掉了近四分之一带宽。如果某个VLAN里出现环路或者环路异常,广播帧会指数级翻倍,Trunk口瞬间被打满,业务流量只能排队等死,网络卡顿从接入层一路蔓延到汇聚层。
我实际处理过不少“网络突然变卡”的工单,打开Trunk口统计一看,广播报文占比超过了70%,链路利用率长期压到90%以上。最后把所有不需要跨越Trunk的VLAN全部修剪掉,广播占比降到10%以下,业务恢复流畅。原理很简单:修剪把无意义的复制流量掐在了源头。
2.2 未知单播与组播的“二次浪费”
广播是最容易理解的浪费,但未知单播和组播的浪费更隐蔽。
交换机转发未知单播帧时,因为MAC表里没有匹配项,只能像广播帧一样泛洪到同VLAN的所有Trunk口。比如一个终端刚接入网络,还没有发任何报文,此时其他设备发来的第一个单播帧就会被当作未知单播在整个广播域里漫游。听起来一帧无所谓,但用户多、终端频繁上下线时,累积起来的泛洪量非常可观。
组播的应用场景就更典型了。视频监控、无线AP的组播软件升级、数字电视信号,这些都是组播流。如果视频监控VLAN只在A汇聚区和B汇聚区之间需要传输,而不修剪的话,这路组播流会被Trunk送到每一个接入交换机,哪怕那台交换机下面根本没有摄像头。
有意思的是,组播协议(比如IGMP Snooping)只能解决接收者不感兴趣时“不转发给主机”的问题,但无法解决Trunk上“不需要这个组播流的交换机还在被传输”的问题。真正拦住组播跨无用链路传播的,依然是VLAN修剪。把不需要的VLAN从Trunk上收掉,组播流直接就不会到达那台交换机,IGMP Snooping的负担也跟着降下来。
2.3 安全边界模糊带来的隐患
严格来说,VLAN修剪不是安全功能,它的诞生初衷是省带宽,而不是防入侵。但它的确有一个附带价值:缩小了每个VLAN流量的暴露面。
举个例子,财务VLAN和访客VLAN在物理上接入同一台汇聚交换机,两条Trunk直连到两台接入设备。如果Trunk没有任何修剪,财务VLAN的帧就会出现在接入交换机的链路上,虽然终端依靠VLAN隔离看不到内容,但抓包时财务VLAN的帧就在访客交换机的Trunk口上飘着,这本身就给了攻击者一个嗅探的窗口。
反过来,把Trunk口上不需要的VLAN收掉之后,财务VLAN的流量根本没有机会进入访客区域的二层路径,攻击者哪怕在访客交换机上抓包,抓到的一堆报文里也不存在财务VLAN的帧。这个提升是结构性的,不是靠ACL或防火墙补出来的。
需要强调一下,修剪不能替代真正的安全隔离。如果VLAN本身设计就有问题,权限边界混乱,光靠修剪救不回来。修剪起到的只是“让不该出现的流量不出现在不该出现的链路上”这一层收口作用。
3. 实操:三种主流VLAN修剪方案的配置
3.1 方案一:VTP Pruning(动态修剪)
VTP是某些厂商私有的一套VLAN管理协议,用于在整个交换域内同步VLAN数据库。VTP Pruning就是基于这套机制实现的动态修剪。核心思想是:每台交换机会通过VTP通告记录自己有哪些VLAN是活跃的(有端口属于该VLAN且端口Up),交换机之间自动感知这些信息,Trunk上不需要的VLAN会被自动“剪掉”。
在相关设备的命令行里,开启VTP修剪非常简单:
! hostname SW-CORE vtp domain LAB vtp mode server vtp version 2 vtp pruning ! interface GigabitEthernet0/24 switchport trunk encapsulation dot1q switchport mode trunk关键配置就是顶层那条vtp pruning。开启后,全局范围内所有Trunk会自动应用修剪策略,把对端不需要的VLAN从Trunk放行列表中移除。
用VTP修剪有一个非常容易踩的坑:VLAN 1是管理VLAN,默认不允许被修剪,永远会透传。另外,VTP修剪很多实现只作用于VLAN 2到1001,扩展VLAN需要额外确认。还有一点,VTP修剪依赖VTP域内所有交换机的状态同步,如果域里有一台交换机配错了VTP模式,把别人的VLAN数据库内容清掉,全网VLAN都会受到牵连,那场面相当酸爽。
我给的建议是:如果网络规模不大、没有专职网络团队,或者对厂商私有协议的同步机制没有充分把握,尽量避免在生产环境开VTP Pruning。动态修剪确实方便,但一次误报、一台错配,就可能引发比广播占用带宽严重得多的故障。
3.2 方案二:手动Allowed List精准过滤
生产环境里,我见到最多的“修剪”其实是通过手动维护Trunk口的allowed VLAN列表来落地的。它不用任何协议配合,完全靠管理员在Trunk接口上配置“允许哪些VLAN通过”,本质上是静态修剪。
基本写法如下:
interface GigabitEthernet0/1 switchport mode trunk switchport trunk allowed vlan 10,20,30这条命令的含义是:该Trunk只放行VLAN 10、20、30的流量,其余所有VLAN全部被挡在链路口外。默认情况下,Trunk口执行的是switchport trunk allowed vlan all,也就是不修剪,所有VLAN都放行。
有时候需要修改现有列表,常见操作有四个关键字:
add:在现有列表基础上追加VLAN,比如switchport trunk allowed vlan add 40。remove:从现有列表里移除指定VLAN,比如switchport trunk allowed vlan remove 40。except:除指定VLAN以外全部放行,比如switchport trunk allowed vlan except 40-50,意思是只禁掉40到50,其他全放。all:恢复成所有VLAN均放行的默认状态。
手动方式最大的好处是确定性强。一台设备配成什么样,就是什么样,不依赖任何协议状态。排障时看配置就能明白链路行为,不用追着一堆动态协议报文去猜。
坏处也很明显:设备多了之后,每一台Trunk口都要人工维护,稍有遗漏就可能出现该剪的没剪掉、该通的没放通。此外有些平台不允许从Trunk口删除VLAN 1,这个只能接受,属于协议设计约束。
3.3 方案三:GVRP动态注册与MVRP
如果你不想用私有协议,又想做到VLAN动态按需放行,IEEE 802.1Q标准体系里提供了一个机制:GVRP(GARP VLAN Registration Protocol)。它基于GARP协议,通过交换各种注册消息,让Trunk口自动学习“对端需要哪些VLAN”,从而动态放行。
配置思路大致如下:
! gvrp enable ! interface GigabitEthernet0/1 switchport mode trunk switchport gvrp enable开关一开,交换机会把自己的VLAN注册信息发送到Trunk口上,对端收到后,如果也开启了GVRP,就会动态把该VLAN加入放行列表。VLAN被删除时,Leave消息会自动把对应状态从Trunk列表里移除。
GVRP看起来很美好,但我在工程实践里的态度是谨慎。首先,它依赖双方设备的协议报文交互,报文丢失、定时器不一致都可能导致注册状态不同步。其次,GVRP注册的VLAN如果初始阶段没有约束,相当于全网VLAN在该Trunk上一个不落地注册,和allowed vlan all几乎没有差别,修剪效果还没开始体现,广播先铺满全网。
MVRP是GVRP的后继协议,定义在802.1ak中,报文处理效率更高,收敛也更稳定。如果设备同时支持GVRP和MVRP,我更推荐用MVRP做动态方案。但前提是你要想清楚:动态注册省下的是人工配置量,牺牲的却是可预期性。东一台、西一台的注册状态,在出差错时排查起来相当耗时。
4. 配置命令速查与参数选择逻辑
4.1 核心命令速查表
很多同学记不住一堆命令,我整理了一张速查表,贴在IT笔记里顺手可用。
| 命令或参数 | 作用 | 说明与提醒 |
|---|---|---|
vtp pruning | 全局开启VTP修剪 | 私有协议,依赖VTP域同步,慎用 |
switchport trunk allowed vlan 10,20 | 仅放行指定VLAN | 手动修剪的核心命令 |
switchport trunk allowed vlan add 30 | 追加放行VLAN | 不会清空现有列表 |
switchport trunk allowed vlan remove 30 | 移除指定VLAN | 不影响列表里其他VLAN |
switchport trunk allowed vlan except 30-40 | 除指定范围外全放行 | 批量操作时很省命令,但语义容易想反 |
switchport trunk allowed vlan all | 恢复默认放行所有VLAN | 相当于撤销手动修剪 |
switchport trunk pruning vlan 10-100 | 基于接口的VTP裁剪列表 | 需要和VTP Pruning框架配合 |
ip igmp snooping | 组播侦听 | 不是修剪,但经常和修剪配合使用 |
表格是拿来做速查的,真正配置时请记住一个原则:宁可多打几条add,也不要上来就写一长串列表。我见过太多人执行switchport trunk allowed vlan 10,20,30时把原本在列表里的路由子接口专用VLAN覆盖掉,导致管理地址直接失联。
4.2 不同规模网络到底怎么选
修剪方案没有绝对标准,但按网络规模和运维能力选型,会少走很多弯路。
小型网络(三五台交换机)用不着动态协议,每台设备只有一两条Trunk,人工维护allowed列表几分钟就完事,停机风险还小。中型网络(一个园区网、二三十台交换机)可以使用VTP透明模式,只在汇聚层手工维护横向Trunk的修剪列表,这样既有可控性,又不用同步域内所有设备。大型网络(数据中心、多楼宇互联)我更倾向于全静态维护,配合自动化工具把allowed列表推送到每台设备上,动态协议在大规模下的不可控性会放大很多。
办公网变动频繁的场景,比如一栋楼里每天都有人在调整工位、加删VLAN,动态修剪(GVRP/MVRP)确实能减轻运维压力。前提是团队里有人彻底理解这些协议的行为模型,并且准备好监控手段去兜底,否则一旦注册表乱了,整网VLAN放行状态就是一笔糊涂账。
一句话:技术选型的核心不是“哪个最先进”,而是“哪个最适合你的维护水平和故障容忍度”。静态修剪土,但它不会在半夜两点自动给你搞出一场网络事故。
4.3 修剪、allowed列表、删除VLAN不要混为一谈
术语上的混淆经常导致配置事故。最典型的是把“VLAN修剪”和“删除VLAN”画等号。修剪只是让VLAN的帧不出现在某条Trunk链路上,VLAN本身还存在于交换机的数据库里,包括对应的VLAN接口(SVI)、网关地址等都还在正常工作。
allowed vlan remove也不是删除VLAN。它只是把VLAN从Trunk口的放行列表里去掉,一旦对端经过这个Trunk发来该VLAN的帧,在入口就会被丢弃。很多人误以为执行了remove之后,本机上这个VLAN就消失了,结果发现SVI还能ping通,于是怀疑命令没生效,白白浪费时间排查。
还有一个容易混的概念是“端口Pruned状态”。某些设备上Trunk口显示某个VLAN处于Pruned状态,不代表VLAN被删了,只是说明在VTP修剪机制下,该VLAN没有在这个口上放行。看到Pruned不要惊慌,先确认业务是否需要在该链路上访问这个VLAN,不需要的话这种状态就是正常的。
5. 常见问题与排查技巧实录
5.1 Trunk上VLAN流量还在?先查这四处
遇到“我刚修剪了,为什么广播还在”的反馈,我建议按下面这个顺序排查。
第一,看Trunk口当前的allowed列表到底是不是你设的那份。很多设备上配置会被覆盖或追加,一台交换机有两个Trunk口,你只改了其中一个,另一个还开着全量放行,流量自然会继续穿越。执行show interfaces trunk,把所有Trunk口的状态翻一遍,锚定事实。
第二,确认对端交换机的对应Trunk口有没有配合。修剪是双边的动作吗?其实是链路两端的放行列表取交集后才是实际生效的结果。你在这端只放行VLAN 10、20,对端却还没有更新列表,依然放行所有VLAN,对端VLAN 30的广播依然会到达本端端口,只是会在入口被丢。抓包时抓的是原始流量还是被丢弃的流量,取决于观察点,这一点最容易判断失误。
第三,检查VLAN在交换机上是不是“活跃”状态。动态修剪(VTP/GVRP)有一个前提条件:VLAN里必须有至少一个活跃端口,且端口处于Up状态。如果VLAN数据库里存在该VLAN,但所有端口都在Down,协商时交换机会认为这个VLAN不需要在Trunk上放行。对端交换机可能因此没有把VLAN加入放行列表,这个问题用show vlan brief一眼就能看到。
第四,抓重点:管理VLAN。VLAN 1通常无法修剪,如果你看到VLAN 1的广播还在,那是正常现象。别浪费时间去找配置错误。
5.2 一次“修剪失灵”的现场复盘
说一个我印象很深的事故。某单位新建的楼层网络,汇聚交换机之间用Trunk互联,为了防止广播泛滥,我按常规在Trunk口上做了allowed列表配置,只放行办公VLAN和监控VLAN。结果上线第二天,监控系统的组播画面出现卡顿,办公网却一切正常。
排查过程很有意思。抓包发现,监控VLAN的组播流确实没有跨过Trunk——不对,实际上跨过了,却少了一部分。原因是监控平台服务器所在的VLAN 50被我不小心从allowed列表里剔除了,因为当时配置Trunk的时候我按“办公网规划”写了列表,忽略掉监控服务器挂在VLAN 50里。Trunk口一侧把VLAN 50拦下来,另一侧仍然尝试接收,最终导致组播源和接收者在同一台Trunk上“通话”失败。
这个事故教会我一件事:修剪的本质是“两端对齐”,不是只改一边就行。配置任何一条Trunk的修剪列表前,先画出对端设备上各VLAN的完整业务分布图,VLAN 1、管理VLAN、监控VLAN、语音VLAN都标清楚,再动手删减。改完之后,最好的验证手段不是盯着一侧看,而是两边抓包对照,业务才能如实反映出来。
5.3 新手最容易踩的四个坑
结合平时答疑的经验,再补几个高频坑点。
坑一:拿except用反了。switchport trunk allowed vlan except 10-20的意思是放行除10到20之外的所有VLAN,而不是“只放行10到20”。业务VLAN全放了,唯独把关键VLAN砍了,直接导致业务中断。想“只放行某几个VLAN”,一定要用显式列出的形式,不要用except。
坑二:在Trunk口上移除native VLAN。很多管理交换机把native VLAN作为管理VLAN,从Trunk的allowed列表里remove掉native VLAN后,管理地址立刻失联,因为你没法通过这条Trunk访问交换机本身了。如果确实要修剪,建议保留native VLAN或在另一边单独留一条带外管理通道。
坑三:忽略了修剪对双向流量的影响。Trunk口上的allowed列表是双向生效的,既管出方向,也管入方向。有的同学以为只影响从本端发出去的流量,结果对端发过来的VLAN 30被本端入口丢弃,还以为是对方配置错了。两边配置要联动看。
坑四:修剪和组播协议混在一起不看结果。修剪把VLAN的帧过滤了,IGMP Snooping的信息也会随之丢失,假设某个VLAN被修剪掉,接收者无法在这个Trunk上收到组播Query,就会导致其它跨Trunk的组播接收者出现混乱。凡是涉及组播的网络,修剪完成后一定要用组播流量验证,不要只看ARP通不通。
6. 真实生产环境的几点糙话
回到开头那个问题:到底需不需要修剪?答案是,不管你用哪种方式,Trunk口上“放行列表”这件事是必须做的。我不常推荐VTP Pruning,原因是私有协议和全网同步这两个词凑在一起,排障成本太高。我也很少单独依赖GVRP,动态注册的不可预期性在日常运维里就是定时炸弹。
我自己的习惯是:大型网络全部静态维护allowed列表,把每一条Trunk的放行清单纳入网管配置库,配合脚本做审计,谁改了列表自动告警。这样虽然前期配置量大一些,但故障发生时,我能十秒内告诉老板“是哪条Trunk哪个VLAN被谁动了”,这种确定性是动态协议给不了的。
最后分享一个小技巧:配置修剪时,先在测试环境搭两条Trunk,一边抓包一边逐步收敛allowed列表,亲眼看到广播帧“从有到无”的过程。这个操作比看十遍文档都有用。等你真正理解了VLAN修剪的本质,再回过来看那些复杂协议,就不会被厂商的营销名词牵着走了。