4. VLAN与Trunk协议解码:802.1Q标签、VLAN间路由故障分析
VLAN这东西,说白了就是把一个物理交换机切成几个独立的逻辑网络。做网络排障这么多年,我见过太多因为VLAN配置不当导致的“通一半”故障了。这章咱们就聊聊802.1Q标签怎么工作的,以及VLAN间路由出问题时该怎么下手。
4.1 802.1Q标签——VLAN的“身份证”
一台交换机上划分了VLAN 10和VLAN 20,两个VLAN内的主机能互通吗?不能。因为交换机端口默认只属于一个VLAN,数据帧只在同VLAN内转发。那如果两台交换机都想传多个VLAN的数据呢?这就得靠Trunk链路和802.1Q标签了。
802.1Q标签插在以太网帧的源MAC地址和类型/长度字段之间。样子是这样的:
前导码 | 目标MAC | 源MAC | 802.1Q标签(4字节) | 类型/长度 | 数据 | FCS
这个4字节标签里,最关键的是12比特的VLAN ID。也就是说,理论上VLAN ID范围是0-4095,但0和4095保留,实际可用范围是1-4094。
关键点:802.1Q标签只在Trunk链路上存在。接入端口(Access Port)发出的帧不带标签,收帧时如果收到带标签的帧,一般会丢弃——除非配置了特殊模式。
我在项目里遇到过一个问题:两台交换机之间明明配了Trunk,但VLAN 100的主机就是ping不通对端。抓包一看,Trunk链路上的帧根本没带VLAN 100的标签。后来发现,对端交换机的Trunk端口忘了允许VLAN 100通过。嗯,这种低级错误其实很常见。
4.2 PVID与Native VLAN——最容易踩的坑
每个Trunk端口都有一个PVID(Port VLAN ID)。默认情况下,PVID是1。如果一个帧从Trunk口进入时没带标签,交换机会给它打上PVID对应的标签。这个“没标签的帧”走的就是Native VLAN。
这里有个很经典的故障场景:两端的Native VLAN不匹配。
| 设备 | 配置 | 结果 |
|---|---|---|
| SwitchA Trunk口 | Native VLAN 1 | 正常 |
| SwitchB Trunk口 | Native VLAN 10 | 帧被错误地划分到VLAN 10 |
你想想看,SwitchA发一个不带标签的帧,SwitchB收到后,按自己的PVID打了VLAN 10的标签。这个帧就跑到VLAN 10里去了。如果VLAN 10和VLAN 1不在同一个广播域,这帧就丢了。更危险的是,像CDP、VTP、STP BPDU这类控制协议,通常都走Native VLAN。一旦两端Native VLAN不一致,控制协议都可能出问题。
避坑指南:我曾经排过一个诡异故障——两台交换机之间偶尔丢包,查了三天没找到原因。最后发现,施工方把一端Trunk的Native VLAN改成了99,另一端默认是1。两边的控制协议互通有问题,导致STP拓扑一直震荡。从那以后,我要求团队所有Trunk口的Native VLAN必须明确配置,并且两端保持一致。
4.3 VLAN间路由——为什么能ping通网关但上不了网?
VLAN隔离了广播域,但不同VLAN之间总得通信吧。常见方案有三种:
- 路由器单臂路由(Router-on-a-Stick)
- 三层交换机VLANIF接口
- 使用防火墙/NAT设备做路由
咱们重点聊前两种,因为95%的企业网都在用。
4.3.1 单臂路由的故障点
单臂路由就是路由器用一个物理接口接交换机Trunk口,然后在这个物理口上创建多个子接口,每个子接口对应一个VLAN。配置大致长这样:
interface GigabitEthernet0/0.10
encapsulation dot1Q 10
ip address 192.168.10.1 255.255.255.0
interface GigabitEthernet0/0.20
encapsulation dot1Q 20
ip address 192.168.20.1 255.255.255.0
这里容易犯的错有三个:
第一,子接口的封装VLAN ID和交换机上对应的VLAN ID不一致。
第二,路由器上没写回程路由——主机能ping通网关,但网关不知道怎么把回应包送回主机?不对,网关就在直连网段,不需要路由。但如果是跨网段访问,比如VLAN 10的主机要访问VLAN 20的主机,路由器必须知道两个网段都在自己直连子接口上。这点倒没问题,因为直连路由会自动生成。问题往往出在:
第三,交换机上Trunk口没允许对应的VLAN通过。
排查技巧:我建议你在Trunk链路两端同时抓包。一端能收到带标签的帧,另一端收不到,那肯定是Trunk允许列表或Native VLAN的问题。如果两端都能收到,但主机不通,就查路由表和ARP表。我曾经用这个方法,十分钟就定位了一个折腾了两天的“单臂路由不通”问题。
4.3.2 三层交换机VLANIF接口
三层交换机把路由功能集成到硬件里,性能比单臂路由好很多。配置上就是启用VLANIF接口:
interface Vlanif10
ip address 192.168.10.254 255.255.255.0
interface Vlanif20
ip address 192.168.20.254 255.255.255.0
然后配上IP routing(有些设备默认开,有些需要主动开)。看起来很完美,但现实中出问题的地方往往是:
- 主机配置的网关地址和VLANIF接口地址不一致
- VLANIF接口没起来(对应的VLAN内必须至少有一个Access口是UP的)
- 三层交换机关闭了IP routing功能
- 访问控制列表(ACL)挡住了跨VLAN流量
我记得有一次,某公司新上了一台三层交换机,VLAN 10和VLAN 20的VLANIF接口都配好了IP,主机也能ping通自己的网关,但就是不能跨VLAN通信。查配置查了半天,最后发现默认ACL规则是deny any。嗯,很多厂商的设备默认配置就有这种“安全陷阱”。
4.4 VLAN间路由故障排查流程
说白了,遇到VLAN间不通,按这个顺序查,基本不会漏:
- 物理层:链路是否UP?光模块/电口是否正常?
- Trunk配置:两端Trunk口是否都配了?允许的VLAN列表是否一致?Native VLAN是否匹配?
- VLAN存在性:交换机上是否创建了对应VLAN?VLAN内是否有活跃端口?
- 网关配置:VLANIF接口或路由器子接口的IP、掩码是否和主机网关一致?接口是否UP?
- 路由表:三层设备上是否有到目标网段的路由?是否是直连路由?
- ARP表:网关是否能解析到主机的MAC地址?主机是否能解析到网关的MAC?
- ACL/防火墙:有没有策略拦截了跨VLAN流量?
这个流程我用了快十年,从来没失手过。你按这个走一遍,95%的VLAN间路由问题都能找到根因。
注意:有些傻瓜式交换机(即非网管交换机)不支持VLAN和Trunk。如果你在企业网里发现所有端口都在同一个广播域,先确认交换机是不是网管型的。我曾经被一台傻瓜交换机坑过,以为它默认所有端口都在VLAN 1,结果它根本不处理802.1Q标签,直接把带标签的帧当非法帧丢了。
下面这张图梳理了VLAN间路由的核心逻辑和常见故障点,你可以留着当备忘:
这张图把VLAN间路由的要素都串起来了。PC-A(VLAN 10)和PC-B(VLAN 20)都在接入层,交换机通过Trunk把两个VLAN的帧送到三层处理单元(可以是外挂路由器,也可以是三层交换机的VLANIF接口)。三层单元做完路由后,再把帧打上对应VLAN的标签发回去。哪个环节断了,通信就出问题。
对了,我再说个真实案例。有一次客户报障,说VLAN 10能ping通VLAN 20的网关,但ping不通VLAN 20里的主机。我一听就知道,问题出在路由回程上。果然,VLAN 20的主机网关配错了,配成了192.168.20.254,但VLANIF 20的地址是192.168.20.1。主机发出的回应包,目标MAC是192.168.20.254,但交换机上根本没这地址,包就丢了。嗯,这种“配错网关”的故障,撑起了我排障工作的三分之一。
一句话总结:VLAN间路由的核心是“标签打得对,路由走得通,ARP解得准”。802.1Q标签保证帧去的了正确VLAN,路由表保证包找得到目标网段,ARP表保证下一跳能送到正确MAC。三者缺一不可。