eNSP实战:三层交换机实现VLAN间路由配置与排错

前阵子有人在群里贴了一张 eNSP 的拓扑截图,两台 PC 分别挂在 VLAN 10 和 VLAN 20 里,网关都指向了同一台三层交换机,可ping就是不通,下面一堆人开始猜是模拟器的锅。我看了眼配置,问题其实很朴素:三层交换机上联口的 trunk 没放行对应的 VLAN,包到了交换机门口就被拦下来了。这类问题在网上问得特别多,但大多数回答只给一段命令,不解释“为什么这么配”,于是换个拓扑又不会了。

这篇就把eNSP 学习——利用三层交换机实现 VLAN 间路由这件事从头到尾拆干净。它解决的是什么问题?VLAN 在二层把广播域切开了,切成了一块一块互不相通的孤岛,可现实里财务的机器要访问研发的文件服务器,办公网要访问打印服务器,孤岛之间必须要有路。VLAN 间路由就是修这条路,而三层交换机是目前企业网里最主流、最划算的修路方案。这篇适合三类人:刚接触交换机配置、命令还背不利索的新手;做过单臂路由、想搞清楚三层交换到底强在哪的人;以及配完能通、但一断就抓瞎、不知道怎么查的人。全程基于 eNSP 模拟器实操,命令给全,参数讲透,坑也一并标出来。

1. 方案选型:为什么我把网关放在三层交换机上

1.1 先想明白一件事:VLAN 切开的是广播,不是“网段”

很多人一开始会把 VLAN 和网段混为一谈,觉得“划了 VLAN 就等于划了网段”。严格说,VLAN 是二层概念,它干的事是限制广播帧的泛洪范围,同时把不同 VLAN 的端口在二层做隔离——同一个 VLAN 内的机器可以靠 MAC 直接通信,跨 VLAN 的帧根本递不过去。而网段是三层概念,决定的是“这个 IP 我能不能直接递出去,还是得交给网关”。

这两个东西通常是成对出现的:一个 VLAN 配一个子网,网关地址落在三层设备上。但它们是独立的两层,可以只划 VLAN 不配三层(那就永远出不去),也可以一个 VLAN 里塞多个子网(不推荐,但技术上成立)。

真正卡住通信的地方在于:PC1 在 192.168.10.0/24,要访问 192.168.20.0/24 的 PC2,它俩掩码一算就知道不在同一网段,PC1 不会去 ARP 找 PC2 的 MAC,而是直接把包发给自己的默认网关。包到了网关,后面怎么走就是网关的事了。所以“VLAN 间路由”的本质是:让一台设备同时属于多个 VLAN 的三层,收到一个 VLAN 的包,再从另一个 VLAN 发出去。想清楚这一点,后面所有配置都只是在回答一个问题——怎么让这台设备“同时站在两个 VLAN 里”。

1.2 单臂路由和三层交换,我为什么选后者

实现 VLAN 间路由有两条路。传统做法叫单臂路由:一台路由器,一个物理口接交换机的 trunk,然后在路由器上把这个物理口拆成若干子接口,每个子接口对应一个 VLAN、配一个网关地址、打上dot1q vid封装。这个方案在早期很流行,原理也干净,但问题很明显——所有跨 VLAN 流量都挤在那一条物理链路上,一进一出都得走这根“胳膊”,带宽直接砍半,而且路由器转发靠软件,时延和吞吐都上不去。

三层交换机走的是另一条路:硬件里同时有二层交换芯片和路由查表能力,跨 VLAN 的第一个包要经过一次路由查表(也就是“一次路由”),后续同一条流直接靠硬件 ASIC 转发(“多次交换”)。这句话的意思不是玄学,它的效果是:吞吐能做到线速,时延基本可以忽略,而且不需要额外一台路由器。

我实测对比过同一拓扑下的两种方案,用大包打流的时候差距非常直观。所以只要预算允许、且网络中确实存在大量跨 VLAN 互访,三层交换基本是默认答案。单臂路由不是不能用,它在小型分支、临时组网、或者手头只有路由器没有三层交换机的时候依然有价值,只是别把它当成主力方案。

1.3 三层交换机的两条实现路线:VLANIF 和物理三层口

这一点很多人没搞清楚,导致看别人配置时觉得对不上。三层交换机上做网关,实际有两种做法:

第一种是VLANIF(虚接口),也是绝对主流:先vlan batch建 VLAN,再interface Vlanif 10进去配 IP,这个 IP 就是这个 VLAN 内所有主机的网关。VLANIF 的状态由这个 VLAN 内是否有 up 的物理成员口决定——如果 VLAN 10 里一个 up 的口都没有,VLANIF 10 就是 down 的,网关自然不可用。这是新手最容易踩的坑,后面会专门讲。

第二种是把物理口变成三层口,直接在上面配 IP。部分型号支持undo portswitch,敲完这个命令,这个接口就从二层口变成了三层路由口,不再属于任何 VLAN。这种方式适合点对点互联(比如三层交换机之间、交换机连防火墙),不适合做主机网关——因为一个物理口只能有一个 IP,你没法让一个口同时当十个 VLAN 的网关。

所以结论很明确:做 VLAN 间路由的网关,用 VLANIF;做设备间三层互联,两种都行,物理三层口更省事。这个区分想清楚了,看配置就不会糊涂。

1.4 网关下沉带来的影响范围

把网关放在三层交换机上,不只是“配个 IP 能通”这么简单,它会改变整个二层网络的设计逻辑。我在实际项目里总结了几条影响:

  • 广播域被人为切小,每个 VLAN 一个广播域,ARP 广播、DHCP 广播、各种发现协议的泛洪都被限制在本 VLAN 内,终端数量一多,这个收益非常明显;
  • 故障域跟着变小,某个 VLAN 里出现广播风暴或者 MAC 地址漂移,影响面基本被圈在那一个 VLAN 里,不会整网瘫;
  • STP 的收敛压力下降,因为生成树要算的拓扑规模小了,但要注意 VLAN 数量多了以后 MSTP 的实例规划要跟上;
  • 网关从“单点”变成“分布”,如果每个接入层都有一台三层设备做本楼层网关,那么一台挂了只影响本楼层,代价是路由表变大、管理复杂度上升;
  • 扩容更灵活,新增一个部门就是新建一个 VLAN + 一个 VLANIF,不用动物理布线。

反过来说,代价是三层交换机的配置复杂度上去了,路由表、ACL、DHCP 中继这些东西都得管。这就是为什么我一再强调要先把原理搞明白——配置只是原理的投影。

2. 拓扑设计与地址规划:动手前先把图纸画清楚

2.1 拓扑怎么搭才不容易塌

我在 eNSP 里用的是一套“两台接入 + 一台核心三层”的经典结构,规模不大但把关键点全覆盖了:

  • LSW1(二层接入):GE0/0/1 接 PC1(VLAN 10),GE0/0/2 接 PC2(VLAN 20),GE0/0/24 上行接核心;
  • LSW2(二层接入):GE0/0/1 接 PC3(VLAN 20),GE0/0/2 接 PC4(VLAN 30),GE0/0/24 上行接核心;
  • LSW3(三层核心):GE0/0/1 接 LSW1,GE0/0/2 接 LSW2,上面建三个 VLANIF 当网关。

这么设计的用意:让“同一个 VLAN 跨两台接入交换机”和“同一台交换机上多个 VLAN”两种情况同时存在,这样 trunk 配置和 VLANIF 配置都会被真实检验一遍。如果只在一台交换机上做单机实验,很容易漏掉 trunk 放行这一环,到真实环境就翻车。

提示:eNSP 里的交换机启动需要时间,设备图标边上的小圆点变绿才算彻底起来,急着敲命令会遇到“接口不存在”或者敲一半卡住的情况。我的习惯是一次性把设备全拖出来、全启动,然后去倒杯水,回来再连线和配置。

2.2 地址与 VLAN 规划表

规划这事不能省,尤其是 VLAN ID 和网段的对应关系,随手写会导致后期查问题时自己都看不懂。我这次用的规划如下:

项目VLAN ID网段网关地址成员
办公区VLAN 10192.168.10.0/24192.168.10.1PC1
研发区VLAN 20192.168.20.0/24192.168.20.1PC2、PC3
服务器区VLAN 30192.168.30.0/24192.168.30.1PC4
互联链路不划二层 trunk无交换机之间

几个细节值得说一下。第一,我把网关统一用.1而不是.254,纯粹是个人习惯,图个顺手,实际项目里两种都常见,关键是全网统一,别一半.1一半.254给自己找麻烦。第二,VLAN ID 和子网的第三段做了对应(VLAN 10 → 192.168.10.x),这样看 IP 就能猜出 VLAN,排查效率高很多。第三,交换机之间的互联链路不配 IP,纯二层透传,因为三层网关已经在 VLANIF 上了,链路层不需要额外的地址。

2.3 掩码和网关这两个参数,写错了最难查

我在帮人看配置的时候,十个问题里有三个是掩码写错。PC 的掩码写成255.255.0.0,那它认为 192.168.10.x 和 192.168.20.x 是同一个网段,压根不会去找网关,直接 ARP 找对方的 MAC——而二层递不过去,结果就是不通,而且现象特别迷惑:网关 ping 得通,对方就是 ping 不通。

还有一种情况是网关地址和 PC 不在同一个网段,那 PC 连网关都 ARP 不到,直接不通。所以我在 eNSP 里配完 PC 之后,一定会做一次自检:先ping自己的网关,通了再ping别的 VLAN,分两步走比一步到位好定位得多。

3. eNSP 实操全过程:从空白设备到跨 VLAN 通

3.1 二层接入侧:VLAN 创建与端口类型

先配 LSW1。核心动作就三件:建 VLAN、把接 PC 的口设成 access 并划进对应 VLAN、把上行口设成 trunk 并放行要过的 VLAN。

<LSW1>system-view [LSW1]sysname LSW1 [LSW1]vlan batch 10 20 [LSW1]interface GigabitEthernet0/0/1 [LSW1-GigabitEthernet0/0/1]port link-type access [LSW1-GigabitEthernet0/0/1]port default vlan 10 [LSW1-GigabitEthernet0/0/1]quit [LSW1]interface GigabitEthernet0/0/2 [LSW1-GigabitEthernet0/0/2]port link-type access [LSW1-GigabitEthernet0/0/2]port default vlan 20 [LSW1-GigabitEthernet0/0/2]quit [LSW1]interface GigabitEthernet0/0/24 [LSW1-GigabitEthernet0/0/24]port link-type trunk [LSW1-GigabitEthernet0/0/24]port trunk allow-pass vlan 10 20 [LSW1-GigabitEthernet0/0/24]quit

LSW2 同理,只是 VLAN 换成 20 和 30,上行口同样放行这两个。

这里有几个“为什么”必须说清楚。

port link-type access的意思是“这个口只属于一个 VLAN,进来的无标签帧一律打上这个 VLAN 的标签”。接 PC 的口必须是 access,因为 PC 不会打 VLAN 标签,它发出来的就是最普通的以太网帧。

port link-type trunk是“这个口可以承载多个 VLAN 的帧,通过的帧带 802.1Q 标签”。交换机之间互联必须用 trunk,否则不同 VLAN 的流量过不去。

而port trunk allow-pass vlan 10 20这一句,是白名单。trunk 口默认只放行 VLAN 1,其他 VLAN 一律丢弃——这正是开头说的那个案例翻车的原因。我见过太多人 trunk 配完就以为完事了,结果 VLAN 10 的包到了交换机上行口被静默丢弃,日志里啥也没有,只能靠猜。所以我的习惯是敲完这句立刻display port vlan确认一遍。

[LSW1]display port vlan

输出里能看到每个接口的 PVID 和 Trunk VLAN List,一眼就能看出上行口是不是真的放行了 10 和 20。这一步花十秒,能省后面半小时。

提示:如果想让配置更省事,可以用port trunk allow-pass vlan all放行所有 VLAN。但我不推荐在生产里这么干——这相当于取消了白名单,任何一个误建的 VLAN 都能直接透传过去,安全和排错上都吃亏。实验环境图省事可以用,正式配置还是老老实实写具体 VLAN。

3.2 三层核心侧:VLANIF 是网关的“肉身”

现在配 LSW3。先把 VLAN 建出来,再为每个 VLAN 创建一个 VLANIF 并配上地址,最后把连接两个接入交换机的下行口都设成 trunk。

<LSW3>system-view [LSW3]sysname CoreSW [CoreSW]vlan batch 10 20 30 [CoreSW]interface Vlanif 10 [CoreSW-Vlanif10]ip address 192.168.10.1 24 [CoreSW-Vlanif10]quit [CoreSW]interface Vlanif 20 [CoreSW-Vlanif20]ip address 192.168.20.1 24 [CoreSW-Vlanif20]quit [CoreSW]interface Vlanif 30 [CoreSW-Vlanif30]ip address 192.168.30.1 24 [CoreSW-Vlanif30]quit [CoreSW]interface GigabitEthernet0/0/1 [CoreSW-GigabitEthernet0/0/1]port link-type trunk [CoreSW-GigabitEthernet0/0/1]port trunk allow-pass vlan 10 20 [CoreSW-GigabitEthernet0/0/1]quit [CoreSW]interface GigabitEthernet0/0/2 [CoreSW-GigabitEthernet0/0/2]port link-type trunk [CoreSW-GigabitEthernet0/0/2]port trunk allow-pass vlan 20 30 [CoreSW-GigabitEthernet0/0/2]quit

ip address 192.168.10.1 24里的24是掩码位数的简写,等价于255.255.255.0,命令行里两种写法都认,简写敲起来快。

配完必须验证 VLANIF 是不是真的起来了:

[CoreSW]display ip interface brief

正常的话应该看到三个 Vlanif 都是UP状态,Protocol 也是UP。如果某个 Vlanif 显示 down,八成是这个 VLAN 里没有任何一个 up 的物理成员口——比如 VLAN 30 只在 LSW2 上有端口,而 CoreSW 的 GE0/0/2 又没放行 VLAN 30,那 CoreSW 上的 Vlanif 30 就是 down 的,网关自然不生效。这是 VLANIF 机制的核心,理解了它,很多“明明配了 IP 却不通”的怪现象就都有解了。

3.3 主机侧配置与第一次验证

eNSP 里的 PC 是双击打开面板直接填 IP、掩码、网关,比敲命令省事。填的时候注意三点:IP 在该 VLAN 网段内、掩码统一255.255.255.0、网关填对应 VLANIF 的地址。填完点“应用”,别直接关窗口,不点应用等于没填。

配置完成后按这个顺序验证,每一步都有明确的判断依据:

# 第一步:PC1 ping 自己的网关 PC1> ping 192.168.10.1 # 第二步:PC1 ping 同 VLAN 的地址(网关已经通了,这步通常没问题) # 第三步:PC1 ping 跨 VLAN 的 PC2 PC1> ping 192.168.20.11 # 第四步:PC1 ping 跨交换机跨 VLAN 的 PC3 PC1> ping 192.168.20.12

第一跳能通,说明接入层的 VLAN 划分和 VLANIF 都没问题;第三跳能通,说明核心交换机的路由转发和双向 trunk 都正常。我习惯把这个顺序当成固定流程,哪一步断了自己就知道问题在哪一层,比一上来就 ping 最终目标然后一脸茫然高效得多。

在核心交换机上看一眼路由表,会更有感觉:

[CoreSW]display ip routing-table

你会看到三条直连路由:192.168.10.0/24、192.168.20.0/24、192.168.30.0/24,出接口分别是对应的 Vlanif。这三条就是跨 VLAN 转发的依据——收到目的地址是 192.168.20.x 的包,查表命中直连路由,从 Vlanif 20 发出去。整个过程不需要任何静态路由,因为三个网段都在同一台设备上,天然直连。

3.4 抓一次包,把转发过程看明白

这一步我觉得比配十条命令都值。在 CoreSW 的 GE0/0/1 上启抓包,然后 PC1 去 ping PC2,看两个包就够了:

第一个包是 PC1 发的 ARP 请求,问“192.168.10.1 的 MAC 是多少”。注意它问的是网关,不是 PC2——因为 PC1 一算掩码就知道 PC2 不在自己网段。CoreSW 用自己的 Vlanif 10 的 MAC 回了一个 ARP 应答。

第二个包是 ICMP 请求,源 IP 是 PC1、目的 IP 是 PC2,但目的 MAC 是网关的 MAC。包到了 CoreSW,它查路由表发现 192.168.20.0/24 是直连,于是重新封装:源 MAC 换成 Vlanif 20 的 MAC,目的 MAC 换成 PC2 的 MAC,TTL 减 1,从 Vlanif 20 发出去。

这个过程解释了一个特别关键的现象:PC1 的 ARP 表里永远只有网关的 MAC,不会有 PC2 的 MAC。如果你在 PC1 上arp -a看到了对方 PC 的 MAC,那说明它俩被判定成同网段了——十有八九是掩码配错了。这条判据我在排错时用得最多,几乎一抓一个准。

4. 排错实录:ping 不通时我按这个顺序查

4.1 分层排查五步法

网络排错最忌讳“东一榔头西一棒子”,我固定按从下往上五步走,基本不会漏。

第一步,查物理和接口状态。display interface brief看接口是不是 up。eNSP 里经常出现设备起来了但连线没生效、或者接口被 shutdown 的情况。

第二步,查 VLAN 与端口类型。display vlan看 VLAN 是否创建、成员口对不对;display port vlan看 access 口的 PVID、trunk 口的放行列表。这一层的问题占了实际故障的一大半。

第三步,查 VLANIF 状态与地址。display ip interface brief看三个 Vlanif 是不是都 UP,地址和掩码有没有写错。重点看掩码,24敲成16这种手滑太常见了。

第四步,查主机侧配置。IP、掩码、网关三件套,加上“有没有点应用”。

第五步,抓包看包到底走到哪。在前面四步都正常的情况下,抓包是唯一能给出确定答案的手段——看 ARP 有没有回应、看 ICMP 请求有没有出去、看回包有没有回来。

这五步走完,95% 的问题都能定位。剩下那 5%,往往是模拟器本身的问题,下面单独说。

4.2 常见问题速查表

现象最可能的原因验证命令处理方式
网关都 ping 不通access 口 PVID 配错,或 PC 网关地址写错display port vlan修正 PVID 或 PC 网关
同交换机跨 VLAN 不通VLANIF 未创建或 downdisplay ip interface brief建 VLANIF,确认 VLAN 内有 up 口
跨交换机不通,同交换机通trunk 未放行对应 VLANdisplay port vlan补port trunk allow-pass vlan
部分 VLAN 通、部分不通某条链路的 trunk 放行列表不完整逐跳display port vlan两端放行列表保持一致
网关能 ping,跨 VLAN 时通时不通主机掩码写错,或存在 IP 冲突arp -a、抓包统一掩码,排查重复 IP
配完一开始能通,过一会儿断设备重启导致配置丢失(未保存)重新display current-configuration配置完执行save

4.3 eNSP 特有的几个坑

模拟器毕竟不是真机,有些现象真机上根本见不到,但能把人折腾半天。

坑一:设备启动慢,接口状态不对。eNSP 启动一台交换机要十几秒,这期间你去敲命令,可能提示接口不存在,或者显示 up 但实际没通。我的经验是看设备图标旁边的小圆点,绿了再动手,别抢那几秒。

坑二:VLANIF 一直 down。真机上只要 VLAN 里有 up 的口,VLANIF 就 up。但 eNSP 里如果两端 trunk 的放行列表不一致,可能出现一侧的 VLANIF 因为收不到该 VLAN 的流量而状态异常(部分版本表现如此)。遇到这种情况,先确认两端 trunk 放行列表完全一致,再看一眼display vlan里该 VLAN 有没有 up 的成员口。

坑三:PC 配置面板没点应用。这个错误极其常见,尤其是复制粘贴 IP 之后直接关窗口。养成点完应用再关的习惯。

坑四:配置没保存,重启全丢。eNSP 关掉设备再启动,配置就没了。实验做到一半想保存现场,一定要save:

<CoreSW>save The current configuration will be written to the device. Are you sure to continue? [Y/N]y

坑五:抓包选错接口。在 access 口抓包看不到 VLAN 标签(因为 access 口进出都是无标签帧),想看 802.1Q 封装必须在 trunk 口抓。这个细节很多人搞混,导致“明明配了 VLAN 怎么抓不到标签”的困惑。

提示:如果display interface brief显示接口 up,但 ping 网关丢包严重,可以先把 eNSP 里其他无关设备关掉,降低模拟器负载。模拟器跑满 CPU 的时候,转发延迟会明显变大,表现为“时通时不通”,很容易被误判成配置问题。

5. 把实验往真实场景推一步

5.1 加一条默认路由,让内网能出公网

实验里三个 VLAN 都在一台设备上,不需要任何路由协议。但真实网络里,三层交换机下面还有出口设备,这时候就得加一条默认路由指向出口:

[CoreSW]ip route-static 0.0.0.0 0.0.0.0 192.168.1.254

意思是“所有我不认识的目的地址,统统交给 192.168.1.254”。这条路由配上之后,内网访问公网才有出路。同时别忘了出口设备上要有回程路由,指向这三个网段,或者做 NAT——单边有路由、回包没路由,是新手最常见的“能出去回不来”。

5.2 顺手把 DHCP 也接上

每个 VLAN 手动配 IP 在实验里无所谓,真实环境得用 DHCP。三层交换机上直接开地址池最省事:

[CoreSW]dhcp enable [CoreSW]ip pool vlan10 [CoreSW-ip-pool-vlan10]network 192.168.10.0 mask 255.255.255.0 [CoreSW-ip-pool-vlan10]gateway-list 192.168.10.1 [CoreSW-ip-pool-vlan10]dns-list 114.114.114.114 [CoreSW-ip-pool-vlan10]quit [CoreSW]interface Vlanif 10 [CoreSW-Vlanif10]dhcp select global [CoreSW-Vlanif10]quit

关键在最后那句dhcp select global——VLANIF 上必须显式指定用全局地址池,否则 DHCP 请求上来了设备也不知道该给哪个池的地址。这一步漏掉,现象是 PC 一直拿不到 IP,而display ip pool里地址池看着一切正常,非常迷惑。

5.3 用 ACL 给 VLAN 之间加一道闸

VLAN 间路由一旦通了,意味着所有 VLAN 全互通——这在很多场景下是不能接受的,比如访客网就不该访问服务器区。控住的办法是在 VLANIF 上挂 ACL:

[CoreSW]acl 3000 [CoreSW-acl-adv-3000]rule deny ip source 192.168.10.0 0.0.0.255 destination 192.168.30.0 0.0.0.255 [CoreSW-acl-adv-3000]rule permit ip [CoreSW-acl-adv-3000]quit [CoreSW]interface Vlanif 10 [CoreSW-Vlanif10]traffic-filter inbound acl 3000

注意0.0.0.255是通配符掩码,跟子网掩码是反着来的,别写错。还有顺序:ACL 是从上往下匹配,命中就停,所以deny要写在permit前面,否则后面的规则永远不会生效——这个坑我在别人的配置里见过不止一次,现象是“ACL 明明配了但一点用没有”。

顺带说一句,ACL 挂上之后,跨 VLAN 的访问会变成“能 ping 通网关、但 ping 不通目标”,跟前面讲的 VLANIF down 表现类似,排查时要先看 ACL 计数:

[CoreSW]display acl 3000

看每条规则的匹配计数有没有涨,涨了就说明被拦了。

最后分享一个我自己的习惯:每次做完这类实验,我会把配置完整地display current-configuration存一份文本,旁边写上“这次踩了什么坑、怎么解的”。eNSP 里的实验做十遍不如踩一次坑记得牢,而那些坑,往往就是真实网络里让你加班到半夜的东西。