多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

交换机VLAN配置详解:PVID、Tag与Untag到底怎么用?

交换机VLAN配置详解:PVID、Tag与Untag到底怎么用? 做网工或者IT运维的迟早会碰到有人拿着交换机配置问你“我这个端口明明配了VLAN 10为什么PC还是不通”再一看端口是TrunkPVID也改了可允许列表里根本没加VLAN 10。像这种问题根子上还是没搞懂Tag和PVID到底谁说了算。今天这篇就专门讲透交换机端口上的四个关键词VLAN、PVID、Tag、Untag。我会用人话把这套规则彻底拆开结合华为/H3C的命令实例、验证命令和踩坑记录适合给交换机划VLAN、接终端、跨交换机放通业务的朋友参考。读完你会发现端口上那几行配置本质就是在回答三个问题进来的帧属于哪个VLAN、哪些VLAN允许从这个口过、出去的时候标签是保留还是撕掉。1. 先把概念揉碎了说VLAN、PVID、Tag、Untag分别管哪一段1.1 用“门牌号”和“便签”理解VLAN与TagVLAN全称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口能放行多个VLANPVID只是其中默认的那个只决定无标签帧进来后被打上哪个标签。真正决定端口能过哪些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的帧发给PCPC会把它当成错误帧直接丢弃表现就是“网卡显示已连接但什么都ping不通”。所以出口方向Tag还是Untag完全看端口对端接的是什么设备。接普通终端通常Untag接交换机或路由器通常Tag。为了后面好记先放个小表概念作用位置一句话理解VLAN全局逻辑隔离域把一个物理网络切成多个广播域Tag帧上的身份标签写在帧里告诉交换机我是哪个VLANPVID接收端口给不带Tag的帧补上身份标签Untag/Tagged发送端口决定出端口时是否撕掉身份标签2. Access、Trunk、Hybrid三种端口如何搭配这四个概念2.1 Access口一进一出都只认一个VLANAccess口是最简单的端口类型一般用来接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 10B端却可能把它当成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带着标签发给PCPC直接不认表现为彻底不通。接普通终端的Hybrid口PVID对应的那个VLAN一定要同时在untagged列表里。再看一个表三种端口放一起对比更清楚端口类型接什么设备无标签帧进入时出口Tag策略AccessPC/打印机打PVID标签总是UntagTrunk交换机/路由器打PVID标签PVID对应VLAN Untag其余TagHybrid灵活场景打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改成AccessPVID会跟随default vlan变化但之前Trunk上的allow-pass配置会自动清掉所以别担心残留配置。倒是反过来从Access改成Trunk时默认PVID是VLAN 1allow-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的帧带TagVLAN 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是10B端Trunk的PVID是20。A端把VLAN 10作为本征VLAN发出时不带TagB端收到这个无标签帧时因为自己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、掩码、网关是否和规划一致2ping网关不通就查接入端口通就往下走3display port vlan查接入端口类型、PVID、允许列表4display vlan查该VLAN是否包含这个端口5查上联Trunk两头对端和本端PVID是否一致allow-pass是否完整6查VLANIF或三层接口网关是否创建在正确VLAN上接口是否UP7检查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你会回来感谢现在认真记下这些细节的自己。
返回列表