两台交换机之间明明划分了 VLAN,PC 也配好了同一网段的 IP,可就是 ping 不通。这是网络工程师日常排障里出现频率极高的一幕。大多数时候,问题不在 IP 地址,也不在防火墙策略,而是出在一个很基础却经常被忽略的环节:两台交换机之间的链路,没有用正确的身份让 VLAN 数据通过。
VLAN 这个技术放在今天已经不算新鲜,很多教材把它描述成“把物理局域网在逻辑上划分成多个广播域”。这个定义没有错,但它太静态了。真实网络环境里,VLAN 的价值从来不是“划出来”就结束,而是要在交换机之间、在三层网关之上,把流量正确地透传、隔离和路由起来。今天这篇文章,我想围绕“交换机之间带 VLAN 通信”这条主线,把原理、配置、排错和不同厂商的细节差异一次讲清楚。
1. 先理解一个前提:VLAN 在交换机之间是靠“标签”识别身份的
1.1 虚线链路两端的交换机,到底在交换什么
两台 PC 接入同一台交换机,划分到同一个 VLAN,彼此通信没有问题。这个逻辑很好理解:交换机在 MAC 地址表里基于 VLAN + 端口建立转发条目,收到帧以后查表,从对应端口送出去。
但换到两台交换机呢?
PC A 连在交换机 SW1 上,PC B 连在交换机 SW2 上,两台 PC 都划分在 VLAN 10。PC A 发一个数据帧到 SW1,SW1 查 MAC 地址表,发现目标 MAC 对应的是连接 SW2 的那个端口。于是这个帧被从该端口送出去,进入网线或光纤,到达 SW2,SW2 再查表转发给 PC B。
问题来了:SW2 收到这个帧之后,它怎么知道这个帧属于 VLAN 10?
如果 SW1 和 SW2 之间这条链路上没有携带 VLAN 信息,SW2 只能按照接收端口的默认 VLAN 来处理这个帧。一旦 SW2 那边的默认 VLAN 和 PC B 实际所属的 VLAN 不一致,这个帧就会被当成另一个 VLAN 的流量,甚至直接被丢弃。
所以,交换机之间要正确通信,必须解决一个核心问题:帧进入链路之后,如何让对端知道它从哪个 VLAN 来。
标准答案就是打标签。IEEE 802.1Q 在以太网帧头部插入一个 4 字节的 Tag,其中包含 12 位的 VLAN ID,取值范围是 0 到 4095,实际可用的是 1 到 4094。交换机会根据这个标签来决定把帧放进哪个 VLAN 转发。
1.2 这里引出了 Access 和 Trunk 两种端口类型
可能有人会问:为什么平时接入 PC 的交换机端口不用打标签?
PC 的网卡默认发送的是不带 802.1Q 标签的标准以太网帧。如果交换机往 PC 方向发送的帧也带标签,普通网卡根本识别不了,直接就丢了。所以,面向终端设备的端口,必须把 VLAN 信息去掉,再把不带标签的帧发给 PC。这种端口就是 Access 口。
而交换机与交换机之间的连接,或者交换机与路由器之间的连接,需要的是另一种角色:Trunk 口(华为也叫 Hybrid,思科叫 Trunk)。
Trunk 口默认允许所有 VLAN 通过,而且发出的帧会保留 VLAN 标签。对端交换机收到带标签的帧,就能准确识别它来自哪个 VLAN,然后按照对应 VLAN 的 MAC 地址表继续转发。
在这里我想强调一个很常见的认知误区:Trunk 不是“把多个 VLAN 合并成一个通道”,而是“在一条物理链路上,通过标签区分不同 VLAN 的帧”。Trunk 口仍然保持每一个 VLAN 的逻辑隔离,只是传输介质被复用了。
所以,交换机之间带 VLAN 通信的第一条铁律是:交换机互联端口,除非只承载一个 VLAN 且明确不需要扩展,否则一律配置为 Trunk 口,并确保两端允许相同的 VLAN 集。
1.3 华为和思科在默认行为上的细微差异
不同交换厂商对 Trunk 的实现细节有差异,这一点在跨厂商环境里最容易出坑。
以华为交换机为例,它的 Trunk 口默认允许所有 VLAN 通过,PVID(端口的默认 VLAN)默认是 1。思科交换机的 Trunk 口默认也是允许所有 VLAN 通过,PVID 同样默认是 1。看起来一样,但在实际配置里,华为的 Trunk 端口如果在入方向收到不带标签的帧,会把它归类到 PVID 对应的 VLAN 中;思科则是通过 native VLAN 这个概念来支持这个行为,默认也是 VLAN 1。
如果两边都保持默认,Trunk 链路并不需要额外配置。但是,一旦你手动修改了对端某个端口的 native VLAN 或 PVID,两边不一致,就会出现“看似接口通了,但 VLAN 间流量却异常”的隐蔽故障。
这个问题的排查难度很高,因为端口状态是 up 的,物理链路没有任何问题,但 VLAN 10 的广播帧、组播帧或者某些特定流量就是过不去。原因就是我前面说的:帧的 VLAN 身份在两端理解不一致。
2. 从“通到一台交换机”到“通到另一台交换机”,中间差了什么
2.1 配置两层交换机之间的 VLAN 透传
假设现在有一个最常见的环境:两台二层交换机 SW1 和 SW2,各自下挂了几台 PC,需要让相同 VLAN 的 PC 跨交换机通信。
配置思路分四步:
- 在第一台交换机上创建 VLAN。
- 在第二台交换机上创建相同的 VLAN。
- 面向 PC 的端口划分到对应 VLAN,并设置为 Access 口。
- 在两台交换机互联的端口上配置 Trunk,并允许对应 VLAN 通过。
华为交换机上的典型配置是这样的:
# 在 SW1 上 vlan batch 10 20 interface GigabitEthernet0/0/1 port link-type access port default vlan 10 # interface GigabitEthernet0/0/24 port link-type trunk port trunk allow-pass vlan 10 20# 在 SW2 上 vlan batch 10 20 interface GigabitEthernet0/0/1 port link-type access port default vlan 10 # interface GigabitEthernet0/0/24 port link-type trunk port trunk allow-pass vlan 10 20这里有一个细节值得注意:华为交换机的 Trunk 口,默认会放行 VLAN 1。很多人在做实验时,只在 Trunk 上放行了 VLAN 10 和 20,导致 VLAN 1 的流量(比如部分管理流量、部分协议报文)无法通过,从而出现一些奇怪的连接问题。建议写成明确只放行你需要的 VLAN 集合,而不是依赖默认值。
思科交换机上对应配置是这样的:
# 在 SW1 上 vlan 10 vlan 20 interface GigabitEthernet0/1 switchport mode access switchport access vlan 10 ! interface GigabitEthernet0/24 switchport mode trunk switchport trunk allowed vlan 10,20命令不同,原理完全一样。关键是理解:Trunk 的本质是“一条链路承载多个 VLAN 的带标签流量”。
2.2 默认 PVID 为什么经常不被关注
PVID 这个参数在很多网络工程师的配置模板里几乎是隐形的,直到出了问题才注意到。
PVID 的含义是:当端口收到一个不带 VLAN 标签的帧时,交换机默认把它归入哪个 VLAN。
所有端口的帧接收处理逻辑都可以概括为这样一条规则:
- 如果帧带标签,直接读取标签中的 VLAN ID,确认该 VLAN 是否被允许通过。
- 如果帧不带标签,打上端口的 PVID 所对应的 VLAN ID,再进入该 VLAN 的转发流程。
对于 Access 口,PVID 就是它划分的那个 VLAN。华为交换机上port default vlan设置的就是 PVID。在思科交换机上,Access 口的 PVID 自动跟随switchport access vlan,一般也不需要手动关注。
但对于 Trunk 口,PVID 的意义完全不同。Trunk 口同时承载多个 VLAN,如果它收到不带标签的帧,默认归入 PVID。华为交换机的 Trunk 口默认 PVID 是 1,思科交换机的 native VLAN 默认也是 1。
在纯三层交换机互联场景中,这个默认值通常没问题,因为交换机之间发出的帧都会带标签。但在涉及混合接入设备、IP 电话、AP 桥接、或者部分特殊终端时,不带标签的帧会进入 Trunk 链路,如果 PVID 设置不合理,这些帧就会被划入错误的 VLAN。
这里要给出一个更实用的建议:如果 Trunk 链路两端设备都能理解 802.1Q 标签,那就保持两端 PVID 一致,并且不要把 PVID 对应的 VLAN 从允许列表里删掉。如果你明确知道这条链路上会出现不带标签的流量,那就要单独规划一个专用 VLAN 作为 PVID,并确保两端配置一致。
2.3 为什么“链路通了”但“VLAN 不通”
我在实际排障中见过最多的情况是:接口状态为 up,物理链路正常,但 VLAN 10 的终端就是彼此 ping 不通。
排查思路要有层次:
第一步看物理层。用display interface brief查看互联端口是否 up。如果 down,检查网线、光模块、速率和双工模式。
第二步看端口类型和允许 VLAN 列表。用display port vlan或display interface GigabitEthernet0/0/24查看端口类型、PVID 和允许通过的 VLAN。这里最容易发现问题是:两边 Trunk 允许的 VLAN 集合不一致,或者一端是 Access 口、一端是 Trunk 口。
第三步看 MAC 地址表。在源端交换机上执行display mac-address vlan 10,看看是否能学到目标设备的 MAC 地址。如果学不到,说明二层转发路径有断裂,返回值要回到上一步继续查。
第四步看广播域隔离情况。如果 PC 能 ping 通同一台交换机上的其他 PC,但 ping 不通另一台交换机上的同 VLAN PC,而两端配置看起来也都正确,那就要考虑是不是 Trunk 上某个 VLAN 被子接口或者三层接口拦截了。
这个排查顺序有很强的现实意义:很多人一上来就去查三层路由、查防火墙策略,但二层的问题都没解决,后面排查全白费。网络通信是一个逐层依赖的过程,先解决下面一层的问题,再去看上面一层的现象,才能高效定位。
3. 跨交换机 VLAN 间通信:难点从“透传”变为“路由”
3.1 二层只能隔离,三层才能互通
同一个 VLAN 之间的通信是二层转发的问题,只要交换机 MAC 地址表正确、Trunk 透传正确,就能通。
但不同 VLAN 之间的通信,就完全不同了。VLAN 10 的 PC 要访问 VLAN 20 的服务器,源和目标不在同一个广播域内,二层交换机永远不会跨 VLAN 转发帧。要实现通信,必须经过三层设备——路由器或者三层交换机。
在企业网络中最常见的方案,就是用三层交换机启用 VLAN 接口(SVI,Switch Virtual Interface),作为每个 VLAN 的网关。比如 VLAN 10 的网关是 192.168.10.1,VLAN 20 的网关是 192.168.20.1。PC 把网关设成它所属 VLAN 的 SVI 地址,跨网段访问时,数据帧先到达网关,三层交换机再通过路由表把数据从另一个 VLAN 接口转发出去。
华为三层交换机上的配置是这样的:
vlan batch 10 20 interface Vlanif10 ip address 192.168.10.1 255.255.255.0 # interface Vlanif20 ip address 192.168.20.1 255.255.255.0思科三层交换机上的配置:
vlan 10 vlan 20 interface Vlan10 ip address 192.168.10.1 255.255.255.0 ! interface Vlan20 ip address 192.168.20.1 255.255.255.0 ! ip routing注意思科需要在全局配置模式下通过ip routing开启三层路由功能,华为交换机一般在创建 VLANIF 后,只要设备具备三层能力,就会走路由流程。
3.2 单臂路由和三层交换,本质是同一个逻辑
在早期路由器时代,或者在没有三层交换机的环境中,还有一种实现 VLAN 间通信的方式:单臂路由。
所谓单臂路由,就是在路由器上用一条物理链路连接交换机,然后在路由器的物理接口上划分子接口,每个子接口对应一个 VLAN,并配置一个 VLAN ID。交换机这边的端口要配置为 Trunk。当 VLAN 10 的帧到达路由器时,路由器根据帧上的 VLAN 标签,把数据交给对应的子接口处理;子接口完成三层路由决策后,再把数据打上新的 VLAN 标签,沿原路送回交换机。
用华为路由器来举例,配置大致这样:
interface GigabitEthernet0/0/1.10 dot1q termination vid 10 ip address 192.168.10.1 255.255.255.0 # interface GigabitEthernet0/0/1.20 dot1q termination vid 20 ip address 192.168.20.1 255.255.255.0单臂路由和三层交换机路由,从三层的视角来看,做的事情完全相同:识别 VLAN 标签,根据源和目标 IP 地址做出路由决策,再重新封装帧,转发到另一个 VLAN。差别只在于性能——路由器用软件转发,三层交换机用硬件芯片转发,吞吐量差别很大。
所以在设计上要有一个判断:如果 VLAN 间通信量不大、只是临时方案,单臂路由够用。如果是正式业务,尤其在汇聚层,三层交换机是更合适的选择。
3.3 网关放哪一侧,决定了 Trunk 链路的压力
跨交换机 VLAN 间通信,还有一个网关位置的选择问题。
如果网关放在核心交换机上,接入交换机的 Trunk 链路只需要承载客户端到网关之间的二层流量。客户端访问网关时,流量路径是:PC → 接入交换机 → Trunk → 核心交换机(网关)→ 路由 → 核心交换机 → Trunk → 接入交换机 → 目标 PC。Trunk 链路上会同时出现两个方向的数据。
如果网关放在接入交换机上,则跨交换机访问流量会先到接入交换机完成路由,再把数据从 Trunk 链路送到目标交换机。这种设计减少了核心交换机的压力,但对接入交换机提出了三层能力要求,而且如果接入交换机型号不支持三层功能,这套方案就走不通。
这里没有绝对的标准答案,关键是理解取舍。
更常见的生产网设计是:接入层做二层,汇聚或核心层做三层网关。这个模式可以简化接入层设备配置,也让故障排查更集中。越简单的架构,在长期维护中越可靠。
4. 跨厂商环境里的 VLAN 通信细节,最容易让你熬夜
4.1 华为和思科对 Trunk 的默认行为差异
在企业网络里,华为和思科设备混存的情况并不少见。虽然 802.1Q 是一个国际标准,但厂商在默认行为上的差异确实存在,而且这些差异一旦不处理,就会变成隐蔽故障。
以 Trunk 口的默认允许 VLAN 列表来说,华为交换机的 Trunk 口默认放行所有 VLAN,思科交换机的 Trunk 口默认也放行所有 VLAN。看起来一致,但需要注意华为的 Trunk 口在流量入方向时存在一个默认处理:如果收到的帧不带标签,它会被打上 PVID 的标签;思科则通过 native VLAN 表示不带标签帧的归属。两边 VLAN 1 的语义是类似的。
但这些默认值在以下情形会产生问题:
- 华为交换机配置
port trunk pvid vlan 10后,如果思科那边的 native VLAN 不是 10,两端对不带标签帧的 VLAN 归属判断就会不一致。 - 华为交换机如果使用
port trunk allow-pass vlan all,思科端默认也是 all,但如果你在思科端使用了switchport trunk allowed vlan remove移除某些 VLAN,而华为端没有对应调整,就会出现一边发送、一边丢弃的情况。 - 在华为交换机的 Hybrid 端口模式下,可以根据需要指定某些 VLAN 剥标签、某些 VLAN 保持标签,灵活性比 Trunk 更高,但也更复杂,跨厂商对接时更容易出错。
面对这些差异,我在实际项目中会采取一个相对安全的原则:凡是 Trunk 链路,明确指定允许通过的 VLAN 列表,不要依赖默认 all;如果链路涉及不带标签的流量,明确规划 PVID/native VLAN,并在两端保持一致。
4.2 对接锐捷或华三时,命令和逻辑的换算
锐捷交换机是一个在国内项目里出现频率很高的品牌,它的命令风格整体接近思科。基本的 Trunk 配置命令如下:
interface GigabitEthernet 0/1 switchport mode trunk switchport trunk allowed vlan 10,20华三(H3C)交换机的配置风格在几十个核心命令上和华为非常接近,很多华为的老工程师切到华三设备基本无感:
vlan 10 vlan 20 interface GigabitEthernet1/0/1 port link-type trunk port trunk permit vlan 10 20熟悉多个厂商之后,你会发现一个规律:这些平台的差异主要集中在命令关键词上,但底层逻辑完全统一。只要理解了 VLAN 标签在链路中的传递方式、PVID 对无标签帧的处理逻辑、以及三层网关的转发路径,换任何一个品牌,都能快速对照配置。
这也是为什么我不建议初学者只背厂商命令。命令背得再熟,不理解为啥这样写,换一个环境照样抓瞎。真正值得花时间的,是理解那套通用的转发原理。
4.3 一个跨厂商的排障案例
说一个典型的案例:华为接入交换机通过 Trunk 连接思科核心交换机,VLAN 10 和 VLAN 20 在两边都存在。接入交换机上的 PC 能 ping 通自己的网关,但 ping 不通同一 VLAN 内另一台接入交换机上的 PC。
排查过程如下:
- 查看物理层:互联端口均为 up。
- 查看思科核心交换机配置:Trunk 接口允许 VLAN 10 和 20。
- 查看华为接入交换机配置:Trunk 放行 VLAN 10 和 20。
- 在华为接入交换机上执行
display mac-address vlan 10,发现学不到远端设备的 MAC。 - 再查看两端端口的 PVID 和 native VLAN:发现思科核心交换机端口被设置了
switchport trunk native vlan 99,而华为接入交换机端口的 PVID 仍然是 1。由于 VLAN 1 在华为端没有被显式放行,而思科端的 native VLAN 99 已经变化,两边对无标签帧的归属判断不一致,导致部分控制协议报文无法正确处理,最终 MAC 地址表学习失败。
修复方法:把两端 PVID 和 native VLAN 改成一致的专用管理 VLAN,或者华为端 PVID 改 99,并确保 VLAN 99 在两端都被允许。问题解决。
这个案例的关键点不是最后改成什么数字,而是提醒我们:跨厂商 Trunk 对接,不仅要看 allow VLAN 列表,还要看 PVID/native VLAN、VLAN 1 的默认放行策略、以及边缘端口(如思科的 PortFast,华为的 stp edged-port)对协议报文的影响。每一条默认值,都可能成为排障路上的陷阱。
5. 交换机互联的长期稳定性,靠的其实是对细节的敬畏
5.1 配置规范化:把 VLAN 编号、命名和用途统一起来
VLAN 通信的配置本身并不复杂,但真实网络中最容易出问题的,不是某一次配置,而是长期演进中没有人维护 VLAN 规划。
一个可长期维护的网络,至少要做到三件事:
- VLAN ID 全公司统一规划,不能在不同交换机上同一个业务用不同编号。
- 每个 VLAN 在交换机上要有明确名称,比如
vlan 10 name Office_PC,这样查看配置时能一眼知道用途。 - Trunk 端口必须显式指定允通的 VLAN 列表,而不是依赖默认值。这样未来新增 VLAN 时,不会因为忘记放行而出现“部分通部分不通”的诡异现象。
5.2 我建议的交换机互联排障清单
把前文的经验收束成一个可复用的排查清单,按顺序执行会节省大量时间:
| 检查层 | 检查项 | 确认方法 |
|---|---|---|
| 物理层 | 端口是否 up,光模块/网线是否正常 | display interface brief或show interfaces status |
| 二层接口 | 互联端口是否为 Trunk 或 Hybrid 并放行对应 VLAN | display port vlan或show interface trunk |
| 标签规则 | 两端 PVID/native VLAN 是否一致 | display interface查看 PVID;思科用show interface trunk |
| 允许列表 | 两端允许通过的 VLAN 集合是否完全一致 | 比较port trunk allow-pass与switchport trunk allowed vlan |
| 二层转发表 | 是否学到目的 MAC 地址 | display mac-address vlan 10或show mac address-table vlan 10 |
| 三层网关 | VLANIF 是否存在且 IP 正确,VLAN 内 PC 网关是否指向该地址 | display ip interface brief或show ip interface brief |
| 安全策略 | 是否配置了 ACL、IPSG、DHCP Snooping 等策略影响转发 | 检查端口下绑定的策略和全局策略 |
如果你按照这个表格排查完还没有定位问题,那就要考虑 STP 阻塞、链路聚合成员接口不一致、或者交换机软件版本缺陷。这类问题相对少见,但一旦存在,排障时间会显著拉长。
5.3 警惕 VLAN 1 被过度依赖
还有一个很多人避而不谈的问题:VLAN 1 的默认放行。
原始标准中,VLAN 1 是默认 VLAN,不能删除,也无法改名,所有端口默认都在 VLAN 1 中。很多人在做配置时,会把管理 IP 放在 VLAN 1 上。这在小型实验环境没有问题,但一旦网络规模变大,VLAN 1 会被不断放大的广播流量淹没,管理面和数据面混在一起,风险很高。
更合理的做法是划分一个专用管理 VLAN,把所有交换机管理地址放进这个 VLAN,并通过 ACL 限制登录来源。Trunk 口上尽量不让管理 VLAN 参与业务放行,减少无标签帧在核心链路上出现的概率。
这需要你在网络建设初期就做好规划,而不是等故障发生后再来补救。等到线上环境已经跑起来,再改管理 VLAN,通常会涉及所有交换机,动作很大。
6. 理解 VLAN,才能真正理解网络里的“隔离”和“互通”
从一个最基础的场景开始:两台交换机之间通信,为什么配置 VLAN 之后反而可能不通?答案不是 VLAN 带来了障碍,而是我们没有正确地让 VLAN 跨链路传递身份。
看似是接口类型的选择问题,背后其实是对标签转发机制的掌握程度。看似是三层网关放在哪里的设计问题,背后其实是对二层隔离与三层互通的整体理解。
在这个领域待得越久,我越觉得网络工程里最难的不是某个高级特性的配置,而是把底层原理和现网行为对上号。你理解了 802.1Q 标签,就不会在 Trunk 和 Access 之间选错;你理解了 PVID 对无标签帧的处理方式,就不会在跨厂商环境里迷路;你理解了三层网关的路径,就不会把跨交换机 VLAN 通信问题误判成路由问题。
所以我的建议很简单:先掌握原理,再把原理落到厂商命令上,最后用一套规范的排查顺序来面对所有“不通”。这三个能力叠加起来,比背下所有厂商的命令手册都更有价值。
下次当你遇到交换机之间带 VLAN 通信的问题时,不妨先问自己三个问题:这条链路上帧的身份是否被正确标记?两端对无标签帧的归属是否一致?三层网关是否在正确的设备上?把这三个问题回答清楚,大部分故障就已经解决了一半。