☰
VLAN基本原理:802.1Q标签、Trunk与PVID排错实践
2026/10/20 2:26:28 网站建设 项目流程

这是我网络学习日志的第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/24,VLAN20规划成192.168.20.0/24,网关地址分别落在各自VLAN的三层接口上,后续配置ACL、策略路由、DHCP分段都会清晰很多。

规划VLAN ID时要避免随手乱填。我见过不少项目,网管图省事把所有VLAN都塞在VLAN1里,Trunk也不放行,最后排查故障时全乱套。一般建议:办公划一段、服务器划一段、管理划一段、访客单独划一段,保留一段给专门做Native VLAN用。编号不必连续,但最好留出扩展空间。

2. 在一个物理网络上分出多个VLAN:802.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优先级,用于QoS
DEI1位丢弃优先级,常配合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口发出时剥掉Tag
Access口收到有Tag帧与端口VLAN一致才接受,否则丢弃从Access口发出时剥掉Tag
Trunk口收到无Tag帧归入Native VLAN从Trunk口发出无Tag帧
Trunk口收到有Tag帧按Tag里的VID归入对应VLAN除Native VLAN外保留Tag发出

简单总结就是:终端侧永远只看到无Tag帧,Trunk链路上除了Native VLAN以外全是带Tag帧,交换机内部一直在用Tag做身份识别。

这个机制解释了为什么Trunk口不能随便接PC:PC发出的无Tag帧会被Trunk口当成Native VLAN处理,另一端如果把它当普通Access口接交换机,整条链路的VLAN归属就乱了。所以配置前先想清楚:这个口接的是什么类型的设备,对面是什么设备,帧从哪边进来时是什么状态。

3. Access、Trunk与PVID:端口层面的完整规则

3.1 Access口不是“把端口放进VLAN”那么简单

很多教材说Access口就是“一个端口属于一个VLAN的端口”,这句话没毛病,但执行细节会坑人。Access口收到无Tag帧时,交换机会根据这个端口配置的PVID(Port VLAN ID)给它盖上章,也就是“默认归属的VLAN”。如果端口PVID是10,进入的无Tag帧全按VLAN10处理。

那Access口收到带Tag的帧怎么办?不同厂商处理方式有差异。有些只要Tag里的VID和端口PVID一致就正常收,不一致就丢;有些则不管Tag直接按PVID处理。这种差异最容易造成“在这家设备上好好的,换到另一家设备就通不了”的情况。我的建议是不要把这种细节当作可依赖行为,设计上保证Access口收到的都应该是无Tag帧。

还有个常见误区:为了省事,把交换机之间互联的端口也配成Access。如果两台交换机之间只传一个VLAN,这么配勉强能跑;但只要加了第二个VLAN,Access口就直接把Tag剥掉了,对面根本分不清谁是谁。跨交换机多VLAN互联必须走Trunk。

3.2 Trunk口的允许列表和Native VLAN

Trunk口是承载多个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帧应该归到哪个VLAN,Native VLAN是Trunk口上“不打算打Tag的那个VLAN”。

它们的关系可以用一张表说清楚:

概念作用范围含义
VID数据帧帧中携带的VLAN编号,只有带Tag帧才有
PVID端口入站无Tag帧按这个ID打Tag
Native VLANTrunk口出站时对应帧不打Tag,入站无Tag帧归入它

理清这三个东西之后,很多“玄学”问题其实都有明确答案。比如为什么两台交换机Trunk口都通了,但对端的某个VLAN里面收到的无Tag帧不对?查Native VLAN。为什么PC接在Access口上发出毫无异常的帧,到Trunk另一端却进了别的VLAN?查PVID和路径上所有端口的Tag处理逻辑。

4. 跨VLAN通信怎么走:单臂路由与SVI

4.1 为什么VLAN之间必须经过三层的逻辑

VLAN的设计初衷就是二层隔离。同一个VLAN内的设备可以直接通过MAC地址互相通信,这是二层的事。不同VLAN的设备想要互访,就必须有设备来做IP包的路由转发,也就是三层功能。

道理很简单:A在192.168.10.1/24,B在192.168.20.2/24,A发现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创建一个SVI(Switch Virtual Interface,交换机虚拟接口),然后在这个虚拟接口上配置IP地址作为网关。

SVI的好处是流量不用出交换机,二层转发和三路路由都发生在设备内部,延迟和带宽表现远好于单臂路由。配置上也不复杂,核心命令逻辑就是“创建VLAN、把接口划进VLAN、为VLAN接口配IP、开启IP路由”。

两种方案的取舍参考这张表:

项目单臂路由SVI
核心设备路由器三层交换机
跨VLAN流量路径出交换机进路由器再返回交换机内部处理
性能受单链路带宽限制接近线速
扩展性VLAN一多就吃力适合VLAN数量多的场景
配置复杂度子接口封装繁琐创建接口后直接配IP

我自己的学习顺序是先玩单臂路由,把“Tag对应子接口”这个概念练熟,再切到SVI,这样对“VLAN间路由”的本质会认识得更深。

5. 学习日志里的VLAN踩坑记录与排查链路

5.1 同一个交换机的两个VLAN居然互相能通

先说一个我在练习环境里亲眼见过的怪现象:一台交换机,PC-A划分到VLAN10,PC-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和交换机之间应该没有Tag,Trunk上有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的联动记录下来,把环路和破环这关一起过了。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询