1. 从一个真实翻车现场说起:为什么VLAN间就是ping不通
刚入行那会儿,我在一个模拟项目里搭了一套挺像样的交换网络:两台接入交换机、一台核心交换机,按部门划了三个VLAN,地址段规划得整整齐齐。PC配好IP,网线插上,同VLAN内互相ping,通得干干净净。我当时心想,这活儿稳了。
结果跨部门测试的时候,全挂。A部门的机器ping B部门的机器,请求超时,一个包都回不来。我第一反应是物理链路问题,换线、换口、重启设备,折腾了快两个小时,最后才反应过来一个最基础的事实:VLAN在二层是天然隔离的,不同VLAN之间根本不在同一个广播域里,你不给它一条三层转发路径,它凭什么通?
这就是VLAN间路由要解决的核心问题。说白了,交换机划分VLAN是为了隔离,但隔离之后总得让该通信的VLAN能互相访问,否则网络就成了一个个孤岛。实现这个"跨岛通信"的主流方案有两种:单臂路由和三层交换机SVI路由。前者用一台路由器加一条物理链路搞定,后者靠三层交换机的虚拟接口直接转发。
这篇内容我打算把这两种方案从原理到配置、从选型到排错,一次性讲透。适合刚接触VLAN、被跨网段通信卡住的朋友,也适合想系统梳理一遍的老手。我会用模拟环境里的实际配置来演示,参数怎么算、命令为什么这么写、坑在哪里,全部摊开讲。
2. 先把底层逻辑捋清楚:VLAN间路由到底在解决什么
2.1 二层隔离与三层转发的本质矛盾
要理解VLAN间路由,得先接受一个前提:VLAN是二层概念,路由是三层概念,两者天生不在一个维度上。
交换机划分VLAN之后,每个VLAN是一个独立的广播域。VLAN 10里的广播帧不会泛洪到VLAN 20,这是隔离带来的好处——减少广播风暴、提升安全性。但代价就是,VLAN 10的主机想访问VLAN 20的主机,它发出的数据帧在二层根本找不到出路,因为目的MAC不在自己的广播域内。
这时候主机怎么办?它会查自己的路由表,发现目的IP不在本地网段,于是把包发给网关。网关这个角色,就是三层设备(路由器或三层交换机)在某个VLAN里的接口地址。主机把帧发给网关的MAC,网关收到后拆开看三层目的IP,查路由表,再从对应VLAN的接口把包转发出去。
所以VLAN间路由的本质就一句话:让三层设备同时"站"在多个VLAN里,每个VLAN给它一个接口地址当网关,它负责在这些接口之间转发数据。
2.2 两种实现路径的分野
理解了上面那句话,两种方案的差异就清楚了。
单臂路由的思路是:路由器物理接口不够用(或者不想每个VLAN占一个物理口),那就用一条物理链路,在上面划多个子接口,每个子接口对应一个VLAN,配上网关地址。这条链路对交换机来说是个Trunk口,能承载多个VLAN的带标签流量。路由器收到带标签的帧,根据标签判断属于哪个子接口,剥掉标签做三层转发,再打上目标VLAN的标签发回去。
三层交换机SVI的思路更直接:三层交换机本身就能路由,它给每个VLAN创建一个SVI(Switch Virtual Interface,交换机虚拟接口),配上网关地址。VLAN内的主机把网关指向这个SVI地址,三层交换机内部直接完成跨VLAN转发,数据不用出设备。
两者的核心区别在于转发位置和性能:单臂路由的流量要"绕"到路由器再回来,那条物理链路是瓶颈;SVI路由在交换机内部用硬件转发,速度快得多。但单臂路由胜在设备门槛低,一台普通路由器就能干。
2.3 什么场景该选哪个
这里给一个我自己的判断标准,不一定绝对,但实战里很好用:
| 对比维度 | 单臂路由 | 三层交换机SVI |
|---|---|---|
| 适用规模 | 小型网络、VLAN数量少 | 中大型网络、VLAN多 |
| 转发性能 | 受物理链路带宽限制 | 硬件线速转发 |
| 设备成本 | 需要支持子接口的路由器 | 需要三层交换机 |
| 配置复杂度 | 中等,子接口封装易错 | 相对直观 |
| 典型场景 | 实验室、小型办公、教学演示 | 企业核心、数据中心接入 |
提示:如果VLAN间流量大,千万别用单臂路由硬扛,那条链路会成为整个网络的咽喉,一旦跑满,所有跨VLAN通信全部卡死。
3. 单臂路由:一条链路扛起所有VLAN的转发
3.1 子接口的工作原理拆解
单臂路由的关键在于子接口这个概念。路由器的物理接口本身只能配一个IP,但子接口是逻辑接口,可以在一个物理口上创建多个,每个子接口独立配IP、独立封装VLAN标签。
工作流程我拆成四步:
- 主机A(VLAN 10)要访问主机B(VLAN 20),发现目的不在本地网段,把帧发给网关(路由器子接口的MAC)。
- 交换机在Trunk口上给这个帧打上VLAN 10的标签,发给路由器。
- 路由器物理口收到带标签的帧,根据标签值匹配到对应的子接口(比如G0/0.10),剥掉标签,查路由表,发现目的网段在G0/0.20子接口。
- 路由器从G0/0.20子接口发出,打上VLAN 20的标签,经Trunk口回到交换机,交换机剥标签转发给主机B。
这里有个容易忽略的点:子接口的VLAN封装ID必须和交换机Trunk口允许的VLAN一致,否则标签对不上,帧直接被丢弃。我见过太多人卡在这里,配置看着都对,就是不通,最后发现是封装ID写错了。
3.2 地址规划与网关分配
单臂路由的地址规划有个原则:每个VLAN一个网段,网关地址就是对应子接口的IP。
举个具体的规划例子,假设三个VLAN:
- VLAN 10:192.168.10.0/24,网关192.168.10.1
- VLAN 20:192.168.20.0/24,网关192.168.20.1
- VLAN 30:192.168.30.0/24,网关192.168.30.1
子接口就对应配这三个网关地址。主机侧的网关必须指向自己VLAN对应的那个地址,指错了就不通。
注意:网关地址通常取网段的第一个可用地址(.1)或最后一个(.254),团队里统一约定就行,别一个VLAN用.1另一个用.254,后期排错容易懵。
3.3 完整配置实操
下面用模拟环境的命令演示,接口编号按常见习惯来。
交换机侧配置(以某厂商语法为例):
# 创建VLAN vlan 10 vlan 20 vlan 30 # 连接路由器的接口配成Trunk interface GigabitEthernet0/1 switchport mode trunk switchport trunk allowed vlan 10,20,30 # 连接主机的接口划入对应VLAN interface GigabitEthernet0/2 switchport mode access switchport access vlan 10 interface GigabitEthernet0/3 switchport mode access switchport access vlan 20路由器侧配置:
# 物理接口先开启,不配IP interface GigabitEthernet0/0 no shutdown # 创建子接口,封装VLAN 10 interface GigabitEthernet0/0.10 encapsulation dot1Q 10 ip address 192.168.10.1 255.255.255.0 # 子接口VLAN 20 interface GigabitEthernet0/0.20 encapsulation dot1Q 20 ip address 192.168.20.1 255.255.255.0 # 子接口VLAN 30 interface GigabitEthernet0/0.30 encapsulation dot1Q 30 ip address 192.168.30.1 255.255.255.0配完之后,主机网关指向对应子接口地址,跨VLAN就能通了。
3.4 单臂路由的三个致命坑
坑一:物理接口配了IP。物理口一旦配IP,子接口可能就不工作了,或者行为异常。物理口只负责"承载",不参与三层,保持no shutdown即可。
坑二:Trunk口没放行对应VLAN。交换机Trunk默认可能只允许VLAN 1,你VLAN 10、20、30的标签根本过不去。必须显式allow。
坑三:子接口封装ID和VLAN ID不一致。这个最隐蔽,配置语法没错,但就是不通。检查的时候逐个子接口核对encapsulation后面的数字。
4. 三层交换机SVI:更主流的跨VLAN方案
4.1 SVI接口的本质
SVI是三层交换机为每个VLAN自动或手动创建的虚拟接口。你可以把它理解成"交换机内部给每个VLAN开的一个门",门上挂着网关地址。VLAN内的主机把网关指向这个门,跨VLAN的包进了门,交换机内部直接查表转发到目标VLAN的门出去。
和单臂路由最大的不同:数据不需要离开交换机。单臂路由的包要跑到路由器再跑回来,SVI的包在交换机背板内部就完成了转发,走的是硬件ASIC,速度是线速的。
4.2 开启路由功能的前置条件
三层交换机默认可能工作在二层模式,需要先开启路由功能。不同厂商命令不同,常见的是:
# 开启IP路由 ip routing这一步不做,SVI配了地址也不转发。我遇到过有人SVI地址配得好好的,就是不通,查了半天发现路由功能没开。
4.3 SVI配置全流程
# 开启路由 ip routing # 创建VLAN vlan 10 vlan 20 vlan 30 # 配置SVI接口(每个VLAN一个) interface Vlan10 ip address 192.168.10.1 255.255.255.0 no shutdown interface Vlan20 ip address 192.168.20.1 255.255.255.0 no shutdown interface Vlan30 ip address 192.168.30.1 255.255.255.0 no shutdown # 主机接入接口划VLAN interface GigabitEthernet0/2 switchport mode access switchport access vlan 10主机网关指向对应SVI地址,跨VLAN通信就通了。整个过程不需要额外的路由器,一台三层交换机全搞定。
4.4 SVI相比单臂路由的优势量化
为什么现在企业网基本都用SVI?看几个硬指标:
- 转发路径:SVI在设备内部转发,单臂路由要出设备绕一圈,延迟差一个数量级。
- 带宽瓶颈:单臂路由所有跨VLAN流量挤一条物理链路,SVI用背板带宽,通常是Tbps级别。
- 可靠性:单臂路由那条链路断了,所有跨VLAN全断;SVI没有这个单点。
- 扩展性:加一个VLAN,SVI就是加一个虚拟接口,单臂路由要加子接口还得考虑物理口承载。
提示:不是说单臂路由没用了。在只有二层交换机加一台路由器的环境里,单臂路由是唯一选择。选型看设备,不看潮流。
5. 两种方案横向对比与选型决策
5.1 一张表看清差异
| 维度 | 单臂路由 | 三层交换机SVI |
|---|---|---|
| 核心设备 | 路由器+二层交换机 | 三层交换机 |
| 转发方式 | 子接口,进出打标签 | 内部SVI,硬件转发 |
| 性能 | 受物理链路限制 | 线速 |
| 配置位置 | 路由器为主 | 交换机为主 |
| 故障点 | 物理链路单点 | 无单点 |
| 成本 | 低(复用现有路由器) | 中高(需三层交换机) |
| 适用规模 | 小型、教学、临时 | 中大型、生产环境 |
5.2 选型时我会问自己的三个问题
第一,跨VLAN流量大不大?如果只是偶尔管理访问,单臂路由够用;如果是部门间频繁数据交换,必须SVI。
第二,现有设备是什么?手里只有二层交换机和路由器,那就单臂路由;有三层交换机,直接SVI,别绕弯。
第三,未来会不会加VLAN?会持续扩展的网络,SVI的扩展成本几乎为零,单臂路由每加一个VLAN都要动路由器配置。
5.3 混合场景的处理
实际项目里还有一种情况:核心用三层交换机做SVI,但需要和外部网络互联,这时候三层交换机和路由器之间还是要配路由。这种场景下,三层交换机负责内部VLAN间路由,路由器负责出口,各司其职。别把两件事混在一起想,分开处理逻辑更清晰。
6. 排错实录:跨VLAN不通的排查思路
6.1 分层排查法
跨VLAN不通,我习惯从下往上查,一层层排除:
- 物理层:链路灯亮不亮,接口up没up。
- 二层:VLAN划分对不对,Trunk放行没有,标签对不对。
- 三层:网关配没配,路由开没开,主机网关指对没有。
- 策略层:有没有ACL拦截,有没有端口隔离。
6.2 常见问题速查表
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 同VLAN通,跨VLAN不通 | 网关未配或路由未开 | 检查SVI/子接口和ip routing |
| 部分VLAN通,部分不通 | Trunk未放行该VLAN | 查trunk allowed vlan列表 |
| 时通时不通 | 子接口封装ID错误或链路拥塞 | 核对封装ID,看链路利用率 |
| 完全不通 | 物理链路或VLAN未创建 | 查接口状态和vlan brief |
| 能ping网关,不能跨网段 | 主机网关指错 | 核对主机网关地址 |
6.3 几个我踩过的坑
坑一:主机网关指向了错误的VLAN接口。有次主机在VLAN 10,网关却指到了VLAN 20的地址,同VLAN能通(因为二层直达),跨VLAN全挂。这种错误配置看起来"有网关",但方向错了。
坑二:三层交换机忘了开ip routing。SVI地址配得漂漂亮亮,就是不通,最后发现路由功能没开。这个命令一定要在配置初期就敲。
坑三:单臂路由物理口配了IP。物理口和子接口抢地址,行为不可预测。记住物理口只做承载。
坑四:Trunk口native VLAN不匹配。两端native VLAN不一致,未打标签的流量会跑到错误的VLAN里,引发莫名其妙的连通性问题。
注意:排错时先用display/ show命令把接口状态、VLAN信息、路由表全部拉出来看一遍,比盲目改配置高效得多。
7. 几个进阶话题:让跨VLAN通信更可控
7.1 用ACL控制VLAN间访问
VLAN间路由通了之后,往往不是所有VLAN都能互相访问。比如财务VLAN不该被其他部门随便访问。这时候用ACL在三层接口上做过滤:
# 拒绝VLAN 20访问VLAN 10,允许其他 access-list 100 deny ip 192.168.20.0 0.0.0.255 192.168.10.0 0.0.0.255 access-list 100 permit ip any any # 应用到VLAN 10的SVI入方向 interface Vlan10 ip access-group 100 inACL的方向很关键,in和out搞反了效果完全相反。我的经验是:站在接口的角度想,流量是"进入"这个接口还是"离开"这个接口。
7.2 DHCP配合VLAN间路由
每个VLAN一个网段,DHCP服务器要给不同VLAN分配对应网段的地址。常见做法是在三层设备上配DHCP中继,或者直接用三层交换机做DHCP服务器,每个SVI配一个地址池。这样主机插上就能拿到正确网段的地址和网关,省去手工配置的麻烦。
7.3 冗余与负载分担
生产环境里,单台三层交换机也是单点。可以用VRRP或HSRP做网关冗余,两台三层交换机互为备份,主机网关指向虚拟地址。一台挂了,另一台接管,跨VLAN通信不中断。这个配置稍微复杂,但核心网络值得投入。
8. 我在实际项目里的几点体会
单臂路由和SVI这两套东西,我前后在十几个模拟和真实环境里配过。最大的感受是:原理通了,配置就是体力活;原理不通,配置就是玄学。
新手最容易犯的错,是把"配了网关"等同于"能路由"。网关只是告诉主机往哪发,真正转发的是三层设备的路由功能和接口状态。这两者缺一不可。
另一个体会是,排错一定要有层次感。别一上来就怀疑最复杂的部分,从物理层、二层、三层一层层往上排,90%的问题都在最底下那两层。我见过太多人对着三层配置改了半天,最后发现是网线没插好或者VLAN没创建。
最后分享一个我自己的检查习惯:配完跨VLAN路由,先ping网关,再ping对端网关,最后ping对端主机。三步都通,基本就没问题了。哪一步断,问题范围立刻缩小到对应层次,排查效率能提高一大截。