办公室跨VLAN通信实验:单臂路由与三层交换机SVI配置详解 1. 办公室跨VLAN通信实验的整体设计思路1.1 为什么办公室网络必须做VLAN隔离很多人第一次接触VLAN脑子里冒出来的问题是好好的一个办公室几十台电脑全部塞进同一个网段不就行了为什么非要折腾出好几个VLAN来这个问题我在带新人的时候被问过不下二十次。答案其实不复杂但需要从广播域这个概念说起。一个二层网络里如果所有设备都在同一个广播域那么任何一台机器发出的广播帧都会被交换机泛洪到所有端口。办公室场景下ARP请求、DHCP发现报文、NetBIOS名称广播这些东西加起来几十台设备就能产生相当可观的广播流量。设备少的时候感觉不出来一旦规模上去广播风暴的风险就会指数级上升。VLAN的本质就是把一个物理交换机在逻辑上切成多个独立的广播域每个VLAN内部的广播不会泄漏到其他VLAN去。但隔离只是第一步。真正让VLAN在办公室场景里不可或缺的是按部门或职能划分逻辑网络带来的管理便利。财务、人事、研发、访客这些角色的网络访问需求完全不同。财务系统只允许财务部门访问研发的代码服务器不应该对访客开放访客网络最好连内网都碰不到。如果全部挤在一个网段里你只能靠主机防火墙或者上层应用来做管控既麻烦又容易出漏洞。用VLAN从二层就切开再配合三层设备做策略管理起来清爽得多。所以这个实验的核心目标就很明确了在二层完成VLAN隔离在三层实现受控的跨VLAN通信。这既是思科实验里最经典的场景之一也是实际办公室网络最基础的架构模式。1.2 单臂路由与三层交换两种方案的取舍跨VLAN通信说到底就是让不同网段之间能够互相访问。二层交换机本身不处理IP所以必须引入三层设备。业界主流有两种做法单臂路由Router-on-a-Stick和三层交换机SVI。单臂路由的思路是用一台路由器的一个物理接口通过划分子接口的方式为每个VLAN充当网关。物理接口连到交换机的Trunk口上子接口分别对应不同的VLAN ID每个子接口配置对应网段的网关地址。数据包从VLAN 10的主机发出到达交换机交换机根据目的MAC打上VLAN 10的标签通过Trunk送到路由器子接口路由器解标签、查路由表、再打上目标VLAN的标签送回去。整个过程数据在路由器和交换机之间来回跑所以叫“单臂”。三层交换机SVI的思路则完全不同。三层交换机内部有路由引擎可以直接为每个VLAN创建一个虚拟接口SVI配置网关地址。VLAN间的流量在交换机内部就完成了路由转发不需要外接路由器。转发效率高得多因为走的是硬件ASIC而单臂路由走的是路由器CPU。那为什么还要学单臂路由因为不是所有场景都有三层交换机。小型办公室、预算有限的项目、或者老设备利旧的场合一台路由器加一台二层交换机就能解决问题。而且理解单臂路由的原理对理解VLAN标签的进出过程非常有帮助。我的建议是两种都动手做一遍先做单臂路由把原理吃透再做SVI体会性能差异。这个实验的价值不在于配通而在于搞清楚数据包到底怎么走的。1.3 实验拓扑的规划与地址分配在动手之前先把拓扑和地址规划清楚这是所有网络实验的基本功。我见过太多人上来就敲命令配到一半发现网段冲突或者VLAN ID对不上又回头改浪费时间。这个实验的拓扑我建议这样设计一台三层交换机作为核心下挂两台二层接入交换机也可以用一台三层交换机模拟多个接入场景终端设备分布在不同的VLAN里。如果要做单臂路由对比就在三层交换机旁边再挂一台路由器。地址规划方面我习惯用192.168.X.0/24这样的私有地址段X与VLAN ID对应方便记忆和排查。比如VLAN 10用192.168.10.0/24VLAN 20用192.168.20.0/24VLAN 30用192.168.30.0/24。网关统一用网段的第一个可用地址也就是.1。终端从.10开始分配留出前面的地址给网络设备和未来扩展。VLAN ID部门网段网关用途说明10研发部192.168.10.0/24192.168.10.1代码服务器、开发终端20财务部192.168.20.0/24192.168.20.1财务系统、办公终端30访客192.168.30.0/24192.168.30.1外来设备接入99管理192.168.99.0/24192.168.99.1交换机管理地址管理VLAN单独划分是个好习惯把交换机的管理接口放在独立网段既方便远程管理也避免和业务流量混在一起。这个细节很多教程不讲但实际项目中非常有用。2. 核心配置细节与实操要点拆解2.1 VLAN的创建与端口划分配置的第一步是在交换机上创建VLAN。思科设备上的命令很直接Switch(config)# vlan 10 Switch(config-vlan)# name RND Switch(config-vlan)# exit Switch(config)# vlan 20 Switch(config-vlan)# name FIN Switch(config-vlan)# exit Switch(config)# vlan 30 Switch(config-vlan)# name Guest Switch(config-vlan)# exit Switch(config)# vlan 99 Switch(config-vlan)# name Management Switch(config-vlan)# exit给VLAN起名字不是必须的但强烈建议做。当你配了十几个VLAN之后光看数字根本记不住哪个是哪个。名字就是你的备忘录。接下来是端口划分。接入端口有两种模式Access和Trunk。Access口属于一个VLAN连终端设备Trunk口承载多个VLAN的流量用于交换机之间的互联。Switch(config)# interface range fastEthernet 0/1-10 Switch(config-if-range)# switchport mode access Switch(config-if-range)# switchport access vlan 10 Switch(config-if-range)# exit Switch(config)# interface range fastEthernet 0/11-20 Switch(config-if-range)# switchport mode access Switch(config-if-range)# switchport access vlan 20 Switch(config-if-range)# exit这里有个容易踩的坑端口默认就在VLAN 1里如果你不显式地把端口划到目标VLAN它就一直待在VLAN 1。很多人配完发现不通排查半天最后发现是端口没划过去。另外interface range命令在部分老型号上不支持那就得一个一个配或者用interface range的变体语法。提示配置完端口后用show vlan brief确认每个端口所属的VLAN是否正确。这个命令输出的表格非常直观一眼就能看出问题。2.2 Trunk链路的配置与Native VLAN处理交换机之间的互联链路必须配成Trunk否则VLAN标签无法传递。Trunk的配置看起来简单但里面的细节不少Switch(config)# interface gigabitEthernet 0/1 Switch(config-if)# switchport trunk encapsulation dot1q Switch(config-if)# switchport mode trunk Switch(config-if)# switchport trunk native vlan 99 Switch(config-if)# switchport trunk allowed vlan 10,20,30,99 Switch(config-if)# exit逐条解释一下。switchport trunk encapsulation dot1q指定封装协议为802.1Q这是目前唯一通用的标准。有些三层交换机默认就是dot1q但显式写出来更稳妥。switchport mode trunk把端口设为Trunk模式。switchport trunk native vlan 99把Native VLAN从默认的VLAN 1改成99这是个安全实践——默认VLAN 1是众所周知的容易被利用改掉它减少风险。switchport trunk allowed vlan限制Trunk上允许通过的VLAN列表不写的话默认全部允许但显式限制更安全也更清晰。Native VLAN的概念值得多说两句。802.1Q标签有4个字节插在以太网帧的源MAC地址后面。但Native VLAN的帧不打标签接收方如果看到没有标签的帧就认为它属于Native VLAN。两端Trunk的Native VLAN必须一致否则会出现VLAN流量“串门”的问题——VLAN 10的流量可能被对方当成Native VLAN的流量处理。这个坑我在实际项目中见过一次排查了整整一个下午。注意两端Trunk的Native VLAN不一致是导致VLAN间通信异常的常见原因之一。配完Trunk后用show interfaces trunk检查两端的Native VLAN是否匹配。2.3 三层交换机SVI的配置与IP地址规划三层交换机上为每个VLAN创建SVI配置网关地址Switch(config)# interface vlan 10 Switch(config-if)# ip address 192.168.10.1 255.255.255.0 Switch(config-if)# no shutdown Switch(config-if)# exit Switch(config)# interface vlan 20 Switch(config-if)# ip address 192.168.20.1 255.255.255.0 Switch(config-if)# no shutdown Switch(config-if)# exit Switch(config)# interface vlan 30 Switch(config-if)# ip address 192.168.30.1 255.255.255.0 Switch(config-if)# no shutdown Switch(config-if)# exit关键一步是开启IP路由功能Switch(config)# ip routing这行命令不敲SVI配了也不通。三层交换机默认可能关闭路由功能必须手动开启。我见过不止一个新手在这里卡住SVI的IP都配对了show ip interface brief看状态也是up但就是ping不通其他VLAN最后发现是ip routing没开。SVI的no shutdown也别忘了。VLAN接口默认是shutdown状态不手动开启的话即使VLAN存在、端口也划进去了SVI仍然是down的。show ip interface brief里会显示administratively down一眼就能看出来。2.4 单臂路由的配置对比如果要做单臂路由方案路由器上的配置是这样的Router(config)# interface gigabitEthernet 0/0 Router(config-if)# no shutdown Router(config-if)# exit Router(config)# interface gigabitEthernet 0/0.10 Router(config-subif)# encapsulation dot1q 10 Router(config-subif)# ip address 192.168.10.1 255.255.255.0 Router(config-subif)# exit Router(config)# interface gigabitEthernet 0/0.20 Router(config-subif)# encapsulation dot1q 20 Router(config-subif)# ip address 192.168.20.1 255.255.255.0 Router(config-subif)# exit子接口的编号.10、.20只是本地标识和VLAN ID没有强制关系但习惯上保持一致方便对照。encapsulation dot1q 10告诉路由器这个子接口处理VLAN 10的流量。物理接口本身不配IP只负责承载子接口。单臂路由和SVI的核心区别在于转发路径。单臂路由下VLAN 10到VLAN 20的流量要走主机→接入交换机→Trunk→路由器子接口→路由器路由决策→路由器子接口→Trunk→接入交换机→主机。流量在路由器和交换机之间跑了两趟。SVI方案下流量在交换机内部就完成了路由只走一趟。这就是为什么三层交换机的跨VLAN转发性能远高于单臂路由。3. 完整实操流程与关键环节实现3.1 实验环境搭建与初始配置先把设备连起来。我用的拓扑是一台三层交换机核心两台二层交换机接入一台路由器用于单臂路由对比四台PC。三层交换机的G0/1连路由器的G0/0G0/2连二层交换机A的G0/1G0/3连二层交换机B的G0/1。PC分别接到二层交换机的Access口上。初始配置包括设置主机名、关闭域名查询、配置管理IPSwitch(config)# hostname CoreSW CoreSW(config)# no ip domain-lookup CoreSW(config)# interface vlan 99 CoreSW(config-if)# ip address 192.168.99.1 255.255.255.0 CoreSW(config-if)# no shutdown CoreSW(config-if)# exit CoreSW(config)# ip default-gateway 192.168.99.254no ip domain-lookup是个小技巧防止你敲错命令时设备试图做DNS解析那个等待过程非常烦人。管理VLAN 99的SVI配上IP后就可以从管理网段远程登录交换机了。二层交换机上也要配管理IP但注意二层交换机不支持ip routing它的管理IP只用于远程管理不参与数据转发。默认网关指向三层交换机的管理SVI地址。3.2 VLAN与Trunk的逐台配置二层交换机A的配置Switch(config)# hostname AccessSW-A AccessSW-A(config)# vlan 10 AccessSW-A(config-vlan)# name RND AccessSW-A(config-vlan)# exit AccessSW-A(config)# vlan 20 AccessSW-A(config-vlan)# name FIN AccessSW-A(config-vlan)# exit AccessSW-A(config)# interface range fa0/1-10 AccessSW-A(config-if-range)# switchport mode access AccessSW-A(config-if-range)# switchport access vlan 10 AccessSW-A(config-if-range)# exit AccessSW-A(config)# interface range fa0/11-20 AccessSW-A(config-if-range)# switchport mode access AccessSW-A(config-if-range)# switchport access vlan 20 AccessSW-A(config-if-range)# exit AccessSW-A(config)# interface gigabitEthernet 0/1 AccessSW-A(config-if)# switchport mode trunk AccessSW-A(config-if)# switchport trunk native vlan 99 AccessSW-A(config-if)# switchport trunk allowed vlan 10,20,30,99 AccessSW-A(config-if)# exit二层交换机B类似但VLAN 30的端口划在B上。三层交换机上联两个二层交换机的端口也要配Trunk配置和上面一致。这里有个细节二层交换机上不需要创建VLAN 99除非管理接口要用。但如果Trunk的Native VLAN设成了99而交换机上没有VLAN 99某些型号会报错或者行为异常。稳妥起见所有交换机上都创建VLAN 99。3.3 三层路由功能的启用与验证三层交换机上启用路由并配置SVICoreSW(config)# ip routing CoreSW(config)# interface vlan 10 CoreSW(config-if)# ip address 192.168.10.1 255.255.255.0 CoreSW(config-if)# no shutdown CoreSW(config-if)# exit CoreSW(config)# interface vlan 20 CoreSW(config-if)# ip address 192.168.20.1 255.255.255.0 CoreSW(config-if)# no shutdown CoreSW(config-if)# exit CoreSW(config)# interface vlan 30 CoreSW(config-if)# ip address 192.168.30.1 255.255.255.0 CoreSW(config-if)# no shutdown CoreSW(config-if)# exit验证步骤分三层先看接口状态再看路由表最后测连通性。CoreSW# show ip interface brief CoreSW# show ip route CoreSW# show vlan briefshow ip interface brief确认所有SVI都是up/up。show ip route应该能看到直连路由C标记对应各个网段。show vlan brief确认端口划分正确。然后从PC上ping网关再ping其他VLAN的PC。PC的IP配置VLAN 10的PC配192.168.10.10/24网关192.168.10.1VLAN 20的PC配192.168.20.10/24网关192.168.20.1。ping通网关说明二层到三层没问题ping通其他VLAN的PC说明路由转发正常。3.4 用ACL实现受控的跨VLAN访问实际办公室场景里跨VLAN通信不是全放开的。访客VLAN不应该能访问研发和财务财务VLAN可能只允许特定服务器访问。这就需要用ACL来做策略控制。在三层交换机上配置扩展ACLCoreSW(config)# ip access-list extended GUEST_RESTRICT CoreSW(config-ext-nacl)# deny ip 192.168.30.0 0.0.0.255 192.168.10.0 0.0.0.255 CoreSW(config-ext-nacl)# deny ip 192.168.30.0 0.0.0.255 192.168.20.0 0.0.0.255 CoreSW(config-ext-nacl)# permit ip any any CoreSW(config-ext-nacl)# exit CoreSW(config)# interface vlan 30 CoreSW(config-if)# ip access-group GUEST_RESTRICT in CoreSW(config-if)# exitACL的方向很重要。in表示从VLAN 30进来的流量被过滤out表示从VLAN 30出去的流量被过滤。对于限制访客访问内网应该在VLAN 30的SVI上应用in方向的ACL这样访客发出的流量在进入路由引擎之前就被拦截了效率更高。通配符掩码wildcard mask是ACL里的一个难点。0.0.0.255对应255.255.255.0的反码表示前24位必须匹配后8位任意。思科的ACL用通配符掩码而不是子网掩码刚开始容易搞混。记住一个口诀0表示必须匹配1表示忽略。提示ACL末尾默认隐含一条deny ip any any。如果你只写了deny规则没写permit所有流量都会被拒绝。所以显式加一条permit ip any any是必须的。4. 常见问题排查与避坑经验实录4.1 跨VLAN不通的排查思路跨VLAN不通是最常见的问题排查要按层次来不要东一榔头西一棒子。我总结了一个排查顺序基本能覆盖90%的情况排查步骤检查命令常见问题1. 物理层show interfaces status端口down、网线没插好2. 二层VLANshow vlan brief端口没划到正确VLAN3. Trunkshow interfaces trunkTrunk没配、Native VLAN不匹配4. 三层SVIshow ip interface briefSVI没up、IP配错5. 路由show ip routeip routing没开、路由表为空6. ACLshow ip access-listsACL拦截了流量7. 终端ipconfig /allPC的IP、网关、掩码配错从下往上查每层确认无误再往上走。我见过有人直接跳到三层查路由结果发现是端口没划到VLAN里。按顺序来效率最高。4.2 Native VLAN不匹配引发的诡异现象Native VLAN不匹配的症状很隐蔽部分VLAN能通部分不通或者时通时不通。原因是两端的Native VLAN不一致时一端的Native VLAN流量到了另一端会被打上对方的Native VLAN标签导致VLAN“串门”。比如A端Native VLAN是1B端Native VLAN是99。A端VLAN 1的流量不打标签发出去B端收到无标签帧认为它属于VLAN 99于是把它转发到VLAN 99的端口上。如果VLAN 99里有设备就会收到本不该收到的流量。排查方法很简单show interfaces trunk看两端的Native VLAN是否一致。不一致就改成一样的。我建议统一改成99或者一个不用的VLAN避免和业务VLAN冲突。4.3 SVI状态up但协议down的原因show ip interface brief里SVI显示up/down说明VLAN存在但协议没起来。最常见的原因是VLAN里没有任何up的端口。SVI的协议状态依赖于VLAN内至少有一个up的Access口或Trunk口。如果VLAN 10里所有端口都down了SVI的协议状态也会down。解决办法确认VLAN内有活跃端口。如果确实没有设备接在那个VLAN里SVI的协议状态down是正常的不影响其他VLAN的通信。但如果需要SVI保持up可以接一台设备或者配一个loopback口。另一个原因是no shutdown没敲。SVI默认是shutdown的show ip interface brief会显示administratively down和协议down是两回事。4.4 单臂路由的带宽瓶颈与优化单臂路由最大的问题是带宽瓶颈。所有VLAN间的流量都要经过路由器的一个物理接口这个接口的带宽被所有VLAN共享。如果VLAN 10和VLAN 20之间有大流量传输路由器的接口就会成为瓶颈。优化思路有几个一是把物理接口换成更高带宽的比如从百兆换千兆二是用三层交换机替代单臂路由三是把流量大的VLAN放在同一台交换机上用SVI本地转发。我在一个小型办公室项目里遇到过这个问题财务和研发之间偶尔要传大文件单臂路由的百兆接口成了瓶颈传一个几GB的文件要等很久。后来换了一台三层交换机问题直接解决。所以如果预算允许三层交换机是更优解。4.5 实验环境与生产环境的差异提醒实验里配通了不代表生产环境就没问题。几个差异点需要注意生成树协议STP。实验拓扑简单可能感觉不到STP的影响。生产环境里冗余链路多STP的收敛时间和拓扑变化会影响VLAN间通信。建议在实验里也加上冗余链路观察STP的行为。VLAN数量。实验里三四个VLAN生产环境可能几十上百个。VLAN多了之后Trunk上允许的VLAN列表、STP实例、ACL规则都会变得复杂。规划好VLAN编号和命名规范非常重要。安全策略。实验里ACL可能就几条生产环境的ACL可能几百条。ACL的顺序、通配符掩码的精确性、日志记录都需要仔细设计。建议在实验里就养成写ACL注释的习惯生产环境里会感谢自己。设备性能。实验用的设备可能性能有限生产环境的设备转发能力、表项容量、CPU处理ACL的能力都要考虑。特别是ACL如果规则太多可能会影响转发性能。5. 实验扩展与进阶方向5.1 用DHCP中继简化终端管理实验里PC的IP是手动配的生产环境肯定用DHCP。但DHCP服务器通常在一个集中的网段其他VLAN的PC怎么获取IP这就需要DHCP中继。在三层交换机的SVI上配置CoreSW(config)# interface vlan 10 CoreSW(config-if)# ip helper-address 192.168.99.100 CoreSW(config-if)# exitip helper-address指向DHCP服务器的地址。当VLAN 10的PC发出DHCP发现报文广播三层交换机收到后把它转换成单播转发给DHCP服务器。服务器根据请求报文的源网段分配对应网段的IP。DHCP中继的配置很简单但要注意DHCP服务器的地址池必须和VLAN网段匹配。服务器上要为每个VLAN配一个地址池否则PC拿不到正确网段的IP。5.2 用VRRP实现网关冗余生产环境里网关是单点故障。如果三层交换机的SVI挂了整个VLAN就断了。**VRRP虚拟路由器冗余协议**可以解决这个问题两台三层交换机组成一个VRRP组共享一个虚拟IP作为网关。主设备挂了备设备接管。配置思路两台交换机上为每个VLAN配SVI然后配VRRP组CoreSW-1(config)# interface vlan 10 CoreSW-1(config-if)# ip address 192.168.10.2 255.255.255.0 CoreSW-1(config-if)# vrrp 10 ip 192.168.10.1 CoreSW-1(config-if)# vrrp 10 priority 120 CoreSW-1(config-if)# vrrp 10 preempt CoreSW-1(config-if)# exit虚拟IP是192.168.10.1PC的网关指向这个地址。优先级高的成为主设备preempt允许它恢复后抢回主角色。这个扩展让实验从“能通”升级到“可靠”是实际项目必备的技能。5.3 端口安全与访客网络的加固访客VLAN的安全加固不只是ACL。端口安全可以防止未授权设备接入AccessSW-A(config)# interface fa0/21 AccessSW-A(config-if)# switchport mode access AccessSW-A(config-if)# switchport access vlan 30 AccessSW-A(config-if)# switchport port-security AccessSW-A(config-if)# switchport port-security maximum 1 AccessSW-A(config-if)# switchport port-security violation restrict AccessSW-A(config-if)# switchport port-security mac-address sticky AccessSW-A(config-if)# exitmaximum 1限制端口只能学习一个MAC地址sticky让交换机自动记住第一个接入设备的MAC。如果换了设备端口会被限制。violation restrict表示违规时丢弃流量并记录日志不关闭端口。访客网络还可以做私有VLAN让访客之间也不能互相通信进一步隔离。这个在实验里可以选做但生产环境里访客网络的安全要求通常比较高。5.4 用NetFlow或SNMP做流量监控实验做通了下一步是监控。SNMP可以采集交换机的接口流量、CPU利用率、内存使用等指标。NetFlow可以记录流经设备的流量详情包括源IP、目的IP、端口、协议、字节数。在三层交换机上配SNMPCoreSW(config)# snmp-server community public RO CoreSW(config)# snmp-server host 192.168.99.200 version 2c publicRO表示只读权限public是团体字符串生产环境要改成复杂的。SNMP服务器比如Zabbix、LibreNMS可以定期采集数据画出流量趋势图。NetFlow的配置稍微复杂一些需要指定流导出的目标地址和版本。这个扩展让实验从“配通”升级到“可运维”是网络工程师的进阶技能。5.5 从实验到生产的检查清单最后分享一个我从实验到生产都会用的检查清单每次上线前过一遍能避免大部分低级错误VLAN ID和名称是否与规划文档一致Trunk两端Native VLAN是否匹配Trunk允许的VLAN列表是否包含所有需要的VLANSVI的IP和掩码是否正确ip routing是否开启默认路由或动态路由是否配置ACL规则顺序是否正确是否有permit兜底DHCP中继地址是否可达管理VLAN是否可以从管理网段访问配置是否保存write memory或copy running-config startup-config这个清单看起来简单但每一条我都见过有人踩坑。特别是最后一条配了半天没保存设备一重启全没了那种感觉非常酸爽。我个人在实际操作中的体会是跨VLAN通信这个实验的价值不在于配置命令本身而在于理解数据包的完整转发路径。当你能在脑子里画出数据包从源主机到目的主机经过的每一个设备、每一个接口、每一次标签的添加和剥离你就真正掌握了VLAN间路由的精髓。这个能力在排查故障的时候尤其重要因为你知道该在哪个环节去抓包、去看什么信息。实验环境里可以随便折腾配错了重来就是但生产环境里每一次变更都要谨慎。把实验做扎实把原理吃透到了真实项目里才能心里有底。