1. VLAN 之间为什么天生不通,三层交换机到底在哪一层动手
很多人第一次配思科三层交换机,卡在同一个地方:两个 VLAN 的 PC 都配好了地址,接口状态全是 up,可就是 ping 不通。于是开始怀疑线缆、怀疑模拟器、怀疑设备是不是坏的。实际上这不是故障,这是 VLAN 的设计本意——隔离广播域。VLAN 存在的意义,就是把一个物理交换网络切成一堆互相看不见的逻辑网络,如果它默认就能互通,那它就白设计了。
所以"让不同 VLAN 相互通信"这句话,本质上是要求我们在隔离之上再开一道门,而这道门必须由第三层来开。这一点想明白了,后面的命令就都是顺理成章的事:二层负责把帧送到正确的接口,三层负责判断"这个包该不该跨网段走"。VLAN 间通信的关键词里那个"三层交换机",指的就是这台设备同时具备这两个身份。
1.1 二层转发只看 MAC,压根不认识 IP 网段
先把二层交换机的行为掰开说。接入层的二层交换机在转发一个帧的时候,判断依据只有两个东西:目的 MAC 地址和VLAN ID。它维护一张 MAC 地址表,记录"某个 MAC 从哪个接口、属于哪个 VLAN 学到的"。收到帧之后,查表,命中就从这个接口发出去,不命中就在该 VLAN 内泛洪。
关键点在于:这张表里没有 IP 地址这一列。PC 的 IP 是 192.168.10.10 还是 192.168.20.10,二层设备完全不关心,它只看帧头里的 MAC。这就像小区里送快递,快递员只认门牌号,不认你身份证上的户籍地。VLAN 10 和 VLAN 20 在交换机眼里是两个不相干的小区,哪怕它们在同一栋楼里,快递员也不会跨小区送。
那 PC 是怎么决定"要不要跨小区"的呢?是 PC 自己算的。PC 拿自己的 IP 和掩码一算,发现目标地址不在同一个网段,就把包发给默认网关,而不是直接发给对方。这一步是整个链路的转折点:包的下一跳从"目标主机"变成了"网关所在的 MAC"。
1.2 三层交换机的"分界线"落在 SVI 上
网关是谁?在三层交换机方案里,网关就是每个 VLAN 对应的一个SVI(Switch Virtual Interface,交换机虚拟接口)。你可以把它理解成"这个 VLAN 在设备内部的代言人":一个 VLAN 对应一个 SVI,一个 SVI 配一个 IP,这个 IP 就是该 VLAN 内所有主机的网关。
VLAN 10 的 SVI 是interface vlan 10,地址 192.168.10.1;VLAN 20 的 SVI 是interface vlan 20,地址 192.168.20.1。这两个接口各自看是一个"本地网段"。当 VLAN 10 的 PC 要访问 VLAN 20 的 PC 时,流程是这样的:
- PC 发现目标不在本网段,查自己的 ARP 表找网关 MAC,没有就发 ARP 请求问"192.168.10.1 的 MAC 是什么"。
- 三层交换机用自己的 SVI 地址回应这个 ARP,PC 把包发给这个 MAC。
- 交换机收到帧,看到目的 MAC 是自己 SVI 的 MAC,于是把帧头剥掉,交给三层引擎。
- 三层引擎查路由表,发现 192.168.20.0/24 直连在
interface vlan 20上,于是重新封装帧头(源 MAC 改成 SVI 20 的 MAC,目的 MAC 是 VLAN 20 那台 PC 的 MAC),从 VLAN 20 的接口发出去。 - 回程同理。
这就是一次完整的跨 VLAN 转发,它同时用到了二层(MAC 重写、VLAN 标签处理)和三层(路由查表)。一句话概括:VLAN 间通信不是"打通 VLAN",而是"给每个 VLAN 配一个网关,并让设备愿意帮它们做路由"。
注意:三层交换的前提是设备上路由功能处于开启状态。思科不少三层交换机型号(比如 3560、3750 系列)默认是开的,但有些型号或某些固件版本默认关闭,必须手动敲
ip routing。这个命令不敲,SVI 地址配得再漂亮,设备也只当它是个"有 IP 的接口",不会帮你转发跨网段流量。这是新手最常掉进去的坑之一。
2. 动手前的账要算清楚:拓扑、网段与地址规划
配置命令本身并不复杂,复杂的是"想清楚"。我见过太多人一上来就打开模拟器连设备,连完发现地址段规划得乱七八糟,网段互相重叠,或者网关配在了错误的 VLAN 上,最后推倒重来。与其这样,不如花十分钟把拓扑和地址表在纸上(或者文本文件里)列清楚,敲命令的时候就是抄。
2.1 一个够用的最小实验拓扑
验证 VLAN 间通信,最小可用的拓扑其实只需要一台三层交换机和两台主机。但为了接近真实的"接入层 + 汇聚层"结构,我建议用下面这个三设备拓扑,它能把 Trunk、SVI、路由三件事一次性练到位:
- 三层交换机(核心):作为所有 VLAN 的网关,负责路由。
- 二层交换机(接入):负责把 PC 接进来,通过 Trunk 上联核心。
- 两台 PC:分别属于 VLAN 10 和 VLAN 20。
连线方式:
| 链路 | 一端 | 另一端 | 类型 |
|---|---|---|---|
| PC1 - 接入交换机 | FastEthernet0/1 | Fa0/10 | Access,VLAN 10 |
| PC2 - 接入交换机 | FastEthernet0/1 | Fa0/20 | Access,VLAN 20 |
| 接入交换机 - 核心 | Fa0/24 | Fa0/24 | Trunk,放行 VLAN 10、20 |
为什么中间要加一台二层交换机而不是把 PC 直接插在核心上?因为这样才能真正验证Trunk 链路上的 VLAN 标签是否被正确封装和放行。如果 PC 直接插核心,很容易掩盖掉 Trunk 配置的错误,等接到真实环境里再出问题,排查成本成倍上升。
2.2 地址规划表:一张表定乾坤
地址规划这件事,核心就三条原则:网段不重叠、网关落在这个网段里、网关地址统一好记。很多人喜欢把网关设成网段的第一个可用地址(.1)或者最后一个(.254),我觉得 .1 更直观,而且方便记忆——看到 192.168.10.x 就知道网关大概率是 192.168.10.1。
| 设备/VLAN | VLAN ID | 网段 | 网关(SVI) | 主机地址 |
|---|---|---|---|---|
| VLAN 10 办公 | 10 | 192.168.10.0/24 | 192.168.10.1 | PC1:192.168.10.10 |
| VLAN 20 财务 | 20 | 192.168.20.0/24 | 192.168.20.1 | PC2:192.168.20.20 |
| 管理网段(可选) | 99 | 192.168.99.0/24 | 192.168.99.1 | 交换机管理地址 |
这里我特意把管理 VLAN 单独拆出来,原因后面会讲到——生产环境里把设备管理地址和业务 VLAN 混在一起,是很容易出问题的一种做法,尤其是当业务 VLAN 上跑了 DHCP、广播比较多的时候。
PC 的配置要特别注意两点:一是掩码必须写全(255.255.255.0,不要漏),二是默认网关必须填。很多人测试时只填 IP 和掩码,网关那栏空着,然后奇怪"为什么同 VLAN 能通、跨 VLAN 不通"——因为 PC 根本不知道该把跨网段的包交给谁。
2.3 模拟器环境里那些容易忽略的细节
用模拟器做实验的人多,这里说几个我在使用过程中踩到的点。首先是设备型号选择:不是所有型号都支持三层功能。你要选明确标注支持 Layer 3 的交换机型号,二层交换机的 SVI 只能配一个管理地址,ip routing这类命令根本敲不进去,配上就会提示无效命令。
其次是接口命名:不同型号的接口前缀不一样,有的叫 FastEthernet,有的叫 GigabitEthernet,配置时按实际show ip interface brief里显示的名字来写,不要凭记忆。名字写错的报错通常是 "Invalid interface",一眼能看出来。
第三是启动时间:模拟器里交换机启动后,接口从 down 到 up 需要几秒到几十秒,尤其 Trunk 链路的生成树收敛需要时间。刚配完就 ping,可能因为 STP 还没收敛而失败,等半分钟再测,或者先show spanning-tree看一眼状态是不是 forwarding。
提示:做实验时养成一个习惯——每配完一段就
show一下。配 VLAN 看show vlan brief,配 Trunk 看show interfaces trunk,配 SVI 看show ip interface brief。逐段确认,比最后一起 ping 要高效得多。
3. 从建 VLAN 到 SVI 起三层,逐段落地
配置顺序上有个讲究:先二层后三层。也就是先把 VLAN 建好、接口划进去、Trunk 打通,确认二层通了,再配 SVI 和路由。如果反着来,三层配置有问题时,你没法判断是路由没生效还是二层压根没通,排查会变成一团乱麻。
3.1 接入交换机:建 VLAN、划接口
先在三层交换机和二层交换机上分别建 VLAN。名字(name)不是必须的,但强烈建议写上,半年后再看配置,你能一眼知道 VLAN 10 是干什么的。
Switch(config)# vlan 10 Switch(config-vlan)# name Office Switch(config-vlan)# exit Switch(config)# vlan 20 Switch(config-vlan)# name Finance Switch(config-vlan)# exit然后把接 PC 的接口划进对应 VLAN:
Switch(config)# interface FastEthernet0/10 Switch(config-if)# switchport mode access Switch(config-if)# switchport access vlan 10 Switch(config-if)# exit Switch(config)# interface FastEthernet0/20 Switch(config-if)# switchport mode access Switch(config-if)# switchport access vlan 20 Switch(config-if)# exit这里switchport mode access一定要显式写。虽然不少接口默认就是 access 模式,但显式声明能避免接口之前被配成别的模式(比如残留的 trunk 配置)导致行为异常。switchport access vlan 10这个命令有个细节:如果 VLAN 10 还没创建,很多型号会自动帮你创建它;但有些型号不会,会直接拒绝。所以先建 VLAN 再划接口,顺序不要颠倒。
配置完用show vlan brief确认一下,应该能看到 VLAN 10 和 VLAN 20 下面的接口归属。如果接口没出现在列表里,多半是switchport mode或者接口状态的问题。
3.2 Trunk 链路:封装、模式与放行列表
Trunk 是二层到三层之间的"高速公路",多个 VLAN 的流量都从这里过,靠的是 802.1Q 标签区分彼此。Trunk 的配置要解决四件事:封装类型、模式、放行哪些 VLAN、native VLAN。
Switch(config)# interface FastEthernet0/24 Switch(config-if)# switchport trunk encapsulation dot1q Switch(config-if)# switchport mode trunk Switch(config-if)# switchport trunk allowed vlan 10,20 Switch(config-if)# switchport trunk native vlan 1 Switch(config-if)# exit逐条解释一下为什么这么写。switchport trunk encapsulation dot1q是指定封装协议为 802.1Q,这是业界标准,跨厂商设备之间也用这个。有些老型号还支持 ISL(思科私有),但那玩意早就淘汰了,统一用 dot1q。需要注意:低端交换机往往只有 dot1q 一种封装,这条命令可能敲不进去,报错说命令不存在,那就不用敲;而中高端型号如果没指定,可能默认用 ISL,两边不一致就通不了。
switchport mode trunk是把接口主动设为 Trunk 模式。也可以配成dynamic auto或dynamic desirable让它自动协商,但我不推荐在生产环境这么干——自动协商的结果取决于两端配置的组合,一端 auto 一端 desirable 能起来,两端都 auto 就起不来,这种"看运气"的配置方式排错时非常痛苦。手动固定成 trunk,行为可预测。
switchport trunk allowed vlan 10,20是限制这条 Trunk 上允许通过的 VLAN。这一点很关键:默认情况下所有 VLAN 都允许通过,看起来省事,实际上是安全隐患——一个不该出现的 VLAN 流量可能顺着 Trunk 跑到别的楼层。手动列白名单,既清晰又安全。以后要加 VLAN,记得回来改这一行,"VLAN 建了但 Trunk 没放行"是跨 VLAN 不通的头号原因。
switchport trunk native vlan 1是指定 native VLAN,默认就是 1。native VLAN 上的帧是不打标签的,如果两端不一致,会引发让你抓狂的诡异问题(后面单独说)。
配完两端之后,用show interfaces trunk检查。重点看三列:Mode 是不是 trunk、Encapsulation 是不是 802.1Q、Vlans allowed and active 里有没有 10 和 20。这三项都对了,二层隧道就通了。
3.3 三层交换机:开启 ip routing,给 SVI 配地址
到了核心环节。先确保路由功能开着:
CoreSwitch(config)# ip routing然后给每个 VLAN 配 SVI:
CoreSwitch(config)# interface vlan 10 CoreSwitch(config-if)# ip address 192.168.10.1 255.255.255.0 CoreSwitch(config-if)# no shutdown CoreSwitch(config-if)# exit CoreSwitch(config)# interface vlan 20 CoreSwitch(config-if)# ip address 192.168.20.1 255.255.255.0 CoreSwitch(config-if)# no shutdown CoreSwitch(config-if)# exit关于 SVI 有几个必须说清楚的点。第一,SVI 的 up/down 状态取决于该 VLAN 里有没有活跃的成员端口。如果 VLAN 10 里一个 up 的接口都没有,interface vlan 10会是 down 状态,路由表里也不会出现这条直连路由。新手配完 SVI 发现路由表里啥都没有,八成就是这个原因——不是配置错了,是 VLAN 里没活人。
第二,no shutdown建议显式敲一下。SVI 默认是开启的,但养成习惯没坏处。
第三,一个 VLAN 只配一个 SVI 地址,这个地址就是全 VLAN 的网关,不要想着配多个。
配完用命令验证:
CoreSwitch# show ip interface brief CoreSwitch# show ip routeshow ip route里应该能看到两条直连路由:
C 192.168.10.0/24 is directly connected, Vlan10 C 192.168.20.0/24 is directly connected, Vlan20看到这两行,说明三层侧的准备工作完成了。如果只有一条或者一条都没有,回头检查 SVI 状态和接口 up 情况。
3.4 把两端串起来:确认二层路径完整
三层配完之后,别急着 ping。先做一次二层层的确认:show vlan brief看接入交换机的接口归属对不对,show interfaces trunk看两端 Trunk 是否都起来了、放行的 VLAN 是否一致。任何一端没放行 VLAN 20,VLAN 20 的流量就过不去,表现就是"VLAN 10 能通网关,VLAN 20 连网关都 ping 不通"。
还有一个非常容易被忽略的点:PC 的网关必须指向本 VLAN 的 SVI 地址。VLAN 10 的 PC 网关写 192.168.10.1,VLAN 20 的 PC 网关写 192.168.20.1。如果 VLAN 10 的 PC 手抖写成了 192.168.20.1,它的跨网段流量会先去找 VLAN 20 的网关,经过路由绕一圈再从 VLAN 10 出来,能不能通取决于路由配置,而且路径完全不符合预期。这种"能通但路径诡异"的问题,比不通更难查。
4. SVI 与单臂路由:两条路都能走,怎么选
打通 VLAN 间通信,方案不止一种。除了三层交换机的 SVI,还有用路由器做单臂路由(Router-on-a-Stick)的方案。两种方案都能实现目标,但适用场景差别很大,选错了后面会很难受。
4.1 单臂路由的原理与它的代价
单臂路由的做法是:在路由器的一个物理接口上,为每个 VLAN 配一个子接口(sub-interface),每个子接口通过encapsulation dot1Q <vlan-id>绑定一个 VLAN,再各配一个网关 IP。物理接口本身不配地址,但必须no shutdown。
Router(config)# interface GigabitEthernet0/0 Router(config-if)# no ip address Router(config-if)# no shutdown Router(config-if)# exit Router(config)# interface GigabitEthernet0/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 GigabitEthernet0/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流量路径是:PC 发给网关 MAC,帧从接入交换机经 Trunk 上到路由器,路由器在子接口上解封装、查路由、再封装回同一个物理接口,从对应子接口发回去。整个过程所有 VLAN 的流量都挤在一条物理链路上,这就是"单臂"这个叫法的由来。
它的代价很直白:带宽成为瓶颈。所有跨 VLAN 流量共享那一条链路,VLAN 一多、流量一大,这条路立刻堵。而且每一次跨 VLAN 转发都要经过路由器,路由器是软件转发为主,吞吐量和延迟都不如三层交换机的硬件转发。另外,子接口的配置量随 VLAN 数量线性增长,管理几十个 VLAN 的时候配置文件会变得非常臃肿。
4.2 三层交换机 SVI 为什么是现在的主流
三层交换机的优势在于转发靠硬件。它内部有一个专门做三层转发的 ASIC 芯片,配合 CEF(Cisco Express Forwarding)机制,能做到"第一个包走软件慢路径建立转发表,后续包全部走硬件快路径"。社区里常说的"一次路由,多次交换"就是这个意思。
对比一下两种方案:
| 对比项 | 单臂路由 | 三层交换机 SVI |
|---|---|---|
| 转发方式 | 路由器软件转发为主 | 硬件 ASIC 转发 |
| 带宽瓶颈 | 所有 VLAN 挤一条链路 | VLAN 间转发在设备内部完成 |
| 配置复杂度 | 每 VLAN 一个子接口 | 每 VLAN 一个 SVI |
| 扩展性 | VLAN 多时配置臃肿 | 支持大量 VLAN |
| 成本 | 需额外路由器 | 一台设备搞定 |
| 适用场景 | 小型网络、过渡方案 | 中大型网络的常规做法 |
所以只要预算允许,三层交换机是 VLAN 间通信的标准答案。单臂路由更适合教学演示、或者手上只有二层交换机加一台路由器时的临时方案。
4.3 有时候反而该用路由口:no switchport的场合
SVI 不是唯一选择。三层交换机的物理接口可以用no switchport命令从二层模式切换成三层路由口,直接配 IP 地址。这在设备之间做互联时特别有用。
举个典型场景:两台三层交换机之间做互联,你可以划分一个专门的互联 VLAN,各配一个 SVI;也可以把互联接口直接no switchport,各配一个 /30 或 /31 的地址。后者更省地址,而且不会在生成树里掺和进来。
CoreSwitch(config)# interface GigabitEthernet0/1 CoreSwitch(config-if)# no switchport CoreSwitch(config-if)# ip address 10.0.0.1 255.255.255.252 CoreSwitch(config-if)# no shutdown注意no switchport这条命令只在中高端三层交换机上支持,二层交换机上敲不进去。另外,一旦接口变成路由口,它就不再属于任何 VLAN,switchport相关的命令全部失效——要切回去得用switchport命令恢复。
提示:做设备互联的时候,我个人的偏好是"互联用路由口,业务用 SVI"。这样职责清晰:路由口负责设备之间跑路由协议,SVI 负责接入终端的网关。混着用容易在排查时绕晕自己。
5. 验证与排错:ping 通了不代表配置就对了
配置完成之后的验证环节,很多人只做一件事:ping。ping 通就收工,ping 不通就瞎改。这两种做法都不可取。ping 通只能说明"这条路能走",说明不了走的是不是你想的那条路,也说明不了配置有没有冗余或隐患。
5.1 分层验证的顺序不能乱
我习惯按"从下往上、从近到远"的顺序验证:
- 同 VLAN 内互通:PC1 ping 同 VLAN 的另一台设备。通了说明接入层没问题。
- PC ping 本 VLAN 网关:比如 PC1 ping 192.168.10.1。通了说明 SVI 和二层路径到核心都正常。
- PC ping 对端 VLAN 网关:PC1 ping 192.168.20.1。通了说明三层转发生效了。
- PC ping 对端 PC:PC1 ping 192.168.20.20。通了说明整条链路闭环。
四步走下来,哪一步断的,问题范围立刻缩小到那一层。比直接跨 VLAN ping 然后盯着"Request timed out"发呆高效太多。
5.2 排错时值得反复看的几条 show 命令
| 命令 | 看什么 | 常见异常 |
|---|---|---|
show vlan brief | VLAN 是否存在、接口归属 | 接口没划进 VLAN,或 VLAN 未创建 |
show interfaces trunk | Trunk 状态、封装、放行列表 | 放行列表缺 VLAN,模式不是 trunk |
show interfaces switchport | 接口的 access/trunk 属性 | 模式残留,native vlan 不一致 |
show ip interface brief | SVI 是否 up、地址是否正确 | SVI down,地址掩码写错 |
show ip route | 直连路由是否存在 | 缺路由,说明 SVI 没起来 |
show arp | 网关是否学到主机 MAC | ARP 表空,说明二层不通 |
show mac address-table | MAC 从哪个口学到 | MAC 学习不到,或学到错误接口 |
show ip protocols | 动态路由协议状态(如果用了) | 邻居没起来 |
这里面show arp特别值得说。ARP 表是二层和三层之间的桥梁,如果 PC ping 网关不通,先在核心上看show arp,能不能看到 PC 的 IP 和 MAC 映射。看不到,说明 ARP 请求根本没到达 SVI,问题在二层;能看到但 ping 不通,问题可能在三层(比如 ACL、路由)。这一条命令能把问题范围一刀切成两半。
5.3 抓包看 ARP 与 ICMP 的实际走向
如果条件允许(模拟器一般支持抓包),在关键链路上抓一次包,看到的会比想象中直观。你会看到这样一串交互:
- PC1 发出ARP 请求,广播,问 192.168.10.1 的 MAC。注意这个包不带 VLAN 标签,因为是从 access 口进来的。
- Trunk 链路上这个 ARP 请求被打上 VLAN 10 的标签。
- 核心交换机回应 ARP,回包打 VLAN 10 标签从 Trunk 下去,到接入交换机解标签发给 PC1。
- PC1 拿到网关 MAC,发出ICMP Echo Request,目的 MAC 是网关。
- 核心交换机路由之后,把包从 VLAN 20 侧发出,此时目的 MAC 已经变成 PC2 的 MAC,源 MAC 变成 SVI 20 的 MAC。
- PC2 回 ICMP Echo Reply,同样要经一次跨网段路由。
看懂这串交互,你对"VLAN 间通信"的理解就不再停留在命令层面了,而是能画出每一个包在设备内部的完整轨迹。这种理解在排查复杂问题时特别值钱。
6. 翻车现场复盘:几个我实际踩过的坑
前面讲的是"应该怎么做",这一段讲"实际会怎么错"。这些坑有的我踩过,有的是看别人踩的,共同点是:配置看起来都对,就是不通。
6.1ip routing忘了开,SVI 成了摆设
这是排第一的坑。三层交换机上 SVI 配得好好的,地址、掩码全对,show ip interface brief显示 up,但 PC 就是 ping 不通对端 VLAN。show ip route一看,直连路由都在,但跨网段的包就是不动。
问题就在ip routing。设备处于纯二层模式时,SVI 上的 IP 只是"给自己用的",用于管理访问,不会参与转发。只有开了ip routing,设备才会把这些直连网段当作可路由的网段,才会在收到目的 MAC 是自己时把包交给三层引擎。
排查动作很简单:show running-config | include ip routing。如果什么都没输出,那就是没开。敲上ip routing,立刻就通。
6.2 Trunk 放行列表少写了一个 VLAN
switchport trunk allowed vlan 10,20这行,写的时候很容易漏。比如后来加了个 VLAN 30,VLAN 建了,SVI 也配了,但 Trunk 上忘了加 30,结果 VLAN 30 的所有流量在 Trunk 上直接被丢弃。表现就是:VLAN 30 内部互通正常,但 ping 不了网关,也访问不了其他 VLAN。
排查看show interfaces trunk,在 "Vlans allowed and active in management domain" 那一行找你的 VLAN 号。不在里面,就是被挡了。改的时候用:
Switch(config-if)# switchport trunk allowed vlan add 30注意这里必须用add关键字,直接写switchport trunk allowed vlan 30会把原来的 10 和 20 覆盖掉,变成一个只放行 30 的 Trunk,然后 VLAN 10 和 20 立刻全断。这个操作是典型的"改一个坏一片",我见过不止一次有人因此半夜被叫起来处理。
6.3 ACL 悄悄把包拦了
跨 VLAN 不通还有一种情况:ACL(访问控制列表)在起作用。VLAN 间通信一旦上了规模,运维往往会配 ACL 做访问控制,比如"财务 VLAN 不允许被办公 VLAN 访问"。这种 ACL 通常应用在 SVI 上(ip access-group)。
如果网络是接手别人的,配置里可能藏着你不知道的 ACL。排查方法:show ip interface vlan 10看有没有Outgoing access list或Incoming access list,再看show access-lists看规则内容。注意 ACL 的匹配顺序是从上往下、命中即停,最后如果没命中任何规则,默认是 deny 还是 permit 取决于类型——标准 ACL 和扩展 ACL 的默认行为都是"隐式拒绝",这一点经常被人忽略。
还有一种更隐蔽的是 VACL(VLAN ACL),应用在 VLAN 级别,show vlan access-map能看到。这个在排错时容易被漏掉,因为大家习惯只查接口上的 ACL。
6.4 native VLAN 不一致引发的诡异现象
native VLAN 的坑很典型:两端 native VLAN 不一致时,Trunk 依然能起来,但流量会出现难以解释的错乱。
原理是这样的:VLAN 1 的帧通过 Trunk 时不打标签(因为默认 native VLAN 是 1)。如果一端 native VLAN 是 1,另一端是 99,那么从 A 端发出的 VLAN 1 无标签帧,到了 B 端会被 B 当成 VLAN 99 的帧收下。于是 VLAN 1 的流量莫名其妙跑到了 VLAN 99 里,VLAN 99 的 PC 收到不该收的广播。
更糟的是,这种问题不会影响 Trunk 的 up 状态,show interfaces trunk上大部分时候也不会直接报错,只有部分新型号会提示 native VLAN mismatch。所以很多人查了半天查不出来。养成习惯:Trunk 两端 native VLAN 保持一致,show interfaces switchport里对比两端的 Native VLAN 那一行。
6.5 PC 侧的低级错误往往最容易被忽略
排了半天设备配置,最后发现是 PC 自己的问题,这种经历人人都有。常见的几个:
- 网关没填或填错:跨网段流量压根发不出去。
- 掩码写错:比如把 /24 写成 /16,PC 会认为对端在同一网段,于是直接发 ARP 找对方 MAC,永远找不到。
- IP 地址冲突:两台 PC 用了同一个 IP,ARP 表会来回跳。
- 防火墙软件拦截:尤其是 Windows 自带的防火墙,默认可能拦 ICMP 回显请求。表现是"能 ping 通网关,但对方 ping 不通我"。
排查时,先在 PC 上用ipconfig/ifconfig确认地址、掩码、网关三件套,再在 PC 上ping 网关。这一步能排除掉一大半"其实是 PC 的问题"。
7. 通了之后还要做什么:管控、自动化与扩展
VLAN 间通信配通只是起点。真实的网络里,通了之后紧接着要来的是三件事:管住谁能访问谁、让主机自动拿到地址、以及设备数量上来之后的路由打通。
7.1 用 ACL 管住 VLAN 之间的访问关系
默认情况下,VLAN 间通信打通之后是全互通的。这在安全上通常不可接受——财务 VLAN 和访客 VLAN 显然不该随便互访。做法是在 SVI 上挂 ACL。
一个常见的需求是"只允许办公 VLAN 访问财务 VLAN 的某个服务器,其他一律拒绝"。用扩展 ACL 实现:
CoreSwitch(config)# ip access-list extended OFFICE_TO_FIN CoreSwitch(config-ext-nacl)# permit ip 192.168.10.0 0.0.0.255 host 192.168.20.100 CoreSwitch(config-ext-nacl)# deny ip 192.168.10.0 0.0.0.255 192.168.20.0 0.0.0.255 CoreSwitch(config-ext-nacl)# permit ip any any CoreSwitch(config-ext-nacl)# exit CoreSwitch(config)# interface vlan 10 CoreSwitch(config-if)# ip access-group OFFICE_TO_FIN in这里有几处细节值得注意。通配符掩码是反的:0.0.0.255 表示"前 24 位必须匹配",不是 255.255.255.0,写错就完全不是你想要的效果。最后那条permit ip any any很关键,否则隐式拒绝会把所有其他流量(包括回程)一起干掉,表现就是"配了 ACL 之后整片 VLAN 都上不了网"。挂的方向(in / out)也要想清楚,in表示在进入 SVI 时检查,也就是从该 VLAN 出去的流量。
7.2 用 DHCP 中继让每个 VLAN 自动拿到地址
手动给每台 PC 配 IP 在实验里没问题,生产环境里不现实。通常做法是在某台服务器上跑 DHCP,然后在各 SVI 上用ip helper-address指向它:
CoreSwitch(config)# interface vlan 10 CoreSwitch(config-if)# ip helper-address 192.168.99.10 CoreSwitch(config-if)# exitDHCP 请求本身是广播,正常情况下广播不会跨网段。ip helper-address的作用就是把这个广播转成单播,转发给指定的 DHCP 服务器,服务器再根据请求来源网段分配对应地址。这样一来,一台 DHCP 服务器就能服务所有 VLAN,不用每个网段都部署一台。
注意:
ip helper-address默认会转发好几种 UDP 广播(不只是 DHCP),如果不希望其他广播被转发,可以用no ip forward-protocol udp之类的命令关掉不需要的类型。这个细节在小网络里影响不大,但网络一大就值得关注。
7.3 多台三层交换机之间怎么打通
单台三层交换机能覆盖的网络规模有限。当网络扩展到多台三层交换机时,VLAN 间通信的问题就变成"跨设备的路由"问题。常见做法有两种。
一种是每台设备都作为自己所辖 VLAN 的网关,然后设备之间跑动态路由协议(比如 OSPF)把各自网段宣告出去。这样每个 VLAN 的流量就近上到本地的三层交换机,转发效率高,也不会有单点故障。设备互联用的接口建议用前面提到的no switchport路由口。
另一种是所有 VLAN 的网关集中在核心,接入层只做二层。这种做法的好处是网关统一、策略集中,坏处是故障域集中——核心挂了整网受影响,而且跨设备的二层链路要靠生成树管理,规模大了容易出问题。
选择哪种,取决于网络规模和运维能力。我个人的看法是:中小规模用集中网关更简单,规模上去之后,网关必须下沉,否则核心会成为永远绕不过去的瓶颈和风险点。
7.4 配置留痕:show run之外你还需要一份文档
最后说一个容易忽略的事。配置跑通之后,把show running-config保存下来(write memory或者copy running-config startup-config),同时在外部维护一份地址规划文档:哪个 VLAN 对应哪个网段、哪台设备是网关、Trunk 上都放行了哪些 VLAN、ACL 的策略意图是什么。
终端的网络配置里,最贵的成本不是敲命令的时间,是半年后接手的人(很可能就是你自己)面对一堆配置猜不出意图。我自己的习惯是,配置里的 VLAN name 写清楚用途,SVI 上如果挂了 ACL,就在描述或注释里写一句为什么。这些额外花费的两分钟,将来能省下几个小时。
真正把 VLAN 间通信做扎实,靠的不是记住那几条命令——命令网上到处都是。靠的是理解"二层隔离、三层转发"这条主线,然后顺着它把每一段链路、每一个包的去向都想明白。这个思路理顺了,换成别的厂商设备,逻辑也是一样的,无非命令名字变了而已。