交换机里那点“贴标签”的事,搞懂了能省一半运维时间。我见过不少运维老哥,配置防火墙、服务器都是一把好手,一到交换机端口上就被 tag 和 untag 这两个词绕得云里雾里。尤其你接手的是华为、H3C 的设备,手册里满满当当写着的 untag、tag 列表,配合 VLAN、PVID、Hybrid 这些概念,别提有多头疼。这篇就把端口 tag 和 untag 彻底掰开揉碎,聊清楚它们到底解决什么问题、在什么样的场景下出现,以及你在配置时真正要注意的点。适合刚接触交换机的网工新人,也适合那些一直会配、但没系统捋过理论的运维朋友。
1. 先搞明白 Tag 和 Untag 到底在解决什么问题
1.1 没有 VLAN 的局域网,就是个大广场
要理解 tag,先得理解交换机为什么需要“标签”这个东西。你可以想象一下没有 VLAN 的二层网络:一台交换机上接了二十台电脑,不管它们需要不需要互相通信,只要有一台电脑发出 ARP 广播,这个广播就会从交换机所有端口转发出去。设备越多,广播域越大,浪费的带宽越多,严重的时候甚至会造成广播风暴,整个网络瘫痪。
VLAN 就是用来切分广播域的。我划了 VLAN 10 和 VLAN 20,那 VLAN 10 的广播就只在 VLAN 10 的端口范围内转发,VLAN 20 同理,两边互不干扰。这逻辑听起来很清晰,但问题来了:交换机怎么知道某个数据帧属于 VLAN 10 还是 VLAN 20?它得有个标记。这个标记,就是以太网帧头里加的那么几个字节——也就是 tag。
1.2 802.1Q:在信封上贴一张面单
标准化的打标方式是 IEEE 802.1Q。它在标准的以太网帧头里、源 MAC 地址和类型字段之间,插进了 4 个字节的数据。这 4 个字节里包含了 TPID(固定为 0x8100)、优先级(PRI)、CFI/DEI、以及最关键的那个字段:VID(VLAN ID)。VID 是 12 位,取值 0 到 4095,其中 0 和 4095 被保留,所以实际可用的 VLAN 编号是 1 到 4094。
加了 tag 之后,帧的最大长度从 1518 字节变成 1522 字节。别小看这 4 个字节的差异,很多老旧网卡驱动不支持 1522 字节的帧,或者中间设备配置了严格的帧长限制,就会出现一种诡异的现象:普通小包能通,大包就断。我后来排查过好几次才明白,很多人说的“网卡不支持 VLAN”问题,根源就在这里。
你完全可以把这个 tag 理解为快递面单:文中的交换机就像快递分拣中心,它不看包裹里装的是什么,只看面单上写的是几号库房,就把它扔到对应的传送带上。不打 tag 的帧,就是没贴面单的裸包裹,交换机只能根据端口的默认配置(PVID)给它补一张面单再处理。
1.3 一个容易混淆的前提:Tag 和 Untag 描述的是“帧”
这里我得特别强调一下:tag 和 untag 描述的到底是谁?是“帧”本身,而不是端口。很多人张口就是“这是个 tag 口”、“这是个 untag 口”,这种说法严格来说是错的。
正确的理解方式:数据帧在链路上传输时,要么“带着标签”(tagged),要么“不带标签”(untagged)。而端口的作用,是在接收和发送这两个方向上,决定自己“该不该给帧贴标签”,或者“该不该把帧上的标签撕掉”。把这个逻辑想通,后面所有端口类型的行为你都能推导出来。
2. 三种端口类型分别怎么处理标签
2.1 Access 口:只属于一个 VLAN,送人出门必撕标签
Access 口最常见的场景就是接 PC、打印机、网络摄像头这类终端设备。这类设备压根不识别 802.1Q 标签,你塞给它一个带 tag 的帧,它反而可能直接丢弃,所以交换机从 Access 口往外发帧时,必须把标签撕掉,发出去的永远是 untagged 帧。
入方向的行为更关键。终端发过来的帧本来就没有标签,交换机收到后,会把这个帧当作“属于该端口 PVID 所属 VLAN”的帧来处理。Access 口只能属于一个 VLAN,所以它的 PVID 就固定等于这个 VLAN。如果收到一个带 tag 的帧,而 tag 里的 VID 和端口的 PVID 不一致,这个帧会被直接丢弃。很多人不知道 Access 口也会丢弃带标签帧,只知道“Access 口只配一个 VLAN”,结果遇到交叉接线的问题时,怎么都查不到原因。
这里我不妨多提一句:华为设备上,Access 口默认 PVID 是 VLAN 1。所以你如果建了 VLAN 10,把接口划成 Access 放进了 VLAN 10,那么系统会自动把它的 PVID 改成 10。但如果你用的是通用配置平台做自动化,端口类型和 PVID 是分开下发的,那就需要注意下发顺序,否则中间态会出现帧被错误打标的情况。
2.2 Trunk 口:链路主干道,标签原样带过
Trunk 口就是交换机互联用的口。和 Access 口不一样,Trunk 口允许承载多个 VLAN 的流量,不同 VLAN 的帧在 Trunk 链路上传输时,必须保留自己的 VLAN 标签,不然对端的交换机就无法区分这些帧分别属于哪个 VLAN。
Trunk 口的出方向行为有个特例:默认情况下,PVID 对应的那个 VLAN(通常是 VLAN 1)以 untagged 方式发出。因为对端的交换机如果收到一个 untagged 帧,会默认把它当成 PVID 所在 VLAN 来处理。这个 PVID 在思科设备上叫 native VLAN,在华为、H3C 上叫 PVID,其实是同一个东西。所以配置 Trunk 时,除了要检查允许哪些 VLAN 通过,也一定要检查 PVID 是不是你期望的那个值。
我遇到过这样一个故障:两台交换机之间做了 Trunk,允许列表里放了 VLAN 10 和 20,但其中一台的 PVID 被改成了 10,另一台还是 VLAN 1。结果 VLAN 10 的帧在第一条链路上以 untagged 出,到了对端被当成了 VLAN 1 的帧,两边 VLAN 对不上,业务一塌糊涂。修改 Trunk 的 PVID 之前,一定要先想清楚对端交换机会怎么处理 untagged 帧。
2.3 Hybrid 口:把贴不贴标签的选择权交给你
Hybrid 是华为和 H3C 设备上特有的一种端口类型。它比 Trunk 更灵活,同一个端口既能以 tagged 方式放行某些 VLAN,又能以 untagged 方式放行另外一些 VLAN。换句话说,它可以把“打不打标签”的决策细化到 VLAN 粒度。
举个例子,我拿一个 Hybrid 口同时接了一台 PC 和一个 IP 电话,PC 需要 untagged 的 VLAN 10,电话需要 untagged 的 VLAN 20,但这两台终端自身又不识别 802.1Q 标签,咋办?Trunk 口做不到,Access 口更做不到,只有 Hybrid 口可以在同一端口上把 VLAN 10 和 20 都设置为 untagged。而如果这个口还要上行接一台交换机,可以把 VLAN 100 设置为 tagged,让上行流量带着标签走。这就是 Hybrid 的实际价值。
Hybrid 口还牵涉到一个很多人都会困惑的点:同一个端口既可以配 PVID,又可以配 tagged/untagged 的 VLAN 列表。PVID 只影响“入方向收到的 untagged 帧被贴上哪个 VLAN 的标签”,而 tagged/untagged 列表影响的是“出方向时哪些 VLAN 的帧要带着标签出去”。这两个是不同的维度,不要混在一起。
2.4 一张表看透三种端口的行为模式
我结合多年配置习惯,把三种端口类型的入方向和出方向整理成一个速查表,方便你收藏备用。
| 端口类型 | 入方向收到 untagged 帧 | 入方向收到 tagged 帧 | 出方向行为 | 典型用途 |
|---|---|---|---|---|
| Access | 打上 PVID 的标签 | 丢弃(VID 必须等于 PVID) | 一律剥掉标签,以 untagged 发出 | 接 PC、摄像头、打印机 |
| Trunk | 打上 PVID 的标签 | 检查是否在允许列表内,允许则转发 | 除 PVID 外其他 VLAN 以 tagged 发出 | 交换机互联、路由器子接口互联 |
| Hybrid | 打上 PVID 的标签 | 检查是否在允许列表内,允许则转发 | 配置为 untagged 的 VLAN 剥标签,配置为 tagged 的 VLAN 保留标签 | 一端口同时接终端和交换机,或者实现灵活多 VLAN 场景 |
有一说一,这张表你得真的“看进去”,因为很多故障根因就在这入和出两个方向的不对称理解上。比如入方向都遵循“收到 untagged 打 PVID,收到 tagged 看允许”,而出方向却各有各的玩法。
3. 实操:配置一个真实验证 Tag 和 Untag 的组网
3.1 组网需求与 VLAN 规划
光讲概念不过瘾,我们来搭一个典型的小型办公网络,亲手配置并验证一下 tag 和 untag 的流转过程。假设我手头有两台华为交换机,一台当核心(S5735),一台当接入(S2700)。核心下面挂了服务器,接入下面挂 PC 和 IP 摄像头。
- VLAN 10:办公 PC 网段
- VLAN 20:监控网段
- VLAN 100:服务器网段
接入交换机连接 PC 的口规划为 Access,PVID 为 VLAN 10;连接摄像头的口规划为 Access,PVID 为 VLAN 20。接入交换机上联核心交换机的口规划为 Trunk,放行 VLAN 10 和 20,改 PVID 为 10。核心交换机连接服务器的口规划为 Access,PVID 为 VLAN 100;核心上接路由器的口或者与接入互联的口规划为 Trunk。
这里就有一个值得注意的点:Trunk 的 PVID 我故意改成 10。为什么?因为接入交换机收到的所有 untagged 帧,最终都需要沿着 Trunk 发给核心,如果 PVID 保持默认的 1,那么接入交换机内部 VLAN 1 的 untagged 帧也会发上核心去,核心上如果没有 VLAN 1 的接口,或者有多个 VLAN 1 接口,就会造成不必要的流量混乱。规划大网时,Trunk 的 PVID 通常是选一个不承载业务的 VLAN,或者就是承载接入侧的默认 VLAN。
3.2 华为交换机上的实际配置命令
以下是核心交换机和接入交换机的配置片段,按普通的操作习惯来写:
接入交换机上:
vlan batch 10 20 interface GigabitEthernet0/0/1 port link-type access port default vlan 10 interface GigabitEthernet0/0/2 port link-type access port default vlan 20 interface GigabitEthernet0/0/24 port link-type trunk port trunk pvid vlan 10 port trunk allow-pass vlan 10 20核心交换机上:
vlan batch 10 20 100 interface GigabitEthernet0/0/1 port link-type access port default vlan 100 interface GigabitEthernet0/0/24 port link-type trunk port trunk pvid vlan 100 port trunk allow-pass vlan 10 20 100这段配置里,接入交换机的 G0/0/24 和核心交换机的 G0/0/24 互联,两边都是 Trunk。核心交换机因为下面还要通过 Vlanif 接口做网关(配置 IP),所以允许列表里就把三个 VLAN 全放进去。
配置完成后,有两个必看的验证命令。第一个是display port vlan,直接查看每个端口收发时的 tagged/untagged 状态。第二个是display vlan,查看每个 VLAN 下都有哪些端口。下面是我在设备上实际执行后大约会看到的样子:
Port Link Type PVID Trunk/VLAN Membership GigabitEthernet0/0/1 access 10 - GigabitEthernet0/0/2 access 20 - GigabitEthernet0/0/24 trunk 10 VLAN 10, VLAN 20看到 Trunk 口的 PVID 变成了 10,并且 VLAN 10 在出方向以 untagged 方式发送,VLAN 20 以 tagged 方式发送,这就说明配置生效了。
3.3 验证手段:抓包看 Tag 与 Untag 的实际区别
命令配置完了,有没有更直观的验证办法?有,用抓包软件在链路上抓一下就知道。你在 PC 上 ping 网关,同时在接入交换机上联口做一个镜像,把流量引到监控口,然后在监控电脑上打开 Wireshark 查看。
你会看到两种明显的帧:一种是从 PC 发出去的普通 ARP 或 ICMP 帧,以太网头部没有额外的 4 字节 tag 字段,这就是标准 untagged 帧。另一种是从交换机 Trunk 口发往核心的帧,帧头里多了 4 字节的 802.1Q 信息,里面能看到清晰的 VLAN ID。亲眼看到这两种帧的差异,比看十遍文档都管用。
另外,在核心交换机上可以用一个更简单的判断方式。在接入交换机上把某个 Access 口换成连接测试仪,模拟终端发送 untagged 帧到 Trunk 口,然后在核心交换机上执行display mac-address vlan 10,能看到这个终端的 MAC 地址出现在 VLAN 10 的 MAC 表中;再执行display mac-address vlan 20,它是不会出现的。因为 untagged 帧一进 Trunk 口就会被 PVID 打标签,规则就是如此。
4. 高频问题与排查经验实录
4.1 终端接在 Trunk 口上为什么不通?
这是新手中招率极高的问题。有人图省事,把 PC 直接插在交换机预留的 Trunk 口上,结果怎么配都不通。原因前面已经讲透了:Trunk 口默认情况下除了 PVID 对应的 VLAN 以外,其他 VLAN 的帧都是带着标签出去的,而 PC 的网卡不认带标签的帧,所以数据到了网卡就被丢了。
解决办法有两个:一是把 Trunk 口改成 Access 口,PVID 设成 PC 所在 VLAN;二是用 Hybrid 口,把 PC 所在 VLAN 配置成 untagged。注意别只在 Trunk 口上把某个 VLAN 的 tagged 去掉,然后寄希望于“这样就是 untagged”,这个操作只影响出方向,入方向收到的帧还是会经过 PVID 的判定。不理解端口方向性,会在这里反复踩坑。
4.2 Hybrid 的 tag 到底是入口打还是出口打?
每次一聊到 Hybrid 端口,总有人问“hybrid tag 是入口打标还是出口打标”。答案其实不复杂:出口打不打标,由 tagged/untagged 列表决定;入口打不打标,由 PVID 决定。
具体展开说:Hybrid 口收到一个 untagged 帧时,会先打上 PVID 的标签,然后进入交换机内部转发。这是入口打标。而当帧从 Hybrid 口发出去时,如果该帧所在 VLAN 在 untagged 列表里,就剥掉标签发出去;如果在 tagged 列表里,就保留标签发出去。这是出口的贴与不贴。可以理解为入口一定打标,而且只打 PVID 的标;出口打不打,取决于你配的列表。
搞清楚这一点之后,很多配置都能自己推断出来。比如你有一个 Hybrid 口同时接终端和交换机,那终端对应的 VLAN 一定要加进 untagged 列表,交换机对应的 VLAN 要加进 tagged 列表。PVID 就设成终端所在 VLAN,这样进来的是什么,出去也自然是什么。
4.3 几个容易让人抓狂的交换机和端口相关疑难杂症
除了 tag 和 untag,实际运维中还经常遇到下面这些和交换机端口、网络排查相关的问题,我顺手整理一下,都是踩过坑后的经验。
第一,华为交换机怎么查看 DHCP 配置。有些项目里 DHCP 是跑在交换机上的,排查地址获取失败时,你需要快速确认地址池状态。常用的是display dhcp server查看服务状态和地址池分配情况,再用display current-configuration | include dhcp过滤当前配置。如果发现地址池被耗尽,优先去查是不是有设备在持续发送 DHCP Discover 而从不释放,而不是忙着改地址池范围。
第二,H3C 交换机怎么从指定接口发起 Ping 测试。这个需求很常见,比如你怀疑某个 VLAN 接口不通,但设备的路由表里有多个出接口,默认可能从管理口发出。H3C 的ping命令支持-a指定源地址,也可以配合-i指定出接口来做测试。配置完 VLAN 接口后,用它来验证业务 VLAN 的三层连通性,非常直观。
第三,交换机光口到底做链路聚合还是主备。很多人一看到有多个光口,就想做链路聚合。链路聚合能提升带宽和可靠性,但要求两端设备同时支持并正确配置 LACP 或者静态聚合,否则反而可能造成环路和广播风暴。如果只是单纯需要冗余链路,又不想承担聚合的复杂度,那就做主备,平时闲置一个端口,故障时通过监测和路由协议切换过去。没有绝对的对错,关键是明确你的业务需求。
第四,端口被占用的问题。Windows 上常见的是,某个服务起不来,提示端口被占。用netstat -ano | findstr 8080看到 PID 后,再用tasklist | findstr <PID>定位进程,taskkill /F /PID <PID>结束它。这个操作本身简单,但很多人忘了检查这个端口是不是系统保留端口,或者被 Hyper-V 这类虚拟化组件预留。遇到那种“明明没有进程占用,端口还是起不来”的情况,多半是预留端口的问题,别在 taskkill 上浪费时间。
第五,22 端口是干什么用的。严格来说,22 端口是 SSH 服务的默认监听端口,运维远程管理 Linux 设备或者部分网络设备都会用到它。如果你在交换机上看到 22 端口对应着某个管理服务,却不清楚当前设备是否开了 SSH,用display ssh server status这种命令查一下即可。对网络设备来说,SSH 比 Telnet 安全得多,因为它传输的内容是加密的。
打个包整合一下,我直接列一个速查表,方便遇到问题时直接看。
| 故障现象 | 可能原因 | 优先排查思路 |
|---|---|---|
| PC 插在 Trunk 口上不通 | PC 网卡不处理带 tag 帧 | 改用 Access 口,或配置 Hybrid untagged 列表 |
| 两个交换机 Trunk 互联后 VLAN 错乱 | 两端 PVID 不一致 | 比对两端 PVID,确认 untagged VLAN 相同 |
| VLAN 内设备能通,但互访网关不通 | Vlanif 接口未创建,或接口状态 DOWN | 检查 Vlanif 接口和端口状态 |
| 大包不通,小包通 | MTU 或帧长限制 | 检查端口下是否配置了帧长上限,以及网卡驱动 |
| 端口被占用但找不到进程 | 系统保留端口或虚拟化预留 | 用netsh interface ipv4 show excludedportrange protocol=tcp查看 |
5. 最后再分享一点我的个人体会
VLAN、Tag、Untag 这些概念,说到底是二三层网络里最基础的一环,但越基础的东西越容易被人忽略细节。我在实际排障中发现,很多看起来极其诡异的网络故障,最后定位回来,都是“某个端口的 PVID 改过,或者 untagged 列表里多写了一个 VLAN”。排查思路对了,基本几分钟就能解决;思路不对,可能折腾半天还怀疑是光模块坏了。
建议刚接触交换机的朋友不要在纸面上死记硬背,而是打开模拟器(华为的 eNSP 或者 H3C 的 HCL 都行),搭一个最简单的三台设备组网,一边配置一边抓包,亲眼看看数据帧在 Access 口和 Trunk 口上发生了什么变化。把“入口打标、出口撕标”这个动态过程用眼睛确认一遍,比任何文档都管用。等你把这层窗户纸捅破,再回头看 tag 和 untag 的配置,就会觉得非常简单。