VLAN基本原理:802.1Q标签、Trunk与PVID排错实践 这是我网络学习日志的第13篇主题锁定在VLAN基本原理。之所以把这么基础的东西单独拎出来写一篇是因为前阵子在模拟项目X里搭实验时被它狠狠教育了一回两台交换机的配置看起来没毛病Access、Trunk都设了但还是出现“部分电脑能通、部分电脑断断续续”的怪象。查到最后根因是我对帧在端口上“带不带Tag”以及进入Trunk口时怎么决定归属VLAN的理解有问题。学VLAN最忌讳背命令只要原理通了配置只是换个语法的问题。这篇日志适合刚开始学交换、或者配置过VLAN但从没深究过数据平面的读者。1. 为什么二层网络必须靠VLAN做隔离1.1 广播域越来越大交换机也有带不动的那一天先从一个最朴素的问题说起没有VLAN的二层网络是怎么工作的交换机本身并不聪明它只做两件事——查MAC地址表转发查不到就向所有其他端口泛洪。问题就出在这个“泛洪”上。广播帧、组播帧、未知单播帧都会被复制到整台交换机的所有端口广播域越大这些无意义流量就传得越广。想象一个大房间几十个人同时七嘴八舌地报自己的门牌号旁边还有人在放高音喇叭。你想想信息有效传播率还剩多少以太网也是一样同一广播域里的终端数量越多广播开销越大出现环路时广播风暴直接能把整台交换机打懵。早期只用集线器和网桥的时代大家只能通过“少接点设备”来缓解这种办法太粗暴了。VLAN的核心价值就是把这个大房间切成若干小隔间。每个VLAN都是一个独立的二层广播域VLAN10里的广播不会飘到VLAN20里。这样一来即使物理上所有终端都插在同一台交换机上它们仍然可以被逻辑隔离成不同的组广播影响范围被显著缩小。1.2 二层隔离不同VLAN之间默认路不通广播抑制只是第一步更实际的需求是安全隔离。默认情况下同一台交换机上同网段的PC是可以互相访问的Windows共享、打印机、数据库端口等全部裸奔在二层网络里。如果把财务、办公、监控、访客都放在同一个广播域就意味着任何一台PC都能直接向其他PC发起访问这对安全来说是一场灾难。VLAN能在二层把流量隔开不同VLAN之间默认不互通必须经过三层设备才能通信。这意味着你可以把敏感业务放在VLAN20把普通办公放在VLAN10除非管理员显式配置了跨VLAN路由或防火墙策略否则两边数据互不可达。这算是网络设计里“最小权限”思想的落地。很多新手觉得VLAN只是“把端口分组加个编号”其实它定义了逻辑隔离边界。一个VLAN就是一个独立局域网它有自己的生成树实例、自己的MAC地址表空间甚至可以在逻辑上跨越多台物理交换机存在。1.3 一个VLAN约等于一个逻辑子网VLAN ID怎么规划VLAN的编号范围在标准802.1Q里是12位理论上能支持4096个VLAN但0和4095保留实际可用的是1到4094。VLAN1一般是默认VLAN新出厂的交换机所有端口默认都在VLAN1里管理流量也常常默认放在这里。在地址规划上一个VLAN通常对应一个IP子网。这样设计不是为了好看而是因为跨VLAN通信必须靠三层路由而路由表就是按照子网来工作的。你把VLAN10规划成192.168.10.0/24VLAN20规划成192.168.20.0/24网关地址分别落在各自VLAN的三层接口上后续配置ACL、策略路由、DHCP分段都会清晰很多。规划VLAN ID时要避免随手乱填。我见过不少项目网管图省事把所有VLAN都塞在VLAN1里Trunk也不放行最后排查故障时全乱套。一般建议办公划一段、服务器划一段、管理划一段、访客单独划一段保留一段给专门做Native VLAN用。编号不必连续但最好留出扩展空间。2. 在一个物理网络上分出多个VLAN802.1Q标签机制2.1 交换机内部能区分VLAN跨交换机怎么办单台交换机管理多个VLAN并不难每个端口都有自己所属的VLAN配置交换机内部在转发时会记录一个“内部VLAN标记”查MAC表的时候也是按“VLAN MAC”来查的。真正的问题发生在两台交换机互联时。打个比方交换机A上有VLAN10和VLAN20交换机B上也有VLAN10和VLAN20两台交换机之间只连了一根网线。A要把VLAN10的帧发给B链路本身只是一根普通的电缆帧里没有任何字段说明自己属于哪个VLAN。B收到这帧后怎么知道应该放进VLAN10还是VLAN20如果只是把两台交换机的互联端口划成同一个VLAN那这跟一根普通网线没区别所有VLAN的流量都混在一起了。解决问题的标准做法是给帧“贴上标签”——这就是IEEE 802.1Q干的事。2.2 摸清802.1Q标签的4个字节802.1Q在传统以太网帧的基础上把源MAC地址和Type/Length字段之间的位置腾出来嵌入一个4字节的Tag。Tag里最核心的几部分TPID固定为0x8100用来告诉交换机“这是一个带VLAN标签的帧”TCI里包含3位的PCP优先级、1位的DEI和12位的VID。看这张表就很直观字段长度作用TPID2字节固定值0x8100标识802.1Q标签存在PCP3位802.1p优先级用于QoSDEI1位丢弃优先级常配合PCP使用VID12位VLAN编号取值1到4094加了这个Tag之后以太网帧的最大长度从1518字节变成1522字节这也是一些老网卡和不支持巨型帧的设备需要留意的点。Tag放在源MAC之后是为了让交换机在解析完源MAC后立刻看到VLAN信息处理路径最短。有意思的是普通PC是看不到这个Tag的因为交换机在把帧从Access口发给终端时会主动把Tag剥掉。这也是为什么单台PC不需要关心自己属于哪个VLAN——它发出去的就是一张没有标签的白纸交换机负责给白纸盖章然后再在出口把章擦掉。2.3 Tag的“进”与“出”Access和Trunk的处理规则理解了Tag之后端口模式就很好懂了。一个交换机端口面对的设备不同Tag处理逻辑也不同端口方向入站处理出站处理Access口收到无Tag帧打上端口所属VLAN的Tag从Access口发出时剥掉TagAccess口收到有Tag帧与端口VLAN一致才接受否则丢弃从Access口发出时剥掉TagTrunk口收到无Tag帧归入Native VLAN从Trunk口发出无Tag帧Trunk口收到有Tag帧按Tag里的VID归入对应VLAN除Native VLAN外保留Tag发出简单总结就是终端侧永远只看到无Tag帧Trunk链路上除了Native VLAN以外全是带Tag帧交换机内部一直在用Tag做身份识别。这个机制解释了为什么Trunk口不能随便接PCPC发出的无Tag帧会被Trunk口当成Native VLAN处理另一端如果把它当普通Access口接交换机整条链路的VLAN归属就乱了。所以配置前先想清楚这个口接的是什么类型的设备对面是什么设备帧从哪边进来时是什么状态。3. Access、Trunk与PVID端口层面的完整规则3.1 Access口不是“把端口放进VLAN”那么简单很多教材说Access口就是“一个端口属于一个VLAN的端口”这句话没毛病但执行细节会坑人。Access口收到无Tag帧时交换机会根据这个端口配置的PVIDPort VLAN ID给它盖上章也就是“默认归属的VLAN”。如果端口PVID是10进入的无Tag帧全按VLAN10处理。那Access口收到带Tag的帧怎么办不同厂商处理方式有差异。有些只要Tag里的VID和端口PVID一致就正常收不一致就丢有些则不管Tag直接按PVID处理。这种差异最容易造成“在这家设备上好好的换到另一家设备就通不了”的情况。我的建议是不要把这种细节当作可依赖行为设计上保证Access口收到的都应该是无Tag帧。还有个常见误区为了省事把交换机之间互联的端口也配成Access。如果两台交换机之间只传一个VLAN这么配勉强能跑但只要加了第二个VLANAccess口就直接把Tag剥掉了对面根本分不清谁是谁。跨交换机多VLAN互联必须走Trunk。3.2 Trunk口的允许列表和Native VLANTrunk口是承载多个VLAN的通道它有两个关键配置允许哪些VLAN通过以及Native VLAN设为多少。允许列表决定Trunk口接收和发送时能放行哪些VLAN。默认一般是允许所有VLAN但生产环境里最好手工收紧。常见事故是新建了一个VLAN只在接入端口划分了VLAN却忘了在Trunk上放行结果这个VLAN只在本地交换机有效跨交换机全部不通。Native VLAN是Trunk口上最容易被忽略的设置。默认情况下Native VLAN是VLAN1这个VLAN在Trunk链路上是以无Tag帧的形式传输的。为什么要保留一个不打Tag的VLAN为了兼容老设备、让Trunk口在无法解析Tag时至少能维持一个VLAN的通信。但这也带来了安全隐患所以现在的主流建议是把Native VLAN改成不用的VLAN号并且两端Trunk配置完全一致。3.3 PVID、VID、Native VLAN三者的区别和关联这三个概念初学者经常混。VID是数据帧里携带的VLAN编号PVID是端口默认收到的无Tag帧应该归到哪个VLANNative VLAN是Trunk口上“不打算打Tag的那个VLAN”。它们的关系可以用一张表说清楚概念作用范围含义VID数据帧帧中携带的VLAN编号只有带Tag帧才有PVID端口入站无Tag帧按这个ID打TagNative VLANTrunk口出站时对应帧不打Tag入站无Tag帧归入它理清这三个东西之后很多“玄学”问题其实都有明确答案。比如为什么两台交换机Trunk口都通了但对端的某个VLAN里面收到的无Tag帧不对查Native VLAN。为什么PC接在Access口上发出毫无异常的帧到Trunk另一端却进了别的VLAN查PVID和路径上所有端口的Tag处理逻辑。4. 跨VLAN通信怎么走单臂路由与SVI4.1 为什么VLAN之间必须经过三层的逻辑VLAN的设计初衷就是二层隔离。同一个VLAN内的设备可以直接通过MAC地址互相通信这是二层的事。不同VLAN的设备想要互访就必须有设备来做IP包的路由转发也就是三层功能。道理很简单A在192.168.10.1/24B在192.168.20.2/24A发现B跟自己不在同一网段就会把包发给自己的网关。网关是某个三层接口的IP地址这个接口必须能同时处理VLAN10的帧。如果这个三层接口不在VLAN10里A连网关的ARP请求都发不出去。所以跨VLAN通信的关键就是为每个VLAN提供一个三层网关接口并且让路由路径上的设备能正确处理Tag。4.2 单臂路由一根线撑起多个VLAN网关最省资源的方式是单臂路由。交换机的Trunk口连到路由器的一个物理口路由器上创建多个子接口每个子接口用802.1Q封装一个VLAN并配置对应的网关IP。链路示意图可以这样理解交换机把VLAN10的帧打上Tag10从Trunk发给路由器路由器的物理口收到后发现Tag是10就把帧交到子接口10去处理Tag是20就交到子接口20。这样路由器一个物理口就被“劈”成了多个逻辑接口分别对应不同VLAN的网关。单臂路由的优点是配置直观、硬件成本低缺点是所有跨VLAN流量都挤在一条链路上流量一大就成瓶颈。实验环境、小型办公网络用它可以但别指望它扛大量视频或备份流量。4.3 SVI三层交换机把路由做进内部更主流的方案是使用三层交换机在交换机上为每个VLAN创建一个SVISwitch Virtual Interface交换机虚拟接口然后在这个虚拟接口上配置IP地址作为网关。SVI的好处是流量不用出交换机二层转发和三路路由都发生在设备内部延迟和带宽表现远好于单臂路由。配置上也不复杂核心命令逻辑就是“创建VLAN、把接口划进VLAN、为VLAN接口配IP、开启IP路由”。两种方案的取舍参考这张表项目单臂路由SVI核心设备路由器三层交换机跨VLAN流量路径出交换机进路由器再返回交换机内部处理性能受单链路带宽限制接近线速扩展性VLAN一多就吃力适合VLAN数量多的场景配置复杂度子接口封装繁琐创建接口后直接配IP我自己的学习顺序是先玩单臂路由把“Tag对应子接口”这个概念练熟再切到SVI这样对“VLAN间路由”的本质会认识得更深。5. 学习日志里的VLAN踩坑记录与排查链路5.1 同一个交换机的两个VLAN居然互相能通先说一个我在练习环境里亲眼见过的怪现象一台交换机PC-A划分到VLAN10PC-B划分到VLAN20配置检查了两遍都没问题但两台PC居然能互相Ping通。我当时第一反应是“VLAN隔离失效了”于是开始怀疑固件问题差点把方向带偏。后来冷静下来一步步查先看端口划分配置是否真的生效用命令确认接口状态和所属VLAN发现接口配置根本没保存进去——我人不在设备上实际生效的配置还是老版本。重新下发配置后VLAN10和VLAN20立刻不通了。这类问题最常见的三个原因一是配置没保存或下发到了错误的接口二是PC的IP子网压根没按VLAN规划来配两台机器都在同一个网段且都落在VLAN1三是交换机管理口和业务口混用。排查思路就是先确认端口实际状态再看PC地址规划最后才怀疑协议问题。5.2 新增VLAN后跨交换机部分不通第二个坑更隐蔽。实验里本来VLAN10和VLAN20跨交换机通信都正常后来新增了一个VLAN30把端口划进去之后VLAN30在本端交换机内完全正常但到了对端交换机就死活不通。VLAN10和VLAN20依然正常所以网络整体看起来只是“部分区域断连”。查了半小时最后用一条查看Trunk信息的命令才想起来新VLAN创建了接口也划了但两台交换机互联的Trunk口放行列表里根本没有VLAN30。Trunk口默认虽然允许全部VLAN但一旦你手工配置过allowed vlan系统就只放行你列出来的那些VLAN。这个坑的排查链路很值得记下来先看本端VLAN是否激活再看本端Trunk放行列表再看对端Trunk放行列表最后看对端端口所属VLAN。每一层都可能存在缺失不要一上来就抓包。5.3 Native VLAN不一致链路通着但VLAN“串门”了Native VLAN不一致的坑比前两个更阴。链路是通的接口状态也是up的甚至大部分业务都正常但某些VLAN里混入了非预期的流量。用一个具体例子说明。交换机A的Trunk口Native VLAN保持默认的VLAN1交换机B的Trunk口Native VLAN被某次改动改成了VLAN10。A在Trunk口上发送VLAN1的帧时因为VLAN1是A的Native VLAN所以不打Tag直接发。B收到这个无Tag帧会按B自己的Native VLAN来认也就是VLAN10。于是A的VLAN1管理流量到了B全被塞进VLAN10里两个VLAN就这样“串门”了。这种问题最难排查在于业务可能还能通管理面却已经错乱。我的习惯是再小心的实验环境Trunk两端的Native VLAN也必须完全一致并且显式设成一个不承载业务流量的保留VLAN号绝不允许两端各配各的还指望默认值一致。5.4 单臂路由子接口的VLAN封装和IP地址不匹配最后记录一个单臂路由的典型失误。我在路由器上创建了两个子接口一个封装Tag11一个封装Tag12结果PC的网关全指向了Tag11子接口的IP而VLAN12那台PC明明应该把网关指向Tag12子接口。网关地址错配的直接后果是ARP能通一半但数据包根本到不了目的地。因为PC发出的包交给网关网关接口接到包后发现源和目的都不属于它的直连网段拿不到去往对端的路由只能丢弃。排查这类问题要同时核对三个对应关系交换机Trunk放行了哪些VLAN、路由器子接口封装了哪些VLAN、PC网关IP落在哪个子网。三个对应关系只要有一个错位就表现为“VLAN间不通”硬件配置却一切正常。6. VLAN原理掌握之后下一步怎么练6.1 搭一个最小闭环两台交换机、两台PC、一台三层网关学VLAN不能只看不练我建议搭一个最小闭环实验两台二层交换机三到四台PC一台能起子接口或SVI的设备。实验目标分三步走第一步把交换机之间的链路配成Trunk然后把PC分别划到VLAN10和VLAN20先确认二层隔离效果。第二步用抓包工具观察三个位置的帧PC和交换机之间应该没有TagTrunk上有Tag从Access口到PC时Tag又被剥掉。第三步配置单臂路由或SVI作为网关让PC之间跨VLAN通信再抓包确认跨VLAN报文确实经过了网关地址。这个闭环虽然简单但它把VLAN、Tag、Trunk、PVID、三层路由这些概念全部串起来了。我每次给同学讲VLAN都建议先把这个实验跑熟再去碰STP、链路聚合这些进阶内容。6.2 端口规划表与命名规范让排错容易一半学完原理之后比配置能力更重要的是网络文档习惯。我在模拟项目X里吃过亏隔了两周再打开拓扑文件根本想不起来某个端口当初为什么要那样划VLAN。后来我养成了一个习惯每次做VLAN实验前先画一张端口规划表把设备名、接口编号、模式、所属VLAN、Native VLAN、用途写清楚配置下发时照着表格核对。VLAN命名也建议统一成“VLAN10_办公”“VLAN20_财务”“VLAN99_管理”这种风格不要随意复用同一个VLAN号指代不同用途。尤其在生产环境VLAN号本身只是一个编号真正有意义的是它在网络里承载了什么业务命名规范和文档记录才是长期维护不踩坑的保障。最后再分享一个通用小技巧遇到任何VLAN排错先回答三个问题——这个帧是从哪个端口进来的进来的时候带不带Tag出去的时候应该带还是不要带把这三个问题答清楚VLAN问题基本已经解决了一半。学VLAN先别急着背命令多抓几次包、多看几遍Tag变化比死记配置有用得多。下篇日志我准备把STP与VLAN的联动记录下来把环路和破环这关一起过了。