1. 从一个真实组网场景说起:为什么需要跨交换机划分VLAN
很多刚接触企业级网络的朋友,第一次听到"跨交换机划分VLAN"这个词,脑子里冒出来的第一个疑问往往是:我在一台交换机上划好VLAN不就行了吗,为什么还要折腾跨交换机?这个问题问得特别好,因为它恰恰点出了VLAN技术从"单机玩具"走向"真实生产环境"的关键一步。
我先描述一个几乎每个网络从业者都会遇到的场景。假设某公司有两个部门——研发部和市场部,每个部门各有十几台电脑。一开始大家图省事,所有电脑都接在同一台24口交换机上,然后在这台交换机上划了两个VLAN:VLAN 10给研发部,VLAN 20给市场部。这样两个部门二层隔离,广播域互不干扰,看起来挺完美。但问题很快就来了:公司扩招,一台24口交换机不够用了,又买了一台新的接入交换机。现在研发部的一部分人接在旧交换机上,另一部分人接在新交换机上。如果只在每台交换机上各自划VLAN,那么接在旧交换机上的研发部同事和新交换机上的研发部同事,虽然逻辑上属于同一个部门,二层却根本通不了——因为他们分属两台物理设备,VLAN信息没有打通。
这就是跨交换机VLAN要解决的核心问题:让同一个VLAN的成员能够跨越物理设备的边界,在二层上像一个整体一样通信。而实现这件事的关键技术,就是大家耳熟能详的Trunk链路(干道链路)和802.1Q标签(VLAN Tag)。
我个人的经验是,单交换机划VLAN只能算"入门练习",真正能体现你对VLAN理解深度的,是跨交换机的配置。因为这里涉及到标签的封装与剥离、Trunk口的协商、Native VLAN的处理、PVID的匹配等一系列细节,任何一个环节搞错,现象都是"ping不通",但原因可能千差万别。所以这篇文章我不打算只给你一堆命令,而是想把每个配置背后的"为什么"讲透,让你遇到问题时能自己推理出原因,而不是靠背命令。
这篇文章适合三类人看:一是正在准备网络方向认证、需要把VLAN原理吃透的考生;二是刚入职、第一次接触多交换机组网的新人;三是虽然配过VLAN但一直没搞明白Trunk和Access区别的运维同学。我会从原理讲到实操,再讲到排错,尽量做到你看完就能在自己的模拟器或实验环境里复现出来。
2. 跨交换机VLAN的底层逻辑:标签、干道与PVID
在动手敲命令之前,我们必须先把几个核心概念理清楚。很多人配置失败,根本原因不是命令记错了,而是脑子里的模型是错的。这一章我会用生活化的类比把这些概念讲明白。
2.1 为什么需要VLAN标签:给数据帧贴上"部门工牌"
先想一个问题:当一台交换机从某个端口收到一个数据帧时,它怎么知道这个帧属于哪个VLAN?在单交换机环境下,答案很简单——看这个帧是从哪个端口进来的,端口属于哪个VLAN,帧就属于哪个VLAN。这叫"基于端口的VLAN",也是我们最常用的方式。
但跨交换机就不一样了。当交换机A要把一个VLAN 10的帧通过级联链路发给交换机B时,交换机B怎么知道这个帧是VLAN 10的,而不是VLAN 20的?如果链路上同时承载了VLAN 10、20、30的流量,没有标识的话,交换机B就彻底懵了。
解决办法就是在帧里插入一个标签,明确告诉对端"这个帧属于哪个VLAN"。这个标签就是802.1Q Tag,它被插入到以太网帧的源MAC地址和类型字段之间,长度4个字节。这4个字节里最关键的是VID字段(VLAN ID),占12位,所以理论上支持4096个VLAN(实际可用1-4094)。
打个比方:VLAN标签就像给每个数据帧贴上一张"部门工牌"。帧在交换机内部流转时,工牌可能被摘掉(因为交换机内部知道它属于谁);但一旦要出门走级联链路,就必须把工牌戴上,否则对端认不出它是哪个部门的。
这里有个细节值得强调:标签只在Trunk链路上存在,在Access链路上是不带的。因为Access口只属于一个VLAN,进来的帧天然就知道归属,没必要贴标签;出去的帧是发给终端设备的,普通网卡不认识带标签的帧,所以必须把标签剥掉再发。
2.2 Access口与Trunk口的本质区别
理解了标签,Access和Trunk的区别就很好懂了。
Access口(接入口)通常连接终端设备,比如电脑、打印机、服务器。它只属于一个VLAN,收发帧时都不带标签。你可以把它理解成"单部门专用通道"——进来的都是这个部门的人,出去的时候也不需要出示工牌。
Trunk口(干道口)通常连接另一台交换机或路由器。它允许多个VLAN的流量通过,收发帧时带标签(Native VLAN除外,后面细说)。你可以把它理解成"多部门共用走廊"——每个走过的人都必须戴着工牌,这样对端才知道该把他送到哪个部门。
| 对比项 | Access口 | Trunk口 |
|---|---|---|
| 连接对象 | 终端设备(PC、服务器) | 交换机、路由器 |
| 所属VLAN | 仅1个 | 多个 |
| 收发帧是否带标签 | 不带 | 带(Native VLAN除外) |
| 典型应用 | 接入层连PC | 交换机之间级联 |
我见过不少新手把两台交换机之间的线两端都配成Access,结果发现只有默认VLAN能通,其他VLAN全断。原因就是Access口会把带标签的帧直接丢弃或误处理,根本没法承载多VLAN流量。所以记住一句话:交换机之间互联,两端必须是Trunk。
2.3 PVID与Native VLAN:那个容易被忽略的"默认身份"
PVID(Port VLAN ID)是端口的一个属性,表示"这个端口默认属于哪个VLAN"。对于Access口,PVID就是它所属的那个VLAN;对于Trunk口,PVID对应的是Native VLAN。
Native VLAN是个很有意思的概念。在Trunk链路上,大部分VLAN的帧都带标签传输,但Native VLAN的帧是不带标签传输的。为什么要有这么个设计?主要是为了兼容一些不认识标签的老设备,以及处理一些未标记的流量。
这里有个坑必须提前说:Trunk链路两端的Native VLAN必须一致。如果一端Native VLAN是1,另一端是10,那么一端发出去的不带标签帧,到了另一端会被打上错误的标签,导致VLAN串扰甚至通信中断。这是跨交换机配置里最常见的故障之一,后面排错章节我会详细讲。
2.4 一个完整的跨交换机通信流程
我们把上面的概念串起来,看一个完整的流程。假设PC1接在交换机A的VLAN 10,PC2接在交换机B的VLAN 10,两台交换机通过Trunk互联。
- PC1发出一个普通以太网帧,不带标签,进入交换机A的Access口。
- 交换机A根据Access口的PVID,给帧打上VLAN 10的标签,在内部转发。
- 帧要从Trunk口出去,因为VLAN 10不是Native VLAN,所以标签保留,发往交换机B。
- 交换机B从Trunk口收到带VLAN 10标签的帧,识别出它属于VLAN 10。
- 交换机B查VLAN 10的转发表,发现PC2所在的Access口属于VLAN 10,于是把标签剥掉,发出不带标签的帧。
- PC2收到普通帧,通信完成。
整个流程里,标签在Access口被"贴上"和"剥掉",在Trunk口被"保留"。理解了这条链路,你就理解了跨交换机VLAN的全部精髓。
3. 动手前的准备:实验环境与规划思路
讲完原理,我们进入实操。不过在敲命令之前,我想先聊聊"规划"这件事。很多新手拿到设备就开始配,配到一半发现VLAN号冲突了、IP段重叠了,又得推倒重来。我个人的习惯是,任何网络配置之前,先在纸上把拓扑和地址规划画清楚,磨刀不误砍柴工。
3.1 实验拓扑设计
为了把跨交换机VLAN讲清楚,我设计一个最小但完整的拓扑。你可以用模拟器(比如常见的网络模拟软件)或者真实设备来复现。
拓扑结构是这样的:
- 交换机SW1:作为接入交换机,连接PC1和PC2
- 交换机SW2:作为另一台接入交换机,连接PC3和PC4
- SW1和SW2之间:通过一个Trunk口互联
VLAN规划:
- VLAN 10:研发部,网段192.168.10.0/24
- VLAN 20:市场部,网段192.168.20.0/24
端口规划:
| 设备 | 端口 | 连接对象 | 端口类型 | 所属VLAN |
|---|---|---|---|---|
| SW1 | G0/1 | PC1 | Access | VLAN 10 |
| SW1 | G0/2 | PC2 | Access | VLAN 20 |
| SW1 | G0/24 | SW2的G0/24 | Trunk | 允许10,20 |
| SW2 | G0/1 | PC3 | Access | VLAN 10 |
| SW2 | G0/2 | PC4 | Access | VLAN 20 |
| SW2 | G0/24 | SW1的G0/24 | Trunk | 允许10,20 |
IP地址规划:
- PC1:192.168.10.1/24
- PC3:192.168.10.2/24(和PC1同VLAN,应该能通)
- PC2:192.168.20.1/24
- PC4:192.168.20.2/24(和PC2同VLAN,应该能通)
验证目标很明确:PC1能ping通PC3(跨交换机同VLAN),PC2能ping通PC4(跨交换机同VLAN),但PC1 ping不通PC2(同交换机不同VLAN,二层隔离)。这三个验证点覆盖了跨交换机VLAN的核心行为。
3.2 配置前的三个关键决策
在动手之前,有三个决策点需要想清楚,它们直接影响你的配置方式。
第一个决策:Trunk口允许哪些VLAN通过?有两种做法,一种是allow all(允许所有VLAN),另一种是明确指定允许的VLAN列表。我强烈建议用后者,也就是只允许业务需要的VLAN通过。原因有两个:一是安全,避免无关VLAN的流量在链路上跑;二是性能,减少不必要的广播。虽然在小实验里看不出差别,但在真实网络里这是基本素养。
第二个决策:Native VLAN用哪个?默认是VLAN 1。很多教程建议改掉默认Native VLAN,用一个专门的、不承载业务的VLAN号(比如VLAN 999)作为Native VLAN。这样做是为了避免VLAN 1被滥用带来的安全隐患。在实验里你可以先用默认的,但生产环境我建议改掉。
第三个决策:链路类型用Access还是Trunk?这个前面说过了,交换机之间必须Trunk。但要注意,有些厂商的设备支持"动态协商"(比如DTP协议),会自动协商成Trunk。我个人的建议是关闭动态协商,手动指定Trunk。因为动态协商存在安全风险(可能被恶意协商),而且手动配置更可控、更好排错。
3.3 一个容易被忽略的准备工作:确认设备型号和命令体系
不同厂商、不同系列的交换机,命令语法差异很大。有的用switchport mode trunk,有的用port link-type trunk。所以在动手前,先确认你手头设备或模拟器的命令体系。本文我以最常见的命令风格为例来讲解,如果你用的是其他体系,把对应的命令替换一下即可,逻辑是完全相通的。
提示:如果你在模拟器里做实验,建议先保存一个初始配置快照。这样配错了可以快速回滚,不用一台一台恢复出厂设置。
4. 分步实操:从零配通跨交换机VLAN
准备工作做完,我们正式开始配置。我会按照"先创建VLAN,再配Access口,最后配Trunk口"的顺序来,这个顺序符合逻辑,也方便排错。
4.1 第一步:在两台交换机上创建VLAN
VLAN必须先在交换机上创建出来,端口才能加入。这一步两台交换机都要做。
在SW1上执行:
SW1> enable SW1# configure terminal SW1(config)# vlan 10 SW1(config-vlan)# name Research SW1(config-vlan)# exit SW1(config)# vlan 20 SW1(config-vlan)# name Marketing SW1(config-vlan)# exit在SW2上执行同样的命令:
SW2> enable SW2# configure terminal SW2(config)# vlan 10 SW2(config-vlan)# name Research SW2(config-vlan)# exit SW2(config)# vlan 20 SW2(config-vlan)# name Marketing SW2(config-vlan)# exit这里有个细节:VLAN号必须在两台交换机上一致。SW1上VLAN 10叫Research,SW2上VLAN 10也必须对应同一个部门。因为VLAN标签里传的是VLAN号(VID),不是名字。名字只是给人看的,方便管理。如果你在SW1上把研发部划成VLAN 10,在SW2上却划成VLAN 30,那两边的研发部就永远通不了——因为标签对不上。
创建完可以用show vlan brief查看,确认VLAN 10和20都出现了。
4.2 第二步:配置Access口,把PC划进对应VLAN
接下来把连接PC的端口配成Access口,并划入对应VLAN。
SW1上:
SW1(config)# interface gigabitEthernet 0/1 SW1(config-if)# switchport mode access SW1(config-if)# switchport access vlan 10 SW1(config-if)# exit SW1(config)# interface gigabitEthernet 0/2 SW1(config-if)# switchport mode access SW1(config-if)# switchport access vlan 20 SW1(config-if)# exitSW2上:
SW2(config)# interface gigabitEthernet 0/1 SW2(config-if)# switchport mode access SW2(config-if)# switchport access vlan 10 SW2(config-if)# exit SW2(config)# interface gigabitEthernet 0/2 SW2(config-if)# switchport mode access SW2(config-if)# switchport access vlan 20 SW2(config-if)# exit这两条命令的含义:switchport mode access把端口模式设为接入模式,switchport access vlan X把端口划入VLAN X。配完后,端口就只属于这一个VLAN了。
我个人的习惯是,配完一个端口就show running-config interface看一眼,确认配置生效。因为有时候手快打错了VLAN号,自己都没注意,等到排错时才发现,白白浪费时间。
4.3 第三步:配置Trunk口,打通两台交换机的VLAN通道
这是跨交换机配置的核心步骤。两台交换机的互联口都要配成Trunk,并且允许VLAN 10和20通过。
SW1上:
SW1(config)# interface gigabitEthernet 0/24 SW1(config-if)# switchport mode trunk SW1(config-if)# switchport trunk allowed vlan 10,20 SW1(config-if)# switchport trunk native vlan 1 SW1(config-if)# exitSW2上:
SW2(config)# interface gigabitEthernet 0/24 SW2(config-if)# switchport mode trunk SW2(config-if)# switchport trunk allowed vlan 10,20 SW2(config-if)# switchport trunk native vlan 1 SW2(config-if)# exit逐条解释这几条命令:
switchport mode trunk:把端口设为干道模式,允许承载多个VLAN。switchport trunk allowed vlan 10,20:明确只允许VLAN 10和20通过。如果不写这条,默认允许所有VLAN。switchport trunk native vlan 1:设置Native VLAN为1。两端必须一致。
配完后,用show interfaces trunk查看Trunk状态。你应该能看到G0/24处于trunking状态,允许的VLAN列表里有10和20,Native VLAN是1。
4.4 第四步:验证配置,三个必测场景
配置完成,接下来是验证。我设计了三个测试场景,覆盖跨交换机VLAN的核心行为。
场景一:跨交换机同VLAN通信(应该通)
给PC1配192.168.10.1/24,PC3配192.168.10.2/24。在PC1上ping PC3:
PC1> ping 192.168.10.2如果配置正确,应该能ping通。这个测试验证了VLAN 10的流量能正确跨越Trunk链路。
场景二:跨交换机另一个VLAN通信(应该通)
给PC2配192.168.20.1/24,PC4配192.168.20.2/24。在PC2上ping PC4,也应该通。这验证了VLAN 20的流量同样能跨Trunk。
场景三:同交换机不同VLAN隔离(应该不通)
在PC1上ping PC2(192.168.20.1),应该不通。这验证了VLAN的二层隔离特性——即使在同一台交换机上,不同VLAN也不能直接通信。
三个场景都符合预期,说明你的跨交换机VLAN配置成功了。如果哪个场景不符合预期,别急,下一章我会带你系统排错。
5. 排错实录:当ping不通时,我是怎么一步步定位的
配置网络最怕的就是"配完了不通,但不知道哪里错了"。这一章我把跨交换机VLAN最常见的几类故障整理出来,并且还原我的排查思路。你遇到问题时,可以照着这个链路一步步查。
5.1 排查第一站:Trunk链路到底起来没有
ping不通,我第一个查的永远是Trunk链路状态。因为跨交换机通信全靠它,它要是没起来,后面全白搭。
SW1# show interfaces trunk这条命令会列出所有Trunk口及其状态。重点看三样东西:
- Mode列:应该是
on或trunk,如果是auto或desirable,说明还在协商,可能没协商成功。 - Encapsulation列:应该是
802.1q。 - Vlans allowed列:确认10和20都在列表里。
如果这条命令什么都没输出,说明Trunk根本没起来。常见原因有两个:一是两端模式不匹配(一端trunk一端access),二是物理链路有问题。先查物理层,再查配置。
我踩过的一个坑是:两端都配了switchport mode trunk,但其中一端的allowed vlan列表里漏了某个VLAN。结果那个VLAN的流量就是过不去,而其他VLAN正常。这种"部分不通"的现象特别迷惑人,所以allowed vlan一定要仔细核对。
5.2 排查第二站:Native VLAN是否两端一致
如果Trunk起来了,但某些VLAN不通,我会查Native VLAN。
SW1# show interfaces gigabitEthernet 0/24 switchport看输出里的Trunking Native Mode VLAN字段。两端必须一致。如果不一致,会出现一种诡异现象:一端发的不带标签帧,到另一端被打上了错误的VLAN标签,导致流量跑到别的VLAN去了。
我遇到过一个案例:一端Native VLAN是1,另一端是10。结果VLAN 1的流量到了对端变成了VLAN 10,两个本来隔离的VLAN莫名其妙通了。这种"串VLAN"问题非常隐蔽,因为现象是"能通",但通错了对象,比不通还危险。
5.3 排查第三站:VLAN是否真的创建了
有时候Trunk和Native都没问题,但某个VLAN就是不通。这时候我会查VLAN是否真的创建了。
SW1# show vlan brief确认VLAN 10和20都在列表里,并且对应的Access口已经加入。如果VLAN没创建,端口是加不进去的;如果端口没加入,那个VLAN就没有成员,自然不通。
这里有个细节:VLAN必须在两台交换机上都创建。我见过有人只在SW1上创建了VLAN 10,SW2上忘了创建,结果SW2的Access口根本没法划入VLAN 10,PC3自然不通。所以配置时两台设备的VLAN列表要对照检查。
5.4 排查第四站:端口模式和PVID是否匹配
如果以上都正常,我会查Access口的配置。
SW1# show interfaces gigabitEthernet 0/1 switchport重点看Administrative Mode是不是access,Access Mode VLAN是不是10。如果端口模式错了(比如配成了trunk),或者VLAN号错了,都会导致不通。
还有一种情况是PVID和VLAN不匹配。正常情况下,Access口的PVID会自动跟随switchport access vlan的设置。但如果你手动改过PVID,可能会出现不一致。用show interfaces switchport能看到Native VLAN和Administrative Native VLAN两个字段,确认它们一致。
5.5 一个完整的排错案例复盘
我把上面这套流程串成一个真实案例。某次实验,PC1 ping不通PC3,我的排查过程是这样的:
show interfaces trunk——发现G0/24根本没在Trunk列表里。说明Trunk没起来。- 查两端配置——SW1的G0/24配了trunk,SW2的G0/24配的是access。原来是我在SW2上漏配了。
- 把SW2的G0/24改成trunk,再查——Trunk起来了,但allowed vlan列表里只有10,没有20。
- 补上VLAN 20——再测,PC1能通PC3了,PC2也能通PC4了。
整个过程花了不到五分钟,靠的就是"从链路到VLAN到端口"的逐层排查。如果一上来就瞎改配置,可能越改越乱。所以排错的核心不是记住答案,而是建立一套从底层到上层、从全局到局部的排查顺序。
注意:排错时每次只改一个变量,改完立刻验证。同时改多个地方,即使通了你也不知道是哪个改动起的作用,下次遇到还是不会。
6. 进阶话题:让跨交换机VLAN更稳、更安全的几个实践
基础配置跑通之后,如果你想让这套方案在真实环境里更可靠,还有几个进阶点值得关注。这一章我分享几个我在实际项目中总结的经验。
6.1 用VLAN修剪减少不必要的广播
默认情况下,Trunk口允许所有VLAN通过。但真实网络里,一台接入交换机可能只承载几个VLAN,没必要让所有VLAN的流量都涌过来。这时候可以用VLAN修剪(VLAN Pruning),只允许必要的VLAN通过Trunk。
配置方法就是前面用到的switchport trunk allowed vlan。我建议养成习惯,配Trunk时明确写出允许的VLAN列表,而不是图省事用all。这样做的好处:一是减少广播泛洪,二是降低安全风险,三是让配置意图更清晰,别人接手时一眼就知道这条链路承载哪些业务。
6.2 把Native VLAN改成一个专用VLAN
前面提过,默认Native VLAN是1,而VLAN 1往往被各种协议和管理流量使用,容易成为攻击目标。我的做法是创建一个专门的VLAN(比如VLAN 999),不承载任何业务,专门用作Native VLAN。
SW1(config)# vlan 999 SW1(config-vlan)# name NativeVLAN SW1(config-vlan)# exit SW1(config)# interface gigabitEthernet 0/24 SW1(config-if)# switchport trunk native vlan 999两端都要改,并且保持一致。改完之后,Trunk链路上不带标签的帧就都属于VLAN 999了,和业务VLAN彻底隔离。
6.3 关闭动态协商,手动指定链路类型
有些设备默认开启动态协商协议,会自动把端口协商成Trunk或Access。这在方便的同时也带来风险——如果有人在对面接一台设备恶意协商,可能把本该是Access的口协商成Trunk,从而访问到其他VLAN。
我的建议是关闭动态协商:
SW1(config)# interface gigabitEthernet 0/24 SW1(config-if)# switchport nonegotiate这样端口就完全按手动配置工作,不会被协商改变。代价是两端必须都手动配好,不能靠自动协商。但对于生产环境来说,可控性比便利性更重要。
6.4 跨交换机VLAN与三层互通的衔接
最后说一个延伸点。跨交换机VLAN解决的是二层互通问题,但不同VLAN之间要通信,还需要三层设备(比如路由器或三层交换机)来做VLAN间路由。常见的做法是在三层设备上配置SVI(交换机虚拟接口),每个VLAN一个网关地址。
比如在核心三层交换机上:
Core(config)# interface vlan 10 Core(config-if)# ip address 192.168.10.254 255.255.255.0 Core(config-if)# exit Core(config)# interface vlan 20 Core(config-if)# ip address 192.168.20.254 255.255.255.0这样VLAN 10和VLAN 20的终端就能通过这个三层设备互相通信了。注意,这已经超出了纯二层VLAN的范畴,但它是跨交换机VLAN在真实网络里必然要衔接的下一环。理解了二层怎么通,再理解三层怎么通,整个企业网络的骨架你就搭起来了。
我个人在实际操作中的体会是,跨交换机VLAN看起来只是多配了一条Trunk,但它背后考验的是你对二层转发、标签封装、链路协商这一整套机制的理解。命令可以背,但排错思路背不来,只能靠一次次实验和踩坑积累。建议你在模拟器里把本文的拓扑反复配几遍,然后故意制造几个故障(比如改错Native VLAN、漏配allowed vlan),看看现象是什么,再自己排查。这样练下来,你对VLAN的理解会从"会配"变成"真懂"。