交换机之间通信一旦带上VLAN,问题核心就变成:帧从一台交换机发到另一台交换机时,到底带没带VLAN标签,对端认不认这个标签。很多刚接触网络的人第一次跨交换机配VLAN,容易栽在这些地方:两台交换机用Access口硬连、Trunk口没放行对应VLAN、PVID和本征VLAN对不上。结果经常是PC的IP、掩码、网关全都没问题,但同VLAN就是ping不通,或者不同VLAN反而互相串通。
这个主题适合正在搭办公网、监控网、实验室组网,或者排查跨交换机VLAN不通的人看。最值得先记住的判断是:交换机之间的链路必须是Trunk或者等价的多VLAN承载链路,同一VLAN靠二层透传,不同VLAN必须走三层路由。下面按实际落地顺序拆一遍。
1. 跨交换机VLAN通信的底层逻辑
1.1 Access口和Trunk口的区别要先分清
交换机的端口类型里,Access口和Trunk口是最常用的两种。
Access口一般接终端设备,比如PC、打印机、摄像头、服务器。它只属于一个VLAN,从Access口收到的正常数据帧不做VLAN标记,端口自己的VLAN ID写在PVID里。发送帧给终端时,也会把Tag剥掉,因为普通终端网卡不识别802.1Q头。
Trunk口一般接交换机、路由器、防火墙或者支持多VLAN的服务器网卡。它可以在同一条物理链路上传输多个VLAN的帧。为了实现“多个VLAN跑在一条线缆上”,每个帧必须额外打上4字节的802.1Q Tag,对端交换机看到Tag里的VLAN ID,就知道这个帧属于哪个VLAN。
所以,交换机之间要通多个VLAN,必须用Trunk口。如果只是临时测通一个VLAN,用Access口也可以,但一旦未来要加VLAN,就得重新改物理接口配置,工作量很大。
1.2 为什么VLAN不能只在一台交换机内部生效
很多人的第一个疑问是:我在交换机A上创建了VLAN 10,把接口划进去,交换机B上也创建VLAN 10,把接口划进去,两台交换机用一根网线连起来,为什么VLAN 10的PC还是不通?
因为VLAN是一个“交换机本地概念”。交换机A创建的VLAN 10,本质上是在这台设备内部维护了一张VLAN表和对应的二层转发关系。交换机B的VLAN 10,是另一台设备上的独立配置。两台设备之间默认不会自动交换VLAN注册信息。
要让A上的VLAN 10和B上的VLAN 10组成同一个广播域,必须在两台交换机之间的链路上把VLAN 10放行,并且让带Tag的VLAN 10帧通过。这个任务就是Trunk口干的。
这里的核心结论是:
- 同VLAN跨交换机通信,依赖Trunk链路把带Tag的帧透传过去。
- 不同VLAN跨交换机通信,必须先解决二层透传,再在某个三层设备上做路由。
1.3 PVID、Tag和Native VLAN最容易搞混
Trunk口相关的参数里,PVID、Tag、Native VLAN这三个概念很多人容易绕进去。
PVID的意思是端口默认VLAN ID。当Trunk口收到一个不带Tag的帧时,会把这个帧打成PVID对应的VLAN帧。Trunk口发送不带Tag帧时,也通常用在PVID对应的VLAN上。思科体系里把这种“不打Tag的VLAN”叫Native VLAN,华为、H3C体系里通常直接叫PVID。
默认情况下,Trunk口PVID是VLAN 1。也就是说,VLAN 1的帧在Trunk上是不带Tag的。如果你两台交换机之间Trunk的PVID不一致,收到的不带Tag帧就会被分到不同的VLAN里,轻则通信异常,重则导致环路或广播风暴。
我一般不建议把业务VLAN设成Trunk的PVID。尽量把PVID留在管理VLAN上,比如VLAN 1或者单独的Management VLAN。如果实在要改,两条互联交换机的PVID必须一致。
2. 同VLAN跨交换机互通:配置就三件事
要让两台交换机上的同一个VLAN互通,本质上只需要完成三件事:创建VLAN、把接入端口划进VLAN、把互联端口配成Trunk并放行VLAN。
2.1 先做地址规划和接口规划
拿一个最简单的例子来说。
交换机SW-A和SW-B通过GigabitEthernet0/0/1互联。PC1接在SW-A上,属于VLAN 10,IP是192.168.10.1/24。PC2接在SW-B上,同样属于VLAN 10,IP是192.168.10.2/24。两台PC的网关可以先不管,因为同VLAN二层通信不依赖网关。
设备端口规划可以画成这样:
| 设备 | 接口 | 端口类型 | 所属VLAN | 用途 |
|---|---|---|---|---|
| SW-A | GE0/0/1 | Trunk | 放行VLAN 10、20 | 上联SW-B |
| SW-A | GE0/0/2 | Access | VLAN 10 | 接PC1 |
| SW-B | GE0/0/1 | Trunk | 放行VLAN 10、20 | 上联SW-A |
| SW-B | GE0/0/2 | Access | VLAN 10 | 接PC2 |
我建议第一遍测试只放行VLAN 10。等基础通了,再把VLAN 20加进去。不要一开始就配allow-pass vlan all,容易把不想互通的VLAN也放过去。
2.2 华为、H3C交换机的Trunk配置
华为和H3C的命令在VLAN和Trunk这里基本一致,都以system-view进系统视图。
SW-A上的配置:
system-view vlan batch 10 20 interface GigabitEthernet0/0/1 port link-type trunk port trunk allow-pass vlan 10 20 quit interface GigabitEthernet0/0/2 port link-type access port default vlan 10 quitSW-B上的配置,除了接口名可能不同,命令完全一样:
system-view vlan batch 10 20 interface GigabitEthernet0/0/1 port link-type trunk port trunk allow-pass vlan 10 20 quit interface GigabitEthernet0/0/2 port link-type access port default vlan 10 quit这里有一个容易忽略的点:华为和H3C的Trunk口默认只放行VLAN 1。如果只配置了端口模式为Trunk,没有执行port trunk allow-pass,对端的VLAN 10帧根本过不来。
2.3 思科交换机的Trunk配置
思科体系略有不同,但逻辑一样。以常见的Catalyst系列为例。
configure terminal vlan 10 vlan 20 exit interface GigabitEthernet0/1 switchport mode trunk switchport trunk allowed vlan 10,20 exit interface GigabitEthernet0/2 switchport mode access switchport access vlan 10 exit思科的switchport trunk allowed vlan如果不写,默认允许所有VLAN。这个默认行为比华为激进,容易被忽略。我在接触华为之后再碰思科设备,就曾经因为“以为默认限制”踩过坑。
2.4 验证命令:不能只看up或down
配完配置后,建议按这个顺序验证。
先看端口状态,确认物理链路是UP:
display interface brief再看Trunk口放行情况。华为设备可以用:
display port vlan思科可以用:
show interfaces trunk show interfaces switchport华为还可以直接看VLAN摘要:
display vlan brief如果display int vlan brief这种命令,在二层交换机上通常用来查看VLAN接口和状态。很多人习惯用它,但它更适合看三层VLAN接口是否UP。检查Trunk放行时,display port vlan更直接。
最后在PC1上ping PC2。如果通,再用抓包软件抓一下SW-A和SW-B之间的链路,能看到帧带着802.1Q头,VLAN ID是10。
同VLAN的两台PC能ping通,说明二层透传没有问题。这时候再考虑VLAN间路由。
3. 不同VLAN要通信:路由必须做在边界
3.1 为什么跨VLAN就是不通
两台PC分别属于VLAN 10和VLAN 20,即使它们接在同一台交换机上,默认也ping不通。因为VLAN把广播域隔离了,VLAN 10的广播帧不会进入VLAN 20,VLAN 10的PC不知道自己要访问的主机在哪里设备层MAC地址,必须有网关帮忙。
这个“网关”就是三层设备:三层交换机、路由器或者防火墙。二层交换机本身不做路由,它只负责转发帧。
常见的错误是:有人给PC1配了192.168.10.1,给PC2配了192.168.20.1,然后把它俩接在纯二层交换机上,以为换个IP就能跨VLAN互通。实际上没有三层网关,封装了IP报文也没人帮他路由。
3.2 三层交换机VLANIF:最常用方案
三层交换机在企业网里非常常见。核心思路是给每个VLAN配置一个三层接口,叫VLANIF,相当于这个VLAN的网关。
华为设备配置:
system-view vlan batch 10 20 interface Vlanif10 ip address 192.168.10.254 255.255.255.0 quit interface Vlanif20 ip address 192.168.20.254 255.255.255.0 quitH3C设备命令一样,只是接口名习惯写成interface Vlan-interface 10。
思科是三层交换机时,用SVI:
configure terminal ip routing interface vlan 10 ip address 192.168.10.254 255.255.255.0 exit interface vlan 20 ip address 192.168.20.254 255.255.255.0 exit思科这里有一个很关键的命令ip routing。如果不开启,SVI只是理论上存在,三层转发不生效。这个问题我见过不止一次。
然后PC1的网关指到192.168.10.254,PC2的网关指到192.168.20.254,VLAN 10和VLAN 20之间的互通就走三层交换机完成了。
3.3 路由器子接口:适合小规模组网
如果手头没有三层交换机,只有一台路由器,可以用单臂路由。交换机Trunk口接路由器物理口,路由器在这个物理口上创建多个子接口,每个子接口对应一个VLAN,并封装802.1Q Tag。
以思科路由器为例:
interface GigabitEthernet0/0.10 encapsulation dot1q vlan 10 ip address 192.168.10.254 255.255.255.0 exit interface GigabitEthernet0/0.20 encapsulation dot1q vlan 20 ip address 192.168.20.254 255.255.255.0 exit华为路由器子接口写法有差异:
interface GigabitEthernet0/0/0.10 dot1q termination vid 10 ip address 192.168.10.254 255.255.255.0 arp broadcast enable quit华为子接口默认不能转发ARP广播,必须配arp broadcast enable,否则PC连网关都找不到。这算是华为和思科在子接口上最明显的区别之一。
3.4 路由配置的边界要提前确认
VLAN间路由配置完之后,真正考验人的往往不是命令,而是IP网段规划。举个例子:
- VLAN 10:192.168.10.0/24,网关192.168.10.254
- VLAN 20:192.168.20.0/24,网关192.168.20.254
这个组合很清晰。但如果一开始把VLAN 10和VLAN 20配成了同一个网段,那就没法通过网关区分流量,三层路由根本无从谈起。有人问我“为什么VLAN 20的PC ping不通网关”,我去一看,两台PC配的竟然是同一个网段的IP。这个不是VLAN技术问题,是IP规划问题。
我建议在配VLANIF之前,先列一张表:VLAN ID、网段、网关、用途。确认没有重复网段再接下去。
4. 复杂组网里的Trunk规划:链路聚合、级联和服务器接入
跨两台交换机的场景通了之后,实际网络往往不止两台设备。核心层、汇聚层、接入层串起来的时候,Trunk规划要提前想清楚。
4.1 两条上行链路不要直接配两个Trunk
如果汇聚交换机到核心交换机有两条万兆链路,想着“既然都是Trunk,就让它俩都放行VLAN,流量自动分担”,这是一个危险的想法。普通Trunk不跑STP时,两条二层链路之间会形成环路,广播帧在交换机之间反复转发,直接把CPU打满。
更稳的做法是把两条物理链路加入Eth-Trunk,华为里叫Eth-Trunk,思科里叫Port-Channel。逻辑上变成一个聚合接口,再做Trunk配置。
华为配置示例:
interface Eth-Trunk1 port link-type trunk port trunk allow-pass vlan 10 20 quit interface GigabitEthernet0/0/1 eth-trunk 1 quit interface GigabitEthernet0/0/2 eth-trunk 1 quit思科配置示例:
interface Port-channel1 switchport mode trunk switchport trunk allowed vlan 10,20 exit interface GigabitEthernet0/1 channel-group 1 mode active exit interface GigabitEthernet0/2 channel-group 1 mode active exit链路聚合完成后,物理链路增减都不需要改动业务VLAN配置,可维护性高很多。注意,聚合成员口两边模式要一致,一边是active,另一边建议也是active或者passive,不要一边active一边on。
4.2 多台交换机级联时,VLAN放行要“裁剪”
接入层交换机从汇聚交换机上拿VLAN,常见的做法是把汇聚到核心的Trunk直接放行所有VLAN。这样做省事,但问题也不少:广播域扩大、未知单播泛洪变多、后续排查困难。
更推荐的做法是每台接入交换机只透传自己需要的VLAN。比如接入交换机A只有VLAN 10、20,那上行Trunk就写:
port trunk allow-pass vlan 10 20不要图省事写vlan all。尤其当网络里有监控VLAN、访客VLAN,默认放行会让监控广播包跑到办公交换机上,既浪费带宽,也有一定的数据暴露风险。
4.3 服务器、虚拟机和容器怎么接入Trunk
Trunk不只是交换机对交换机才用。服务器上如果装了虚拟机,虚拟机又分了多个业务VLAN,服务器的物理网卡也应该以Trunk模式接交换机。服务器上通过虚拟网卡或子接口配置对应VLAN Tag,交换机放行对应VLAN,两边才能对上。
容器网络里如果用了Multus之类的多网卡方案,给Pod附加VLAN网卡,逻辑也一样:上游交换机端口放行对应VLAN,主机侧网络接口能识别和转发带Tag的帧。不过容器场景额外牵扯CNI、路由策略和命名空间,排查时先要分清哪一层是二层Trunk,哪一层是三层路由。
GVRP这种自动VLAN注册协议,可以在多台交换机之间自动同步VLAN信息,减少手工创建。但我不建议一上来就开。GVRP只会传递VLAN编号,不会自动帮你规划网段,也不会自动配置VLANIF。设备数量少时,手工配置更可控;设备数量多时,优先考虑自动化下发,而不是依赖GVRP把VLAN表“广播”出去。
5. 跨交换机VLAN不通?按这个顺序排查
跨交换机VLAN不通的现象,比配置本身更值得专门写一遍。很多问题看起来复杂,真正定位后就那么几个原因。
5.1 先看物理链路和端口状态
不管报错多奇怪,先确认两端接口都是UP。
display interface brief如果对端接口是DOWN,后面的VLAN配置全是白搭。常见原因包括网线松动、光模块兼容问题、对端设备没开机、接口被shutdown。
还有一种情况是两端速率协商不匹配,端口一直Down或者反复Up/Down,VLAN配置再对也没用。
5.2 再看端口类型和VLAN放行列表
物理链路正常,但同VLAN还是不通,第二步查端口类型。
华为查看:
display port vlan思科查看:
show interfaces trunk show interfaces status重点检查三点:
- 互联口是否配成了Trunk。
- Trunk口是否放行了目标VLAN。
- 接入侧PC端口是否划到了正确VLAN。
如果一边是Trunk,另一边是Access,目标VLAN可能根本传不过去。华为设备有些接口默认是Hybrid类型,也能放行多个VLAN,但Tag行为和Trunk不一样。如果对端用的是Cisco或别的品牌,建议把互联口固定成Trunk,减少理解偏差。
5.3 检查PVID和本征VLAN是否一致
端口类型和放行列表都正常,仍然有怪异现象,比如VLAN 1通但VLAN 10不通,或者出现广播风暴,重点查Trunk两端的PVID。
华为、H3C设备查看Trunk口PVID,display port vlan里能直接看到。思科用show interfaces trunk看Native VLAN。
两端PVID一定要一致。比如一端PVID是1,另一端PVID是10,那么不带Tag的帧会在对端被错误划分。轻则管理报文乱跳VLAN,重则产生广播环路。
5.4 最后查STP和抓包
上述都没问题,但还是不通,别急着改配置。先看生成树状态。
display stp brief如果端口一直处于Learning或者Blocking状态,VLAN帧虽然能被Trunk放行,但STP在等待收敛,不会转发数据。这时候要确认是不是网络里出现了物理环路,或者STP优先级配置不合理。
如果STP也正常,最后一步抓包。在Trunk链路上抓包,看PC1发出的ICMP请求帧是否带有正确的802.1Q Tag,目标VLAN ID是不是预期的数字。
抓包能直接区分两种问题:
- 帧没到:说明放行、端口类型或物理链路有问题。
- 帧到了但有去无回:说明对端交换机或终端没有正确处理Tag。
我排查跨交换机VLAN故障时,最常用的一套顺序就是:端口状态、端口类型、VLAN放行表、PVID、STP、抓包。不要一上来就怀疑Palace模型、不要急着重配VLAN。先把两边配置导出来对比,往往一眼就能发现问题。
跨交换机VLAN通信这个事,真正落地时最该盯住的不是新功能,而是两侧配置是否对称。我一般会把每台交换机的VLAN表、Trunk放行列表、PVID单独列成一张表,哪个口接哪台设备、放行哪些VLAN、PVID是多少,全部写清楚。等网络规模变大,这张表比记忆可靠得多。如果你正在改两台交换机的Trunk,建议先让同VLAN小流量跑通,再考虑VLAN间路由、链路聚合和服务器接入。基础链路稳了,上面的路由和策略才谈得上。