做网工或者IT运维的,迟早会碰到有人拿着交换机配置问你:“我这个端口明明配了VLAN 10,为什么PC还是不通?”再一看,端口是Trunk,PVID也改了,可允许列表里根本没加VLAN 10。像这种问题,根子上还是没搞懂Tag和PVID到底谁说了算。
今天这篇就专门讲透交换机端口上的四个关键词:VLAN、PVID、Tag、Untag。我会用人话把这套规则彻底拆开,结合华为/H3C的命令实例、验证命令和踩坑记录,适合给交换机划VLAN、接终端、跨交换机放通业务的朋友参考。读完你会发现,端口上那几行配置,本质就是在回答三个问题:进来的帧属于哪个VLAN、哪些VLAN允许从这个口过、出去的时候标签是保留还是撕掉。
1. 先把概念揉碎了说:VLAN、PVID、Tag、Untag分别管哪一段
1.1 用“门牌号”和“便签”理解VLAN与Tag
VLAN全称Virtual Local Area Network,虚拟局域网。你可以把交换机想象成一栋楼,VLAN就是楼层。同一楼层的人能随便串门,跨楼层就得走楼梯或者电梯,这个楼梯电梯就是三层路由。
那以太网帧在物理链路上本来没有楼层概念,交换机怎么知道这个帧属于哪个VLAN?于是就给帧加了一个“便签”,这就是802.1Q Tag。帧格式里多了4个字节,其中12位是VLAN ID,范围0到4095,可用范围是1到4094。交换机在内部转发时,就是靠这个便签来判断该往哪个VLAN的端口送。
所以Tag是贴在数据帧上的VLAN身份标识,VLAN是逻辑上的隔离域,这两个概念经常被混着说,但作用位置完全不同。VLAN是全局划分出来的广播域,Tag是帧上实际携带的那串标签。
什么时候看得到Tag?一般只有Trunk链路,或者Hybrid端口的tagged列表里有它会带Tag。PC网卡发出的普通帧默认不带Tag,所以接PC的Access口出去的都是无标签帧。你抓包的时候如果看到上行口出去的帧不是完整IP包开头,而是多了VLAN Tag,不用担心,那正是VLAN在正常工作。
1.2 PVID就是进门时默认贴的标签
PVID全称Port VLAN ID,端口缺省VLAN。你把它理解成小区门卫手里那叠空白访客牌就行。PC发出的普通以太网帧没有Tag,交换机收到这种“无标签帧”时,不知道该把它归到哪个VLAN,于是由接收端口按照自己的PVID补上一个标签。
举个例子,端口PVID是10,一个无标签的帧进来,交换机就先给它贴上VLAN 10的标签,然后进入VLAN 10的转发流程。如果进来的帧本身已经带Tag,那PVID就不参与,交换机直接按帧里已有的VLAN ID处理。
很多初学者把PVID理解成“端口所属的VLAN”,这个说法在Access口上勉强成立,因为Access口的default vlan确实就是PVID。但在Trunk和Hybrid口上就不准确了。Trunk口能放行多个VLAN,PVID只是其中默认的那个,只决定无标签帧进来后被打上哪个标签。真正决定端口能过哪些VLAN的,是allow-pass列表,或者Hybrid口上的tagged/untagged列表。
一句话总结:PVID只管“进门时给没带牌子的人发什么牌子”,不能决定这个口能走哪些VLAN。
1.3 Tag与Untag的取舍:什么时候保留标签,什么时候撕掉
Tag和Untag说的是出方向的行为,但很多文档写得太绕,我换成大白话:
- Tagged,就是帧从这个口出去的时候,保留VLAN Tag。
- Untagged,就是帧从这个口出去的时候,把VLAN Tag撕掉再发。
为什么有的要保留?因为对端设备需要靠这个标签识别VLAN,典型的就是交换机互联Trunk口、路由器子接口、支持VLAN的服务器网卡。标签一旦被撕掉,对端根本不知道这个帧原来属于哪个VLAN。
为什么有的要撕掉?因为普通PC、打印机、摄像头这些终端网卡根本不认识802.1Q标签。你把一个带VLAN Tag的帧发给PC,PC会把它当成错误帧直接丢弃,表现就是“网卡显示已连接,但什么都ping不通”。
所以出口方向Tag还是Untag,完全看端口对端接的是什么设备。接普通终端,通常Untag;接交换机或路由器,通常Tag。
为了后面好记,先放个小表:
| 概念 | 作用位置 | 一句话理解 |
|---|---|---|
| VLAN | 全局逻辑隔离域 | 把一个物理网络切成多个广播域 |
| Tag | 帧上的身份标签 | 写在帧里,告诉交换机我是哪个VLAN |
| PVID | 接收端口 | 给不带Tag的帧补上身份标签 |
| Untag/Tagged | 发送端口 | 决定出端口时是否撕掉身份标签 |
2. Access、Trunk、Hybrid三种端口如何搭配这四个概念
2.1 Access口:一进一出都只认一个VLAN
Access口是最简单的端口类型,一般用来接PC、打印机、摄像头这类终端,配置也只有两行:
port link-type access port default vlan 10设成Access后,PVID会自动等于default vlan,也就是VLAN 10。这时端口的完整行为是:
- 收到无标签帧:打上VLAN 10的Tag,进入VLAN 10的转发流程。
- 收到带Tag帧:如果Tag是VLAN 10,可以处理;如果不是VLAN 10,直接丢弃。
- 发出帧:不管内部是哪个VLAN,从这个口出去时一律撕掉Tag。
因为Access口只允许一个VLAN通过,所以根本不需要allow-pass列表。为什么这里不需要单独写PVID?因为在华为/H3C设备上,“port default vlan 10”已经把PVID和允许VLAN一起设好了,天然就是一对一的关系。
有个常见误区:有人以为Access口收到带VLAN 10标签的帧也会保留标签进入转发。实际上Access口在出方向会撕标签,在入方向即便收到带Tag的帧且属于该VLAN,很多设备也会在内部当成正常帧处理,但最终发到PC前仍然会剥掉。所以接终端的口,用Access最省心。
2.2 Trunk口:跨交换机传输的标配
Trunk口用来连接交换机、路由器或者防火墙,它的特点是能同时放行多个VLAN,而且不同VLAN的帧在链路上通过Tag来区分。配置典型是三行:
port link-type trunk port trunk pvid vlan 10 port trunk allow-pass vlan 10 20 99这个口的行为是这样的:
- 收到无标签帧:打上PVID对应的VLAN标签,这里是VLAN 10,然后看VLAN 10是否在allow-pass列表里,在就转发,不在就丢。
- 收到带Tag帧:不看PVID,直接看帧里的VLAN ID是否在allow-pass列表里,在就转发,不在就丢。
- 发出帧:对allow-pass列表里的VLAN,默认分成两类。PVID对应的VLAN,也就是VLAN 10,以Untagged方式发送,这就是常说的“本征VLAN”;其他VLAN,也就是20和99,以Tagged方式发送,带着标签出去。
你可以把Trunk口想象成大楼里的货梯,PVID对应的是那些“不用刷卡也能进、也不挂胸牌”的默认楼层,其他VLAN则是必须挂上胸牌才能进出的区域。
这里有个非常容易踩的坑:Trunk两端PVID如果不一致,同一条物理链路上,A端认为无标签流量是VLAN 10,B端却可能把它当成VLAN 20,结果就是“串VLAN”。后面第四章会详细说。
另外,很多教程喜欢写“port trunk allow-pass vlan all”,实际使用我建议别偷懒,显式列出该放的VLAN。一方面方便排错时一眼看出放行了哪些,另一方面避免VLAN 1或一些内部管理VLAN被意外放行,增加无意义广播域。
2.3 Hybrid口:灵活但容易绕晕,配置时注意规则顺序
Hybrid是华为/H3C设备特有的一种端口类型,它混合了Access和Trunk的能力:同一个口上,有些VLAN按Untagged发出,有些VLAN按Tagged发出,各管各的。
配置示例:
port link-type hybrid port hybrid pvid vlan 10 port hybrid untagged vlan 10 port hybrid tagged vlan 20含义是:这个口的PVID是VLAN 10;收到无标签帧默认打VLAN 10的标签;出口方向,VLAN 10的帧撕掉标签发出去,VLAN 20的帧保留标签发出去。
Hybrid最大的优势是灵活。举个实际场景:一台服务器同时承担办公业务VLAN 10的网关和对外路由VLAN 20的上联,服务器要同时收两个VLAN的流量,但发送给它的网卡驱动可能对VLAN支持程度不一样。这时你可以让VLAN 10以untagged方式发给服务器,VLAN 20以tagged方式发给服务器,一台服务器就接进多个VLAN了。
但灵活也意味着容易翻车。最常见的问题:PVID设成VLAN 10,却忘了写“port hybrid untagged vlan 10”。结果PC发来的无标签帧被当成VLAN 10处理,交换机回包时却因为VLAN 10没有配置untagged,带着标签发给PC,PC直接不认,表现为彻底不通。接普通终端的Hybrid口,PVID对应的那个VLAN,一定要同时在untagged列表里。
再看一个表,三种端口放一起对比更清楚:
| 端口类型 | 接什么设备 | 无标签帧进入时 | 出口Tag策略 |
|---|---|---|---|
| Access | PC/打印机 | 打PVID标签 | 总是Untag |
| Trunk | 交换机/路由器 | 打PVID标签 | PVID对应VLAN Untag,其余Tag |
| Hybrid | 灵活场景 | 打PVID标签 | 按tagged/untagged列表决定 |
3. 配置实操:从接PC到跨交换机,按命令一步步走
3.1 华为/H3C命令行:Access口接PC
假设一个标准办公网组网:VLAN 10给办公电脑,VLAN 20给服务器,VLAN 99给设备管理。接入交换机下联口GigabitEthernet0/0/1接一台办公电脑,我习惯先建VLAN,再配接口。
system-view vlan batch 10 20 99然后进接口:
interface GigabitEthernet0/0/1 port link-type access port default vlan 10 quit这里“port default vlan 10”决定了PVID和端口所属VLAN都是10。配置完成后,PC发出的无标签帧到这个口会被打上VLAN 10标签,交换机内部按VLAN 10转发,回包到这个端口再撕掉标签发给PC,整个流程就通了。
需要注意的是,如果你直接把端口从Trunk改成Access,PVID会跟随default vlan变化,但之前Trunk上的allow-pass配置会自动清掉,所以别担心残留配置。倒是反过来,从Access改成Trunk时,默认PVID是VLAN 1,allow-pass默认放行所有VLAN,如果不手动清,会有一个意料之外的“全通”瞬间,上线前一定要检查。
3.2 Trunk口上联汇聚交换机
接入交换机的上联口GigabitEthernet0/0/24接到汇聚交换机,要求VLAN 10、20、99都能送上去。配置如下:
interface GigabitEthernet0/0/24 port link-type trunk port trunk pvid vlan 10 port trunk allow-pass vlan 10 20 99 quit对端汇聚交换机也要做同样的配置,特别是allow-pass列表和PVID要一致。这样VLAN 10作为本征VLAN走无标签,VLAN 20和99带Tag上去,汇聚侧能正确区分。
如果汇聚和核心之间要做三层互联,而不是把VLAN报送到核心,那汇聚上行口可以不用Trunk,直接配三层口或VLANIF,用IP互联。但如果你希望核心交换机也能看到业务VLAN的标签,就必须用Trunk放行所有业务VLAN。这两种架构没有绝对好坏,关键是标签归属要和你的网关规划一致。我的习惯是:网关放哪一台设备,哪一台设备就要能收到对应VLAN的Tag;而底层接入到汇聚这一段,尽量不要让PVID乱改,保持两端一致。
很多路由器、软路由也支持VLAN子接口,和交换机Trunk对接时必须注意“本征VLAN”这个概念。比如路由器子接口用dot1q termination vid 10来接VLAN 10,那交换机Trunk口发往路由器的VLAN 10流量得保持Untagged,否则子接口可能意外丢弃。实际中你可以把VLAN 10设成交换机Trunk的PVID,让它天然走无标签,路由器子接口正好接收。
3.3 验证命令:确认PVID和Tag真的按预期工作
配置完不能光看“端口UP”就算完事,一定要用命令验证。
第一个命令看全局VLAN视图:
display vlan能看每个VLAN里有哪些端口,端口类型是什么。如果VLAN 10下面没有你想看的端口,说明端口没加进来。
第二个命令看端口级别的VLAN信息:
display port vlan这个命令很直白,会列出每个端口的链路类型、PVID、allow-pass或者tagged/untagged列表。我排障时几乎必用,因为它把端口那么多层配置压缩成几行,一眼能看到问题。
第三个命令看接口实际状态:
display interface GigabitEthernet0/0/24能看到端口是否协商正常、有没有错包、实际收发流量情况。如果接口有大量入方向错误包,很可能就是两端VLAN Tag处理不一致,比如一端发Tagged,另一端却把该端口配成了Access。
更狠一点的验证方式是抓包:在Trunk口上镜像抓包,可以看到VLAN 20、99的帧带Tag,VLAN 10的帧不带;在Access口抓包,VLAN 10的帧也不带Tag。这个对比能直观验证Tag和PVID的配合是否正确。没有抓包环境也没关系,用“display port vlan”配合ping测试就够了。
4. 常见翻车现场与排查思路
4.1 帧在交换机内部“只认Tag,不认PVID”
PVID是个入口动作,一旦无标签帧被打上了标签,进入交换芯片后,后面逻辑只看Tag,不再看PVID。很多人配置了一堆PVID,最后发现某个VLAN的流量还是不通,往往就是PVID和allow-pass列表打架。
举个例子:Trunk口PVID设成10,但allow-pass列表里没有10。无标签帧进来确实会被打上VLAN 10标签,可交换机一看VLAN 10不在允许通过列表里,照样丢弃。这就好比你给访客发了临时卡,但门禁系统里没登记这个卡号,哪里都进不去。
所以排查任何VLAN相关问题时,一定要把“PVID”和“允许列表”分开看。PVID只是入口贴标签,真正的转发许可要看access的default vlan、trunk的allow-pass、hybrid的tagged/untagged列表中是否包含该VLAN。
4.2 Trunk口PVID设错导致“串VLAN”
这是我做项目时踩过最多的坑。现象很诡异:两台交换机之间Trunk做了链路聚合,VLAN 10和VLAN 20都放行了,但VLAN 10里的PC偶尔能访问到VLAN 20里的服务器,另一个方向却又不通。
最后查下来,A端Trunk的PVID是10,B端Trunk的PVID是20。A端把VLAN 10作为本征VLAN,发出时不带Tag;B端收到这个无标签帧时,因为自己PVID是20,就把它当成VLAN 20来处理。于是A的VLAN 10流量变成了B的VLAN 20流量,广播域错位,安全策略形同虚设。
解决办法很粗暴:Trunk两端PVID一定要一致。如果不希望任何无标签流量出现在Trunk上,也可以把PVID设成一个专门的VLAN,而不是业务VLAN,这样即使链路上出现无标签帧,也不会混进业务网络。不过现实中大部分交换机默认PVID都是VLAN 1,很多人又习惯用VLAN 1做管理,导致管理帧和业务帧在Trunk上混在一起。我一般建议Trunk的PVID单独规划一个管理VLAN,且两边保持同一值。
4.3 Untag陷阱:给PC/打印机/摄像头配了Trunk口
有次朋友的公司新装摄像头,施工方说“我需要VLAN 10和VLAN 20都通”,就直接把下联口配成了Trunk,还放行了两个VLAN。结果摄像头DHCP获取不到地址,也ping不通录像机。
原因很清楚:摄像头网卡是标准的单VLAN设备,不认识Tag。Trunk口把VLAN 20的帧带着Tag发给摄像头,摄像头识别不了就直接丢了,所以只有PVID对应的VLAN 10能通,VLAN 20一直不通。
正确做法是,接终端设备一律用Access口,或者用Hybrid口把终端所在的VLAN配成untagged。如果你真的需要一台服务器或终端同时属于多个VLAN,优先用Hybrid口并给每个需要的VLAN做tagged/untagged拆分,但前提是对方网卡必须支持802.1Q并做好子接口或VLAN ID配置,否则就别指望多VLAN通。
4.4 跨交换机VLAN不通的排查流程
最后给一套可以直接照做的排查顺序,按这个流程走,绝大多数VLAN问题十分钟内能收敛:
| 步骤 | 命令/动作 | 重点看什么 |
|---|---|---|
| 1 | 看PC网卡 | IP、掩码、网关是否和规划一致 |
| 2 | ping网关 | 不通就查接入端口,通就往下走 |
| 3 | display port vlan | 查接入端口类型、PVID、允许列表 |
| 4 | display vlan | 查该VLAN是否包含这个端口 |
| 5 | 查上联Trunk两头 | 对端和本端PVID是否一致,allow-pass是否完整 |
| 6 | 查VLANIF或三层接口 | 网关是否创建在正确VLAN上,接口是否UP |
| 7 | 检查ACL和端口隔离 | 如果前面都正常,再考虑有没有安全策略误伤 |
补充一个经验:如果网络里同时做了端口隔离,比如华为的port-isolate或H3C的port-isolate group,你会发现同一VLAN下的设备互相ping不通,但都能通网关。这时候先别怀疑VLAN配置,把隔离策略临时放通再测一次,能省很多时间。另外ACL也是一样,VLAN标签只是到这里,后面的策略匹配还是按IP和端口来走,有时候问题根本不在Tag层,而是策略层。
说实话,VLAN、PVID、Tag、Untag这套东西,刚开始记不住很正常。我自己带新人时经常说:物理口决定接线,Tag决定身份,PVID负责给没身份的人发牌子。配置前先在纸上画出VLAN和端口关系图,配置后一定用display port vlan看一遍。按照这个习惯,大多数“神秘断网”都能在十分钟内收敛。等你哪天遇到PC死活不通,一查是Trunk口PVID被改成了业务VLAN,你会回来感谢现在认真记下这些细节的自己。