这次我们来看一个非常高频的网络需求:两台交换机之间要做通信,但网络里划分了 VLAN,结果同一 VLAN 的 PC 跨交换机 ping 不通,不同 VLAN 的 PC 又不能互相访问。这个问题在初学者做实验、企业内部组网、园区网维护中经常遇到。这篇文章按“同 VLAN 跨交换机”“不同 VLAN 间互访”两条主线,把链路类型、标签转发、华为/思科/锐捷/华三常用配置、eNSP 模拟验证、常见排查手段一次说清楚。
先给出结论:交换机之间带 VLAN 通信,核心就两件事。第一,两台交换机互联的端口要允许相关 VLAN 的报文通过,通常用 Trunk 链路。第二,如果还要实现不同 VLAN 之间互相访问,就必须引入三层转发,要么用路由器做单臂路由,要么用三层交换机划 VLANIF 接口。下面逐步展开。
1. 交换机间 VLAN 通信核心概念速览
先看一张速览表,把链路类型、端口角色、报文特征讲清楚。
| 项目 | 说明 |
|---|---|
| VLAN 标准 | IEEE 802.1Q,报文头中增加 4 字节 Tag 字段,其中 VLAN ID 占 12 bit |
| VLAN ID 范围 | 可用配置一般是 1 到 4094,VLAN 1 通常是系统默认 VLAN |
| Access 口 | 用于连接终端设备,发出的报文不带 Tag,收到带 Tag 报文时会处理本地归属 |
| Trunk 口 | 用于交换机之间或交换机与路由器之间,允许特定 VLAN 的报文带 Tag 穿越 |
| Hybrid 口 | 华为特有模式,可以同时以 Tagged/Untagged 方式加入多个 VLAN |
| 同 VLAN 跨交换机 | 交换机互联口配置 Trunk,并 allow-pass 对应 VLAN |
| 不同 VLAN 间互访 | 需要三层转发:单臂路由或三层交换机 VLANIF |
| 默认 PVID | 华为/思科/锐捷/华三多数默认 PVID 和本征 VLAN 都是 1 |
这里需要强调一个细节:VLAN 划分解决的是二层隔离问题。同一个业务 VLAN 内的 PC 要跨交换机通信,靠的是 Trunk 链路把带 802.1Q Tag 的帧从一台交换机送到另一台交换机。而不同 VLAN 本质上是不同的二层广播域,跨 VLAN 通信必须走到三层。
2. 同 VLAN 跨交换机通信:Trunk 链路就够了
场景 1 是:交换机 SW-A 和 SW-B 通过某个端口互联,PC-A 接在 SW-A 的 VLAN 10 端口,PC-B 接在 SW-B 的 VLAN 10 端口,PC-A 要可以 ping 通 PC-B。
这里 PC-A 发出的帧进入 SW-A 的 Access 口,SW-A 会为这个帧打上 VLAN 10 的 Tag。SW-A 的 Trunk 口允许 VLAN 10 通过,这个带 Tag 的帧被从 Trunk 口发出去。SW-B 的 Trunk 口收到这个带 VLAN 10 Tag 的帧,看到允许列表里有 VLAN 10,就会把帧转发到 SW-B 上同样是 VLAN 10 的 Access 口。PC-B 收到时,帧的 Tag 已经被剥离。
这个过程必须满足两个条件。第一,两台交换机互联端口必须都是 Trunk 类型。第二,Trunk 口允许列表中必须包含 VLAN 10。很多“同 VLAN 跨交换机不通”的故障,就是 Trunk 口没有 allow-pass vlan 10,或者互联端口是 Access 口,Tag 在链路上丢失或无法正确识别。
华为交换机上的基础配置如下,SW-A 和 SW-B 都要配。
# SW-A 配置 system-view vlan batch 10 20 interface GigabitEthernet0/0/1 port link-type access port default vlan 10 quit interface GigabitEthernet0/0/3 port link-type trunk port trunk allow-pass vlan 10 20 quit这里把 VLAN 10 和 VLAN 20 都放行,模拟真实建设中可能有多个业务 VLAN 共用这条互联链路。SW-B 的配置与 SW-A 结构相同,只是用不同接口接 PC-B。
配置完成后,可以在 SW-A 上执行display port vlan来查看 Trunk 口放行了哪些 VLAN。
[SW-A] display port vlan Port Link Type PVID Trunk/Vlan List GigabitEthernet0/0/1 access 10 - GigabitEthernet0/0/3 trunk 1 1 10 20从输出可以看到,Trunk 口的 PVID 还是默认的 1,放行列表里已经有 VLAN 10 和 VLAN 20。同 VLAN 跨交换机通信,看到这样的输出就表示配置基本正常。
3. 不同 VLAN 间通信:单臂路由与三层交换
场景 2 是更常见的需求。PC-A 在 VLAN 10,IP 是 10.0.10.1/24,网关是 10.0.10.254。PC-B 在 VLAN 20,IP 是 10.0.20.1/24,网关是 10.0.20.254。要求 PC-A 能访问 PC-B。这时不能再靠 Trunk 链路本身了,需要三层设备。
第一种方式是单臂路由。把路由器的一个物理口接到交换机的 Trunk 口,在这个物理口上创建两个子接口,分别对应 VLAN 10 和 VLAN 20,并为每个子接口配置不同网段的网关地址。
华为路由器的典型配置:
# 路由器 AR1 配置 system-view interface GigabitEthernet0/0/0.10 dot1q termination vid 10 ip address 10.0.10.254 24 arp broadcast enable quit interface GigabitEthernet0/0/0.20 dot1q termination vid 20 ip address 10.0.20.254 24 arp broadcast enable quit交换机侧连接路由器的接口需要配成 Trunk,并放行 VLAN 10、20。PC 的网关分别指向 10.0.10.254 和 10.0.20.254。这样 VLAN 10 的报文到达路由器的子接口 .10,路由器查路由表后从子接口 .20 转发出去,在 Trunk 链路上重新打上 VLAN 20 的 Tag。
第二种方式是用三层交换机。这也是当前企业园区网最常见的做法。三层交换机的 VLANIF 接口本身就是三层网关,不需要单独接路由器。
华为三层交换机配置:
# SW-C 作为核心/汇聚交换机 system-view vlan batch 10 20 interface vlanif 10 ip address 10.0.10.254 24 quit interface vlanif 20 ip address 10.0.20.254 24 quit interface GigabitEthernet0/0/1 port link-type access port default vlan 10 quit interface GigabitEthernet0/0/2 port link-type access port default vlan 20 quit配置完成后可以在交换机上执行display ip interface brief,看到 Vlanif10 和 Vlanif20 都已经 Up,并且有 IP 地址。PC-A ping PC-B 时,目的 IP 不在同一网段,报文先发给网关 10.0.10.254,也就是 Vlanif10;三层交换机查路由后,从 Vlanif20 转发给 PC-B。
三层交换相比单臂路由,硬件转发效率更高,网关就在交换机内部,不需要额外采购路由器,故障点也更少。缺点是必须在支持三层功能的交换机上配置,纯二层交换机配不了 VLANIF。
4. 华为交换机实操:在 eNSP 中配置跨交换机 VLAN 网络
如果不想搬两台真实交换机,可以在华为官方模拟器 eNSP 里搭拓扑快速验证。这里给一套完整验证流程。
4.1 拓扑规划
- SW-A 和 SW-B 是二层交换机,用 GE0/0/3 互联。
- PC-A 接 SW-A 的 GE0/0/1,属于 VLAN 10。
- PC-B 接 SW-B 的 GE0/0/1,属于 VLAN 10。
- SW-A 和 SW-B 互联端口为 Trunk,允许 VLAN 10 通过。
4.2 搭建步骤
- 打开 eNSP,新建拓扑,拖入两台 S5700 交换机、两台 PC。
- 用网线连接:PC-A 连 SW-A GE0/0/1,PC-B 连 SW-B GE0/0/1,SW-A GE0/0/3 连 SW-B GE0/0/3。
- 启动所有设备,先完成 PC 的 IP 配置。
- 在 SW-A 和 SW-B 上分别配置 VLAN 和 Trunk。
- 在 PC 上执行 ping 测试。
PC 的 IP 配置参考如下。
| 设备 | IPv4 地址 | 子网掩码 | 网关 |
|---|---|---|---|
| PC-A | 10.0.10.1 | 255.255.255.0 | 10.0.10.254 |
| PC-B | 10.0.10.2 | 255.255.255.0 | 10.0.10.254 |
如果是纯二层 VLAN 场景,PC 的网关可以先不填,因为验证目标是同 VLAN 内的二层互通。如果后续要模拟 VLAN 间互访,就把网关填成对应网段的 VLANIF 地址。
4.3 交换机完整配置
SW-A 和 SW-B 的配置如下,另一台交换机只需要把sysname改成 SW-B,接入 PC 的接口改成自己的接口编号。
system-view sysname SW-A vlan batch 10 20 interface GigabitEthernet0/0/1 port link-type access port default vlan 10 quit interface GigabitEthernet0/0/3 port link-type trunk port trunk allow-pass vlan 10 20 quit4.4 验证结果
配置完成后,从 PC-A ping PC-B,预期会看到类似下面的回显。
PC> ping 10.0.10.2 Ping 10.0.10.2: 32 data bytes, Press Ctrl_C to break From 10.0.10.2: bytes=32 seq=1 ttl=128 time=16 ms From 10.0.10.2: bytes=32 seq=2 ttl=128 time=16 ms能收到响应,说明 Trunk 链路已经正常学习 MAC 地址,VLAN 10 的帧可以跨交换机转发。如果 ping 不通,先在交换机上执行display mac-address,看两台 PC 的 MAC 是否已经被学习到。
display mac-address正常情况下,除了 SW-A 本端端口连接的 PC 之外,还能看到通过 Trunk 口学习到的远端 PC MAC 地址,且 VLAN 都是 10。
5. 思科、锐捷、华三配置命令对比
实际项目中会遇到多个厂商设备混用。虽然 802.1Q 是公共标准,但不同厂商的命令风格有明显差异。这里对比四个常见品牌的 Trunk 配置。
华为:
interface GigabitEthernet0/0/3 port link-type trunk port trunk allow-pass vlan 10 20华三(H3C):
interface GigabitEthernet1/0/3 port link-type trunk port trunk permit vlan 10 20思科:
interface GigabitEthernet0/3 switchport mode trunk switchport trunk allowed vlan 10,20锐捷:
interface GigabitEthernet 0/3 switchport mode trunk switchport trunk allowed vlan 10,20从对比可以看到,华为和华三都使用link-type命令设置端口模式,思科和锐捷则使用switchport mode命令。在放行 VLAN 列表方面,华为用allow-pass vlan,华三用permit vlan,思科和锐捷用allowed vlan。
差异点整理成一张表。
| 功能 | 华为 | 华三 | 思科 | 锐捷 |
|---|---|---|---|---|
| 配置端口模式 | port link-type trunk | port link-type trunk | switchport mode trunk | switchport mode trunk |
| 放行 VLAN | port trunk allow-pass vlan 10 20 | port trunk permit vlan 10 20 | switchport trunk allowed vlan 10,20 | switchport trunk allowed vlan 10,20 |
| 配置 Access VLAN | port default vlan 10 | port access vlan 10 | switchport access vlan 10 | switchport access vlan 10 |
| 查看接口 VLAN 信息 | display port vlan | display port vlan | show interfaces trunk | show interfaces switchport |
这些命令在交换机的常见版本上基本通用,但不同型号和系统版本之间可能存在细微差异。生产环境变更前,最好先在模拟器或测试交换机上确认命令语法。
6. 远程管理与批量配置脚本
当交换机数量多起来之后,逐个通过 Console 口配置效率太低。常见做法是给交换机配置管理 IP,开启 SSH,再用脚本批量下发配置或备份配置。
华为交换机开启 SSH 的基础配置思路如下。
system-view sysname SW-A ssh server enable interface vlanif 10 ip address 10.0.10.254 24 quit stelnet server enable aaa local-user admin password cipher Admin@123 local-user admin privilege level 15 local-user admin service-type ssh quit user-interface vty 0 4 authentication-mode aaa protocol inbound ssh quit这里需要特别提醒,任何生产设备上配置管理账号时,必须修改成强密码,并限制管理网段访问。不要把示例里的密码直接用于现网。安全基线一般要求通过 ACL 限制 VTY 的访问源,只允许运维网段连接。如果设备登录密码遗失,不要自行尝试非官方恢复手段,应联系厂商技术支持,避免触发设备安全机制。
如果你需要批量备份多台华为交换机配置,可以使用 Python 的 netmiko 库写一个通用脚本。下面是一个最小可运行的示例脚本框架,实际使用时需要按网络环境替换设备 IP、账号密码和命令。
from netmiko import ConnectHandler devices = [ { "device_type": "huawei", "host": "192.168.10.1", "username": "admin", "password": "YourPassword", "secret": "", }, { "device_type": "huawei", "host": "192.168.10.2", "username": "admin", "password": "YourPassword", "secret": "", }, ] COMMANDS = ["display current-configuration"] for device in devices: conn = ConnectHandler(**device) output = conn.send_command("display current-configuration") with open(f"backup_{device['host']}.txt", "w", encoding="utf-8") as f: f.write(output) print(f"backup {device['host']} done") conn.disconnect()这个脚本会把每台交换机的 running-config 保存到本地文件。批量下发配置时,把send_command改成send_config_set,并传入一个命令列表即可。netmiko 需要单独安装,执行pip install netmiko。
建议在测试环境先对一台设备跑通,确认账号权限和命令输出正常,再扩展到批量任务。批量任务一定要加日志和异常重试机制,避免中途某一台设备连接超时导致整个脚本中断。
7. VLAN 间通信的进阶:PVID 一致性与三层网关
前面的场景是同 VLAN 跨交换机,以及不同 VLAN 互访。实际项目里还有一个高频需求:两台不同厂商的交换机,一边划分了 VLAN 10,另一边要把接到 VLAN 10 的流量送到三层网关做路由。这时需要关注 Trunk 口的 PVID 是否一致。
PVID 是端口默认 VLAN。华为和思科默认 PVID 都是 1。Trunk 口在发送 PVID 对应 VLAN 的报文时不打 Tag,接收没有 Tag 的报文时会把报文归入 PVID 对应的 VLAN。如果两端的 PVID 不一致,可能出现“帧进来后 VLAN 归属变了”的诡异故障。
例如 SW-A 的 Trunk 口 PVID 是 1,SW-B 的 Trunk 口 PVID 是 10。SW-A 发送不带 Tag 的本征 VLAN 1 流量时,SW-B 会把这些帧当作 VLAN 10 的流量处理。如果 SW-B 上 VLAN 10 存在,流量可能仍然能通,但语义已经错误;如果 SW-B 没有 VLAN 10,报文会被丢弃。
建议在实际配置中,将互联 Trunk 口的 PVID 统一规划好。除非有特殊互联需求,一般建议保持 PVID 为默认 VLAN 1,或者统一改为某个互联专用 VLAN,并保持两端一致。
三层网关方面,更深入的配置还包括 DHCP 中继、基于 VLAN 的 DHCP 服务器绑定、VLAN 接口的 ACL 策略等。热词中提到的“基于 VLAN 的 IPSG 组网”也是这个范畴。IPSG(IP Source Guard)可以基于端口或 VLAN 绑定 IP 和 MAC 地址,防止终端私自修改 IP 后仿冒其他终端。若要启用,可以在接入端口下绑定终端的 IP 与 MAC:
# 在 VLAN 10 的接入端口下绑定终端的 IP 和 MAC interface GigabitEthernet0/0/1 port link-type access port default vlan 10 ip source check user-bind ip-address 10.0.10.1 mac-address 00e0-fc00-0001这种配置适合对 IP 盗用、地址欺骗有严格管控要求的园区网络。但需要注意,启用 IPSG 后,终端换网卡、换 IP 都会导致断网,运维时要同步维护地址绑定表。
8. 常见问题与排查方法
这一节把最常见的故障现象和排查步骤列出来。核心排查思路是:先查两层,再查三层。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| 同 VLAN 跨交换机 ping 不通 | Trunk 口未 allow-pass 对应 VLAN | display port vlan 查看放行列表 | 在 Trunk 口添加对应 VLAN |
| 同 VLAN 跨交换机 ping 不通 | 两台交换机互联口不是 Trunk | display interface 查看链路类型 | 将互联口配置为 Trunk |
| PC 能 ping 通网关但跨 VLAN 不通 | 三层设备未配置 VLANIF 或路由 | display ip interface brief | 配置 vlanif 或单臂路由子接口 |
| PC 访问本网段不通 | Access 口 VLAN 归属错误 | display vlan 查看端口归属 | 重新调整端口 default vlan |
| 某些终端能通,某些不通 | PVID 不一致或 MAC 表异常 | 查看两端 Trunk 口 PVID | 统一 PVID |
| DHCP 拿不到地址 | DHCP 服务器在其他 VLAN,未配置中继 | 检查 vlanif 下是否有 dhcp select relay | 配置 DHCP Relay |
| 启用 IPSG 后终端断网 | IP/MAC 绑定关系过期或配置错误 | display dhcp static user-bind all | 更新绑定表 |
| 无法 SSH 到交换机管理 | VTY 未开启 SSH 传入协议 | 检查 VTY 配置和 ACL 限制 | 开启 SSH 并配置 AAA |
更具体一点的排查步骤。
第一步,先从 PC 上确认 IP 配置。终端 IP、掩码、网关是否在同一网段。很多“交换机配置错了”的问题,源头其实是 PC 配置不对。
第二步,用display vlan和display port vlan检查交换机的 VLAN 划分和端口放行列表。重点看互联 Trunk 口是否包含所有需要跨交换机通信的 VLAN。
第三步,用display mac-address查看 MAC 表。同 VLAN 跨交换机通信不通,很多时候是远端 MAC 没有学习到。
第四步,如果二层通,但不同 VLAN 之间 ping 不通,进入三层检查。在交换机上执行:
display ip routing-table看有没有到达对方网段的路由。如果是三层交换机 VLANIF,应该能看到直连路由;如果是单臂路由,则检查路由器子接口配置是否正确,VLAN 封装是否匹配。
第五步,检查 PVID 和 Tag。如果使用 Wireshark 在链路上抓包,重点看帧里有没有 802.1Q Tag。交换机之间 Trunk 链路上,VLAN 10 和 VLAN 20 的帧应带 Tag。如果看到本应带 Tag 的帧没有 Tag,可能就是 PVID 设置导致的。
9. 最佳实践与使用建议
从实际组网经验看,交换机之间的 VLAN 通信配置虽然入门门槛不高,但要想稳定运行,建议养成这几个习惯。
第一,VLAN 规划先行。互联网段、业务网段、管理网段分开规划,VLAN ID 编号规则要统一。例如管理 VLAN 100,办公 VLAN 10,业务 VLAN 20,视频监控 VLAN 30。避免临时起意随便分配 VLAN ID。
第二,Trunk 放行列表遵循最小化原则。Trunk 口只放行互联需要的 VLAN,不要把所有 VLAN 都放行。这样能降低广播流量和环路风险。
第三,统一 Trunk 口 PVID。互联的两台交换机 Trunk 口 PVID 建议保持一致,一般就用默认 VLAN 1,或者统一设置一个互联专用 VLAN。不要在一条链路上出现一端 PVID 是 1、另一端 PVID 是 10 的情况。
第四,管理面与业务面隔离。给交换机配置管理 IP 时,尽量使用独立的管理 VLAN,并通过 ACL 限制只有运维网段可以 SSH/Telnet 登录。示例中的 admin 账号密码,应替换为符合安全策略的强密码。
第五,涉及生产网络变更时,先做备份。批量备份配置,确认成功后再在非业务窗口执行变更。前面给的 Python 脚本框架稍加修改,就可以变成“批量备份工具”,建议提前部署。
第六,合规与授权边界。所有交换机的配置实验和变更,都应在自己拥有或获得明确授权的设备、模拟器或测试环境内进行。不要对未授权的网络设备进行扫描、密码猜测或配置篡改。企业网络中的地址绑定、IPSG、ACL 等安全策略,应结合本单位的网络数据安全和隐私保护要求来实施。
第七,优先使用模拟器验证。eNSP、Packet Tracer、GNS3 都是很好的实验环境。真实项目碰到复杂拓扑,先在模拟器里把配置和验证流程过一遍,再上真机,能省掉大量排障时间。
10. 总结与下一步
这篇文章围绕“交换机之间的通信带 VLAN 的情况”把几个关键链路串了一遍。同 VLAN 跨交换机通信的要点是 Trunk 链路和放行列表;不同 VLAN 间互访的要点是三层转发,可以用单臂路由或三层交换机 VLANIF;厂商命令虽然风格不同,但底层都是 802.1Q 标准,本质逻辑一致。
对于一个刚开始接触 VLAN 和交换机间通信的读者,我建议先在 eNSP 里搭两台交换机,配置 Access 口接 PC、Trunk 口互联,完成同 VLAN 跨交换机互通测试;再加入一台路由器或三层交换机,把单臂路由和 VLANIF 两种 VLAN 间互访方式都跑通。下一步可以继续扩展到 DHCP 中继、VLAN 网关冗余、基于 VLAN 的 IPSG 组网,以及基于 Python 的批量配置和备份。
最容易踩的坑往往不在配置命令本身,而是对 Trunk 链路 Tag 处理逻辑的理解。花时间在模拟器里抓一次包,看一下 VLAN 标签怎么打、怎么剥离,会比死记命令更容易解决实际问题。建议收藏备用,下次遇到跨交换机 VLAN 不通时,直接按“先端口模式、再放行列表、再 MAC 表、再路由表”的顺序排查。