
1. 从一个全网不通的故障说起刚接手网络运维那会儿我遇到过一个至今印象深刻的故障。某天下午办公区三楼整层突然断网同事反馈电脑右下角显示已连接但什么都打不开。我第一反应是交换机挂了跑过去一看设备指示灯正常端口灯也在闪。登录交换机查配置发现这台接入交换机上所有端口都在同一个默认VLAN里而当天上午有人为了隔离广播风暴把上联口改成了Trunk模式却没同步调整接入端口的VLAN划分。结果就是接入端口发出的无标签帧到了Trunk口被当成Native VLAN的流量处理而Native VLAN又和上层核心的配置对不上数据包在二层就被丢弃了。这个故障的本质就是VLAN与Trunk配置不匹配。VLAN解决的是把一台物理交换机逻辑上切成多台的问题Trunk解决的是多台交换机之间怎么传递多个VLAN的流量的问题。这两件事单独看都不复杂但组合在一起加上Native VLAN、PVID、允许列表这些细节就特别容易出问题。我后来带过不少新人发现大家卡住的地方高度一致知道概念但不知道配置时每一步在干什么出了问题也不知道从哪查。这篇内容就是把我这些年配VLAN和Trunk的经验完整梳理一遍。不管你是刚接触网络设备的新手还是配过几次但总踩坑的同行都能从里面找到可以直接抄的配置和排查思路。我会从最基础的为什么需要VLAN讲起一路讲到Trunk的封装、Native VLAN的坑、跨厂商配置差异以及一套我常用的排错流程。全程用华为/华三风格的命令为主思科的关键差异会单独标注因为这两套在国内企业网里最常见。2. VLAN到底在解决什么问题为什么不能只靠划分子网2.1 广播域太大是万恶之源很多人学VLAN的时候第一句话就是VLAN用来隔离广播域。这话没错但太抽象。我换个说法假设一个公司有200台电脑接在几台交换机上全在同一个二层网络里。任何一台电脑发一个ARP请求比如谁是192.168.1.50这个请求会被交换机泛洪到所有端口200台电脑都得收下来看一眼不是找自己的就丢掉。一台电脑这么干无所谓但如果200台电脑每分钟都在发ARP、发DHCP发现、发各种广播整个网络的带宽和CPU就被这些跟自己无关的流量吃掉了。更麻烦的是故障域。某台电脑网卡故障疯狂发广播帧整个二层网络都会被拖慢这就是典型的广播风暴。你没法在二层层面阻止它因为交换机默认就是泛洪广播。VLAN的作用就是把这200台电脑按部门、按楼层、按用途切成若干个逻辑小组每个小组是一个独立的广播域。三楼的广播传不到二楼财务部的广播传不到研发部。故障被限制在一个VLAN内部不会扩散。这里有个新手常犯的认知错误以为VLAN就是子网。不是的。VLAN是二层概念子网是三层概念。你可以让一个VLAN对应一个子网这是最常见的做法也可以让多个VLAN共用一个子网不推荐但技术上可行还可以让一个VLAN里跑多个子网。VLAN标签Tag是加在以太网帧里的跟IP地址没有直接关系。理解这一点后面看Trunk的时候才不会乱。2.2 一个VLAN就是一个广播域也是一组端口的集合配置VLAN最直接的方式是基于端口划分。比如把交换机的1到8口划给VLAN 10研发部9到16口划给VLAN 20财务部。这样插在1口的电脑和插在9口的电脑即使IP在同一网段二层也通不了因为它们在不同的广播域里。华为/华三的配置逻辑是这样的# 创建VLAN system-view vlan 10 description RD vlan 20 description FIN quit # 把端口划入VLANAccess模式 interface GigabitEthernet0/0/1 port link-type access port default vlan 10 quit interface GigabitEthernet0/0/9 port link-type access port default vlan 20 quit思科的写法略有不同vlan 10 name RD vlan 20 name FIN interface FastEthernet0/1 switchport mode access switchport access vlan 10注意这里的关键词Access模式。Access端口是接终端的端口它只属于一个VLAN发出的帧不带标签Untagged。电脑网卡不认识VLAN标签所以接电脑的端口必须是Access把标签剥掉再发给电脑。这一点非常重要后面讲Trunk的时候会反复对比。2.3 为什么不能只用路由器划子网来隔离有人会问我不用VLAN直接用路由器每个部门一个物理接口接一个子网不也能隔离吗能但成本高得离谱。200台电脑分10个部门你得有10个路由器接口、10台交换机或者10组独立布线。而且部门调整的时候你得重新拉线、重新配接口。VLAN的价值就在于物理布线不用动逻辑分组随便改。今天1口是研发明天研发搬走了改一条命令把1口划到财务VLAN线都不用碰。这就是VLAN在企业网里不可替代的原因。它把物理位置和逻辑归属解耦了。你坐在哪个工位不重要重要的是你的端口被划到了哪个VLAN。3. Trunk的封装机制标签是怎么加上去又剥下来的3.1 单台交换机不够用VLAN必须跨设备传递VLAN在单台交换机上很好理解但现实是一栋楼有十几台接入交换机都上联到一台核心交换机。研发部的员工可能分散在三楼和四楼的交换机上但他们要在一个VLAN里。这时候问题来了三楼交换机上的VLAN 10流量怎么传到四楼交换机中间要经过核心交换机这条链路上跑的不只是VLAN 10还有VLAN 20、VLAN 30……如果这条链路上每个VLAN都拉一根物理线那核心交换机的端口很快就不够用了。Trunk的作用就是在一根物理链路上同时传递多个VLAN的流量。实现方式是在帧里插入一个VLAN标签Tag标明这个帧属于哪个VLAN。接收方看到标签就知道该把帧转发到哪个VLAN。这个标签的标准叫IEEE 802.1Q是在以太网帧的源MAC地址后面插入4个字节。其中12位是VLAN ID所以VLAN ID的范围是0到4095实际可用的是1到40940和4095保留。这4个字节里还有3位优先级用于QoS1位是CFI现在基本不用。对普通配置来说你只需要记住标签里最关键的就是VLAN ID。3.2 Access端口和Trunk端口的本质区别我把这两种端口的处理逻辑用一张表说清楚这是整个VLAN配置的核心端口类型接收无标签帧接收带标签帧发送帧时Access打上PVID进入对应VLAN一般丢弃除非是Native VLAN剥掉标签以无标签发出Trunk打上Native VLAN的PVID检查VLAN是否在允许列表在则通过除Native VLAN外都带标签发出这张表里的PVIDPort VLAN ID是理解一切的关键。PVID是端口的默认VLAN当端口收到一个不带标签的帧时就认为它属于PVID对应的VLAN。Access端口的PVID就是它所属的那个VLANTrunk端口的PVID默认是VLAN 1也就是Native VLAN。我见过太多人栽在Native VLAN上。简单说Trunk两端Native VLAN必须一致否则带标签的帧会被错误地当成无标签帧处理导致VLAN串扰或者流量丢失。华为/华三默认Native VLAN是1思科也是1但很多企业为了安全会把Native VLAN改成一个不用的VLAN比如999这时候两端必须同步改。3.3 Trunk配置的完整命令与逐行解释华为/华三的Trunk配置interface GigabitEthernet0/0/24 port link-type trunk port trunk allow-pass vlan 10 20 30 port trunk pvid vlan 999 quit逐行解释port link-type trunk把端口设为Trunk模式。port trunk allow-pass vlan 10 20 30允许VLAN 10、20、30的流量通过。没在列表里的VLAN流量会被丢弃。这是安全控制的关键不要图省事写allow-pass vlan all除非你确实需要所有VLAN都通过。port trunk pvid vlan 999把Native VLAN改成999。这一步是可选的但推荐做原因后面讲。思科的对应配置interface GigabitEthernet0/1 switchport trunk encapsulation dot1q switchport mode trunk switchport trunk allowed vlan 10,20,30 switchport trunk native vlan 999思科多了一步switchport trunk encapsulation dot1q因为老设备可能支持ISL封装思科私有已淘汰。现在新设备默认就是dot1q但写上不亏。注意Trunk两端的允许VLAN列表必须匹配。如果一端允许10、20另一端只允许10那VLAN 20的流量在第二端会被丢弃。我排查过好几次某个VLAN时通时不通最后都是allow-pass列表不一致。4. 那些年我在Native VLAN和PVID上踩过的坑4.1 Native VLAN不一致导致的诡异丢包前面提到Native VLAN必须一致但实际故障表现是什么样的我讲一个真实案例细节做了脱敏。两台交换机用Trunk互联一端Native VLAN是1另一端被改成了999。结果VLAN 10的流量正常因为带标签两端都认但管理流量走Native VLAN时通时断。为什么时通时断因为当Native VLAN为1的一端发送无标签帧时另一端把它归到了999而999可能没配IP帧就被丢了。但如果某些帧恰好带了标签又能通过。这种部分通的现象最迷惑人容易让人以为是线路质量问题。排查方法很简单display port vlan华为或show interfaces trunk思科看两端的Native VLAN是否一致。我现在的习惯是配Trunk的时候第一件事就是把两端Native VLAN都改成999然后确认一致再配允许列表。4.2 PVID和Native VLAN的关系别搞混严格来说PVID是端口默认VLAN IDNative VLAN是Trunk上不打标签的那个VLAN。在大多数设备上Trunk端口的PVID就等于Native VLAN。但有些厂商的实现里这两个概念是分开配置的。华为的命令是port trunk pvid vlan X思科是switchport trunk native vlan X效果一样都是设置那个不打标签的VLAN。为什么要改Native VLAN两个原因一是安全默认VLAN 1容易被利用比如VLAN跳跃攻击二是避免和业务VLAN冲突。我一般建议用一个专门的、不承载业务的VLAN比如999或1000作为Native VLAN这样即使有人误发无标签帧也不会进入业务VLAN。4.3 一个容易被忽略的细节Trunk端口收到无标签帧怎么办这是新手最容易懵的地方。Trunk端口收到一个无标签帧时会把它打上Native VLAN的标签然后转发到Native VLAN里。这意味着如果Native VLAN是1而VLAN 1里恰好有设备那这个无标签帧就会进入VLAN 1。如果Native VLAN是999而999里没有设备帧就被丢弃。这个机制带来的一个常见问题是接在Trunk端口上的设备比如服务器如果不打标签它的流量会进入Native VLAN。有些服务器配置了VLAN标签有些没有。如果服务器没打标签而Trunk的Native VLAN是999服务器就上不了网了。解决办法要么是给服务器网卡配VLAN标签要么把服务器接在Access端口上。我见过有人把服务器接Trunk口然后纳闷为什么ping不通网关查了半天才发现是Native VLAN的问题。5. 跨厂商配置差异与实战中的选型建议5.1 华为/华三 vs 思科命令对照与思维差异国内企业网里华为、华三、思科三家占了绝大多数。它们的VLAN/Trunk配置逻辑一样但命令风格差异不小。我把常用命令整理成对照表方便你切换设备时快速查操作华为/华三思科创建VLANvlan 10vlan 10端口设Accessport link-type accessswitchport mode access端口划入VLANport default vlan 10switchport access vlan 10端口设Trunkport link-type trunkswitchport mode trunk允许VLAN通过port trunk allow-pass vlan 10 20switchport trunk allowed vlan 10,20设置Native VLANport trunk pvid vlan 999switchport trunk native vlan 999查看VLANdisplay vlanshow vlan brief查看Trunkdisplay port vlanshow interfaces trunk思维差异上华为/华三更强调先设类型再设参数思科则是模式属性的组合。习惯了华为的人第一次配思科容易忘记switchport mode trunk这一步结果端口还在Access模式Trunk配了也不生效。5.2 什么场景该用Trunk什么场景该用Access这不是随便选的取决于对端是什么设备交换机到交换机用Trunk因为要传多个VLAN。交换机到路由器如果路由器做单臂路由Router-on-a-Stick用Trunk路由器子接口对应不同VLAN。交换机到服务器看服务器是否需要多VLAN。如果服务器只在一个VLAN里用Access如果服务器要跑多个VLAN比如虚拟化环境用Trunk并在服务器网卡上配VLAN子接口。交换机到AP无线AP通常用Trunk因为要传管理VLAN和多个业务VLAN。交换机到电脑用Access电脑不需要也不认识VLAN标签。我见过有人把电脑接在Trunk口上然后发现电脑能上网但速度很慢查了半天是Native VLAN的广播问题。记住终端设备接Access网络设备之间接Trunk这是基本原则。5.3 允许列表的精细化控制allow-pass vlan all看起来很省事但我强烈建议不要这么写。原因有两个一是安全所有VLAN都能通过意味着任何一个VLAN的广播都会传到对端失去了隔离的意义二是排错困难当某个VLAN出问题时你无法快速判断是不是Trunk的问题。正确的做法是只允许真正需要跨设备的VLAN通过。比如三楼交换机只需要把VLAN 10和20传到核心那就只允许10和20。这样即使有人误创建了VLAN 30它的流量也不会传到核心故障被限制在本地。华为还支持port trunk allow-pass vlan 10 to 20这种范围写法思科用switchport trunk allowed vlan 10-20。范围写法在VLAN多的时候很方便但要注意范围边界别把不该包含的VLAN包进去。6. 一套可复用的VLAN/Trunk排错流程6.1 从物理层到二层逐层排查网络故障排查有个基本原则从下往上。VLAN/Trunk的问题我一般按这个顺序查物理层端口灯亮不亮display interface看端口是up还是down如果down先查线、查光模块、查端口是否被shutdown。VLAN是否存在display vlan看VLAN有没有创建。我遇到过有人配了port default vlan 10但忘了vlan 10结果端口一直不生效。端口模式是否正确display port vlan看端口是Access还是TrunkPVID是多少。Trunk允许列表display port vlan或display interface看allow-pass列表是否包含需要的VLAN。Native VLAN一致性两端对比必须一致。MAC地址表display mac-address看MAC有没有学到。如果学不到说明二层不通。ARP和IP二层通了之后再看三层。display arp看ARP有没有解析。这个顺序看起来简单但能解决90%以上的VLAN/Trunk问题。我见过太多人一上来就查路由、查ACL结果发现是端口模式配错了。6.2 几个典型故障的快速定位故障一同一VLAN内不同交换机上的电脑ping不通。排查先看两端端口是不是都在同一个VLAN再看Trunk的allow-pass列表有没有包含这个VLAN最后看Native VLAN是否一致。最常见的原因是allow-pass列表漏了这个VLAN。故障二跨VLAN能通同VLAN反而不通。这个听起来反直觉但确实会发生。原因通常是同VLAN的流量走二层跨VLAN走三层。如果二层有问题比如Trunk没放行同VLAN就不通而三层如果配了路由跨VLAN反而能通。这时候要重点查Trunk配置。故障三Trunk口起来后部分VLAN通部分不通。几乎可以肯定是allow-pass列表的问题。检查两端列表确保需要的VLAN都在里面。注意华为的allow-pass是覆盖式的后配的会覆盖前面的别配着配着把之前的VLAN弄丢了。故障四改了Native VLAN后管理IP断了。这是因为管理IP可能配在Native VLAN上。改Native VLAN之前先确认管理流量的VLAN别把自己关在门外。我一般建议管理VLAN单独用一个不要和Native VLAN混在一起。6.3 配置前的检查清单为了避免配完出问题我养成了一个习惯配Trunk之前先过一遍清单。[ ] 两端VLAN都已创建[ ] 两端端口模式都是Trunk[ ] 两端allow-pass列表一致且包含所需VLAN[ ] 两端Native VLAN一致推荐都用999[ ] 管理VLAN不在Native VLAN里或者已确认管理流量路径[ ] 配置保存华为save思科write这个清单看起来啰嗦但能省下大量排错时间。尤其是配置保存这一条我见过有人配完没保存设备重启后配置丢失又得重来。7. 一些进阶话题和我的个人体会7.1 VLAN间路由单臂路由与三层交换VLAN隔离了广播域但不同VLAN之间要通信就需要三层路由。两种常见方案单臂路由路由器的一个物理接口配成Trunk然后创建子接口每个子接口对应一个VLAN配上网关IP。配置大概是这样interface GigabitEthernet0/0.10 encapsulation dot1Q 10 ip address 192.168.10.1 255.255.255.0 interface GigabitEthernet0/0.20 encapsulation dot1Q 20 ip address 192.168.20.1 255.255.255.0三层交换在三层交换机上创建VLAN接口SVI直接配网关IP。这是现在更主流的做法因为性能更好不依赖外部路由器。interface Vlanif10 ip address 192.168.10.1 255.255.255.0 interface Vlanif20 ip address 192.168.20.1 255.255.255.0单臂路由的缺点是所有VLAN间流量都要经过路由器的那个物理接口容易成为瓶颈。三层交换把路由功能集成到交换机里转发性能高得多。现在新项目基本都用三层交换单臂路由更多出现在老设备或实验环境里。7.2 我踩过的最大一个坑Trunk上的STP有一次配完Trunk发现网络时通时断ping丢包率30%左右。查了半天VLAN和Trunk都没问题最后发现是STP生成树的问题。两台交换机之间有两条Trunk链路STP把其中一条阻塞了但阻塞的端口状态切换时导致了短暂环路引发广播风暴。解决办法是配STP边缘端口或者用链路聚合。这个坑让我意识到VLAN和Trunk配对了不代表网络就稳了还要考虑STP、链路聚合这些二层协议。后来我养成了一个习惯配Trunk之前先确认STP状态display stp brief看有没有异常的阻塞端口。7.3 给新手的几条实在建议第一先在模拟器上练。华为的eNSP、思科的Packet Tracer都能模拟VLAN和Trunk配错了大不了重启比在真机上试错成本低得多。我刚开始学的时候在模拟器上把各种错误配置都试了一遍真机上就很少出问题了。第二配置前先画拓扑图。标清楚每台交换机的端口、VLAN划分、Trunk链路。我见过太多人配着配着自己都乱了就是因为没有图。第三改配置前先备份。华为display current-configuration思科show running-config复制出来存一份。改错了可以对照恢复。第四Native VLAN统一用999。这是我最推荐的一个习惯能避免大量莫名其妙的故障。第五别怕命令行。VLAN和Trunk的命令就那么几条配多了就熟了。真正难的不是命令是理解数据包在每一跳是怎么被处理的。理解了原理命令自然就记住了。7.4 关于VLAN数量的规划最后说一个规划层面的经验。有些公司喜欢按部门细分VLAN一个部门一个VLAN结果搞出几十上百个VLAN。VLAN多了Trunk的allow-pass列表会很长管理成本高而且STP的收敛时间会变长。我的建议是按安全域和广播域大小来规划而不是按部门。比如研发和测试可以共用一个VLAN如果广播量不大财务和HR可以共用一个。一般一个VLAN控制在200台设备以内超过就拆分。这样既能隔离广播又不会让VLAN数量失控。Trunk的allow-pass列表也能保持精简排错的时候一眼就能看完。这套东西我用了很多年从最初的手忙脚乱到现在配Trunk基本一次过靠的就是把原理吃透加上反复踩坑总结。VLAN和Trunk不是什么高深技术但细节特别多每一个细节背后都有它的道理。希望这篇内容能帮你少走一些我走过的弯路。