上周帮一个朋友收拾他办公室的网络,20多台电脑挤在一台二层交换机上,财务、行政、设计分属不同VLAN,平时文件互传一会儿能通一会儿断,修起来全靠手动改IP来回试。问题其实不复杂:二层交换机做不了跨网段路由,但为了这点规模直接换三层交换机又显得浪费。最典型的解法就是“单臂路由”,用一台华为路由器配合DHCP服务,一条物理链路把所有VLAN的网关和自动分配地址一次搞定。这篇文章我会完整走一遍华为设备的配置流程,从拓扑规划、交换机的VLAN与Trunk设置,到路由器的子接口封装、DHCP地址池下发,最后把排错思路也一并讲清楚。适合正在学网络基础、准备做实验验证,或者正在给小型办公网做VLAN间通信的人参考。
1. 单臂路由的适用边界:为什么二层交换机组不了跨网段通信
1.1 二层交换机的天然瓶颈
先想清楚一个底层逻辑:二层交换机的工作核心是MAC地址学习和帧转发,它只维护同一VLAN内的MAC表项,转发决策完全依赖目标MAC地址。一旦报文的目标IP不在本网段,PC会先把帧发给网关,而网关需要路由器来承担三层转发。交换机本身没有路由表,也没有IP路由决策能力,所以它能把同一个广播域里的帧转得飞快,但永远无法“跨过”VLAN这个边界。
VLAN的本质是把广播域隔开,隔离广播的同时也把三层通信的路堵死了。很多初学者栽跟头就在这:明明两台PC插在同一台交换机上,但因为被人为划到了不同VLAN,它们之间就是不通。这不是接线问题,是设计上缺少三层网关。
1.2 三种VLAN间通信方案的取舍
要解决VLAN间通信,常见有三条路,我做过项目都分别用在不同场景,对比一下更直观:
| 方案 | 核心原理 | 优点 | 缺点 | 典型适用场景 |
|---|---|---|---|---|
| 单臂路由 | 路由器物理接口拆成多个子接口,分别充当各VLAN网关 | 成本低、配置灵活、入门友好 | 流量集中到一条物理链路上,带宽受限 | 小型办公网、实验环境、临时过渡 |
| 三层交换机VLANIF | 在三层交换机上给每个VLAN创建VLANIF接口作为网关 | 转发性能强、可扩展性好 | 设备成本高,配置门槛略高 | 中大型园区网、核心层设备 |
| 路由器多物理接口 | 每VLAN占用一个独立物理接口作为网关 | 逻辑最清晰、带宽有保障 | 接口数量有限,成本高、布线麻烦 | 接口充裕且规模很小的场景 |
单臂路由之所以经典,不是因为性能强,而是因为“性价比极高”。一台只有两三个千兆口的路由器,也能通过子接口把十几个VLAN的网关全部承载下来。它唯一的性能瓶颈是所有VLAN共享一条物理链路,在小流量的办公网里根本不是问题。
1.3 “一根棍子串多个VLAN”的封装逻辑
单臂路由的英文叫Router-on-a-Stick,一根棍子上串满了VLAN。实现的关键是802.1Q协议:交换机在Trunk口发出的帧会把VLAN信息以Tag形式打在二层帧头里,路由器物理接口收到后,根据Tag编号把帧分发给对应的子接口处理。
子接口是一个物理接口上的逻辑接口,每一个子接口绑定一个VLAN ID,并且配置成该VLAN的网关IP。这样交换机视角里,Trunk口中继了一堆打了不同Tag的帧;路由器视角里,一个物理口被“切片”成了好几个逻辑网关。理解了这层封装关系,后面配置就顺了。
2. 配置前的网络规划:VLAN、网段与地址池一次算清
2.1 实验拓扑怎么搭
我用一个模拟项目X来演示,拓扑非常基础但够用:一台华为S5700二层交换机(SW1),一台华为AR2220路由器(R1),两台PC。PC1接SW1的GE0/0/1,PC2接GE0/0/2,SW1的GE0/0/24作为Trunk口上联R1的GE0/0/0。这里只用一台交换机就够了,如果实际环境里有多台交换机级联,只需要把交换机之间的链路也配成Trunk,并放行对应VLAN。
这个拓扑对应小型办公网的典型模型:不同部门划分不同VLAN,PC都接在二层交换机的Access口上,VLAN间的互访由路由器统一处理。
2.2 IP地址和DHCP地址池规划表
动手敲命令之前,先把地址规划写清楚,我习惯用一张表把事情定死:
| 对象 | VLAN | 接口/用途 | 网段 | 网关 |
|---|---|---|---|---|
| 办公区PC1 | VLAN 10 | SW1 GE0/0/1 | 192.168.10.0/24 | 192.168.10.1 |
| 财务区PC2 | VLAN 20 | SW1 GE0/0/2 | 192.168.20.0/24 | 192.168.20.1 |
| 路由器子接口 | VLAN 10 | R1 GE0/0/0.10 | - | 192.168.10.1 |
| 路由器子接口 | VLAN 20 | R1 GE0/0/0.20 | - | 192.168.20.1 |
DHCP地址池的规划上,我习惯把每个网段的“.1到.10”作为静态保留段,留给网关、服务器、打印机之类需要固定IP的设备,动态分配从.20开始。比如VLAN 10池子分配192.168.10.20到192.168.10.200,VLAN 20池子分配192.168.20.20到192.168.20.200。这样既避免了和网关冲突,也留了扩容余量。
2.3 规划阶段的三个“必须一致”
我踩过不少次数据不一致的坑,归纳下来,规划阶段必须盯紧三件事。
第一,DHCP池的gateway-list必须和路由器子接口的IP完全一致。如果子接口配了192.168.10.1,池子里的网关却填成192.168.10.254,PC拿到地址后会把网关指向一个不存在的地址,结果就是“能拿到IP但出不了网”。
第二,子接口的数量和VLAN ID必须和交换机放行的VLAN对应。交换机Trunk只放行了VLAN 10,路由器却有.20的子接口,那是永远收不到VLAN 20的帧的。
第三,PC的网段掩码要统一。规划里用的是255.255.255.0,如果哪台PC手滑设成了255.255.255.128,它自己和网关都不在一个网段里,通信必然失败。这些看起来是低级错误,实际上在真实维护中很常见。
3. 交换机侧准备:VLAN划分与Trunk放行的关键点
3.1 创建VLAN并把用户端口划进去
先登录交换机,改个设备名好区分,然后批量创建VLAN。华为S系列交换机是这么操作的:
<Huawei> system-view [Huawei] sysname SW1 [SW1] vlan batch 10 20接着把PC1和PC2的接口配成Access口并划入对应VLAN。Access口是VLAN划分里最常见的端口模式,它只属于一个VLAN,PC发出的无Tag帧进入交换机后会被自动打上该VLAN的Tag:
[SW1] interface GigabitEthernet0/0/1 [SW1-GigabitEthernet0/0/1] port link-type access [SW1-GigabitEthernet0/0/1] port default vlan 10 [SW1-GigabitEthernet0/0/1] quit [SW1] interface GigabitEthernet0/0/2 [SW1-GigabitEthernet0/0/2] port link-type access [SW1-GigabitEthernet0/0/2] port default vlan 20 [SW1-GigabitEthernet0/0/2] quit这里有个小细节:port default vlan命令对Access口来说就是设置PVID,同时也决定这个端口属于哪个VLAN。很多新手会漏掉port link-type access这一步,导致端口默认工作在Hybrid模式,配置逻辑完全不一样,后续排查时容易把自己绕晕。
3.2 上联路由器的口必须配成Trunk
交换机和路由器之间这条链路口要配成Trunk,并放行VLAN 10和VLAN 20。原理很简单:子接口要收到带对应VLAN Tag的帧,交换机必须允许这些VLAN从中继链路通过:
[SW1] interface GigabitEthernet0/0/24 [SW1-GigabitEthernet0/0/24] port link-type trunk [SW1-GigabitEthernet0/0/24] port trunk allow-pass vlan 10 20注意,我没有配置Trunk的PVID,让它保持默认值VLAN 1。这是什么意思呢?如果路由器物理接口发出不带Tag的帧,交换机就会认为它属于PVID对应的VLAN,也就是VLAN 1。正常情况下路由器物理接口不配置IP,只跑子接口,所有帧都带Tag,所以不会被错误划分。但如果你手多,在路由器物理口上也配了一个IP,那就容易产生“莫名其妙多了一个VLAN 1网关”的问题。所以我的建议是:物理接口保持不配IP,让它安安静静做子接口的载体。
3.3 检查交换机的配置结果
配置完不要马上走人,先看一遍结果。华为交换机的两个常用检查命令:
[SW1] display vlan [SW1] display port vlan第一个命令能看到VLAN 10和VLAN 20是否存在,端口划分是否正确;第二个命令能直接显示每个接口的链路类型、PVID以及所属VLAN,是排查Trunk放行问题最快的工具。如果你发现GE0/0/24的“Allow-pass”列表里只有VLAN 1,说明放行命令没生效或没保存,VLAN 10和VLAN 20的帧根本过不去。
4. 路由器侧核心配置:子接口封装与ARP广播
4.1 为什么不能直接在物理接口上配IP
很多人第一次接触单臂路由时会有疑问:不就是在路由器上给不同网段配几个IP吗,为什么还要搞子接口?
因为物理接口处理不了带VLAN Tag的帧。交换机的Trunk口发出来的帧,二层头里带着一个4字节的Tag告诉别人“我是VLAN 10”或“我是VLAN 20”,路由器物理接口直接收上来后无法区分这些帧属于哪个VLAN。如果你只给物理接口配置一个IP,它最多只能作为其中一个VLAN的网关,其他VLAN的报文只能被丢弃。
子接口的作用就是给物理接口做逻辑切片:GE0/0/0.10只处理VLAN 10的帧,GE0/0/0.20只处理VLAN 20的帧,每个子接口各配各的IP,各当各的网关。交换机一看这个帧带Tag 10,就把它扔给.10子接口;帧带Tag 20,就扔给.20子接口。
4.2 华为路由器子接口的完整配置
华为AR系列路由器的子接口配置是这么写的:
<Huawei> system-view [Huawei] sysname R1 [R1] interface GigabitEthernet0/0/0.10 [R1-GigabitEthernet0/0/0.10] dot1q termination vid 10 [R1-GigabitEthernet0/0/0.10] ip address 192.168.10.1 24 [R1-GigabitEthernet0/0/0.10] arp broadcast enable [R1-GigabitEthernet0/0/0.10] quit [R1] interface GigabitEthernet0/0/0.20 [R1-GigabitEthernet0/0/0.20] dot1q termination vid 20 [R1-GigabitEthernet0/0/0.20] ip address 192.168.20.1 24 [R1-GigabitEthernet0/0/0.20] arp broadcast enable逐行解释一下。dot1q termination vid是子接口的“身份认证”,告诉路由器这个子接口只接收标识为指定VID的帧。这个命令只写错一个数字,就会导致该子接口完全收不到对应VLAN的报文。ip address就是给子接口配置IP地址并开启三层转发能力。后面那个arp broadcast enable是关键中的关键,下面单独说。
4.3 arp broadcast enable:华为设备上最容易漏的一行命令
华为的子接口默认不处理ARP广播帧,这和其他厂商的逻辑很不一样。PC要访问网关,第一步就是发ARP广播询问“192.168.10.1的MAC地址是多少”;PC要获取IP,第一步也要发DHCP DISCOVER广播。如果子接口不处理和转发这些广播帧,整个单臂路由就是摆设,症状会表现为:PC无法获得IP地址、ping网关超时、跨VLAN通信完全不通。
所以arp broadcast enable必须配。这行命令的作用是使子接口能够处理从该VLAN收到的ARP广播和其他广播报文,并且让CPU正常响应ARP请求。我在生产环境里见过太多人照着教材敲完dot1q termination vid和ip address就走了,结果怎么测都不通,最后加上这一行立刻正常。它不属于可省略的细节,而是华为单臂路由的必要配置。
4.4 验证路由器侧配置
配置完可以快速检查子接口状态:
[R1] display ip interface brief这个命令会列出所有三层接口的IP地址和物理状态。正常情况GE0/0/0.10和GE0/0/0.20都应该是UP状态,IP地址正确。如果子接口显示Down,一般问题出在物理链路没起来,或者交换机的Trunk口没配好、网线没插对。另外还能用这条命令看具体配置:
[R1] display current-configuration interface GigabitEthernet0/0/0.10可以看到dot1q termination vid 10、ip address和arp broadcast enable是否都在。少了任何一行,都建议先补回去再继续排查。
5. DHCP服务部署:全局地址池与接口地址池怎么选
5.1 两种DHCP模式的底层区别
子接口网关地址配好后,跨VLAN路由已经通了,下一步就是让PC自动拿到IP。华为路由器上DHCP有两种主流落地方式,区别先看表:
| 对比项 | 全局地址池 | 接口地址池 |
|---|---|---|
| 配置位置 | 独立配置,多个接口可调用 | 直接在接口下配置 |
| 地址池网段来源 | 手动指定network | 默认和接口IP同网段 |
| 管理灵活性 | 高,集中管理、复用性强 | 低,一个接口一个池 |
| 适合场景 | 多网段、有集中管理需求 | 单接口、快速部署 |
全局地址池就像是拿着一个“总账本”,所有网段的地址池集中在一个地方维护,每个子接口通过dhcp select global去总账本里拿对应网段的资源。接口地址池则比较“懒惰”,直接在接口下启用,自动基于接口IP所在的网段生成地址池,配置更短,适合临时玩一下或者只有一个网段的情况。
我在实际项目中更推荐全局地址池。因为后续如果要把DHCP服务从路由器迁移到独立服务器,或者要跨设备共享地址池,全局模式改起来容易得多;接口模式一旦接口IP变了,地址池网段也跟着变,容易发生意外冲突。
5.2 全局地址池配置示例
先在系统视图下开启DHCP功能,然后创建两个地址池并绑定对应网段、网关和DNS信息。这里我把.1到.10排除掉,不让它们参与动态分配:
[R1] dhcp enable [R1] ip pool vlan10 [R1-ip-pool-vlan10] network 192.168.10.0 mask 24 [R1-ip-pool-vlan10] gateway-list 192.168.10.1 [R1-ip-pool-vlan10] dns-list 223.5.5.5 [R1-ip-pool-vlan10] excluded-ip-address 192.168.10.1 192.168.10.10 [R1-ip-pool-vlan10] quit [R1] ip pool vlan20 [R1-ip-pool-vlan20] network 192.168.20.0 mask 24 [R1-ip-pool-vlan20] gateway-list 192.168.20.1 [R1-ip-pool-vlan20] dns-list 223.5.5.5 [R1-ip-pool-vlan20] excluded-ip-address 192.168.20.1 192.168.20.10 [R1-ip-pool-vlan20] quit然后在对应子接口下指定使用全局地址池:
[R1] interface GigabitEthernet0/0/0.10 [R1-GigabitEthernet0/0/0.10] dhcp select global [R1-GigabitEthernet0/0/0.10] quit [R1] interface GigabitEthernet0/0/0.20 [R1-GigabitEthernet0/0/0.20] dhcp select global这里尤其要注意:DHCP地址池里配置的gateway-list必须和子接口IP一致,这是上一章强调过的。如果忘填dns-list,PC能拿到IP,但域名解析会失败,最终表现就是“能上QQ但网页打不开”,非常容易误判为DNS服务器故障。
5.3 接口地址池配置示例
如果你只是想快速验证,接口地址池会更简单:
[R1] interface GigabitEthernet0/0/0.10 [R1-GigabitEthernet0/0/0.10] dhcp select interface [R1-GigabitEthernet0/0/0.10] dhcp server dns-list 223.5.5.5 [R1-GigabitEthernet0/0/0.10] dhcp server excluded-ip-address 192.168.10.1 192.168.10.10接口地址池会自动以接口IP所在网段作为可用地址范围。比如GE0/0/0.10配置了192.168.10.1/24,那么地址池就是192.168.10.1到192.168.10.254这个范围,DHCP服务器会自动排除接口自身IP。这种方式配置快,但对网段的控制粒度不够细,个人建议还是以全局地址池为主。
5.4 DHCP报文在单臂路由下的转发逻辑
很多人看到这里会问:PC和DHCP服务器隔着VLAN,为什么不配置DHCP Relay呢?
因为这里有个关键前提:DHCP服务器本身就在路由器上,而且路由器通过子接口直接接入了每个VLAN的广播域。PC发出DHCP DISCOVER广播,交换机在VLAN 10内泛洪,广播帧从Trunk口带着VLAN 10的Tag到达路由器物理口,再被GE0/0/0.10子接口识别并送到CPU里的DHCP进程。整个过程中广播从PC到路由器子接口只经过了一跳,距离上没有跨网段。DHCP Relay的真正使用场景是“客户端和DHCP服务器不在同一条二三层可达链路上”,比如服务器在核心网段,而接入网段没有DHCP服务能力。在那个场景下才需要中继代理转发DORA报文。单臂路由环境只要子接口配置正确,DORA四个阶段走的是同一条VLAN链路,不需要额外引入中继。
6. 连通性验证:从路由器到PC的完整测试链路
6.1 路由器端先确认服务状态
配置完成后别急着插电脑,先在路由器上确认DHCP服务和地址池状态:
[R1] display ip pool这个命令能看到地址池名称、网段、网关、DNS以及当前配置的排除地址范围,确认地址池信息无误。再查一下接口配置是否生效:
[R1] display current-configuration interface GigabitEthernet0/0/0.10确认dhcp select global已经出现在接口配置里。如果要看当前有哪些地址被租出去了,可以用:
[R1] display ip pool name vlan10 used里面能看到客户端MAC地址、租到的IP、租期剩余时间等。如果这个列表里已经开始出现PC的MAC,说明DHCP交互流程已经成功了一半。
6.2 PC端验证自动获取结果
PC侧以Windows为例,把以太网卡改成自动获取IP后,执行:
ipconfig /all重点核对三样东西:IP地址是否在192.168.10.20到192.168.10.200范围内,子网掩码是否为255.255.255.0,网关是否为192.168.10.1。只要这三项正确,说明DHCP宣告、请求、确认整个闭环已经通了。
接着ping一下网关:
ping 192.168.10.1能通就说明PC到网关到路由器的链路正常,也是单臂路由的第一层验证。然后ping跨网段的PC2地址:
ping 192.168.20.20如果从PC1能ping通PC2,说明VLAN 10到VLAN 20的单臂路由路径完整生效,数据包经过了GE0/0/0.10进、GE0/0/0.20出这样一个完整的“从一根棍子穿过去”的过程。
6.3 从释放到续租的完整测试
我更推荐做一次完整的地址生命周期测试。在PC上依次执行:
ipconfig /release ipconfig /renewrelease会立刻释放当前租约,地址回到地址池;renew会重新发起DHCP DISCOVER流程。这个操作能验证地址池是否有可用IP、排除地址是否生效、路由器能否正确处理请求。如果renew之后拿到的地址和之前一样,说明地址池还有剩余;如果卡在“获取中”很久,大概率是arp broadcast enable没配,或者Trunk口放行VLAN有问题。
6.4 一张自检清单
如果你照着配完发现哪里不通,先别急着改配置,按顺序自查:
- 交换机上Trunk口是否放行了VLAN 10和VLAN 20
- 路由器子接口是否有
dot1q termination vid且VID和VLAN对应 - 子接口是否配置了
arp broadcast enable - DHCP池的网关是否和子接口IP一致
- PC的网卡是否设置为自动获取IP
- 如果PC上配了静态IP,是否有掩码或网关填错
大部分情况下,单臂路由配完不通,问题都集中在这六项里。
7. 高频故障排查:单臂路由环境下的DHCP异常处理
7.1 症状:PC一直拿不到IP地址
这是最常见的首发故障。先看交换机侧display port vlan确认Trunk口放行情况;再看路由器侧display ip interface brief确认子接口UP且IP正确;最后检查DHCP是否开启、子接口是否调用了dhcp select。
如果上面都正常,大概率是arp broadcast enable的问题。因为DHCP DISCOVER是广播帧,子接口不处理广播,DHCP服务器就根本不知道有客户端在请求。华为设备上这个命令漏掉的概率极高,特别是从其他厂商转过来的网络工程师,最容易漏掉这一行。检查方式就是进子接口看一眼配置,没有就补上。
7.2 症状:能拿到IP但跨VLAN ping不通
如果PC能拿到IP,说明DHCP报文已经通了,问题通常不在DHCP本身,而在路由器的路由转发或者对端VLAN的配置上。先确认对端子接口的IP是否配置正确,比如VLAN 20的子接口有没有写dot1q termination vid 20。再在路由器上执行display arp,看看能不能看到对端PC的ARP表项。看不到,说明网关发出的ARP请求没有到达对端PC,这时要重点检查交换机上允许VLAN 20的Trunk放行和PC的Access口划分。
还有一种容易被忽略的情况:对端PC或者服务器自身的Windows防火墙拦截了ICMP报文。敲ping不通不代表三层不通,可以先在路由器上用ping -a 192.168.10.1 192.168.20.20测试源地址指定为网关的连通性。如果路由器能ping通,基本可以排除链路和路由问题,死磕PC端的防火墙设置就行。
7.3 症状:拿到IP但上不了网
先区分是“完全上不了网”还是“能上内网不能上外网”。如果是后者,重点检查DHCP池里的DNS配置。没有dns-list或者写了一个不可达的DNS地址,就会导致域名无法解析。华为地址池里默认不会替你把DNS填好,这个必须显式配置。
如果是完全上不了网,多半是地址池里的gateway-list和子接口IP不一致。比如子接口配的是192.168.10.1,池子里却写成了192.168.10.254,PC拿到的网关根本不在这个网段的实际路由器接口上,所有发往外网的流量都会发向一个不存在的设备。检查方法很简单,display ip pool看一遍,把网关和子接口IP对齐就行。
7.4 症状:同VLAN通,但路由器上看不到ARP表项
这种现象说明二层链路通,三层协议没有建立起来。大概率是子接口的VLAN Tag识别出了问题。用display current-configuration interface GigabitEthernet0/0/0.10确认配置无误后,再用terminal debugging配合debugging arp packet看子接口能否收到ARP请求。如果交换机侧Tag打的是VLAN 10,子接口却是dot1q termination vid 20,路由器会直接丢弃这条报文,ARP表自然建立不起来。
这种情况我建议直接在PC上ping网关IP,然后在路由器上display arp | include 192.168.10.1,配合调试命令看报文流向。大多数时候,把子接口的VID和交换机Trunk放行的VLAN列表对齐就解决了。
7.5 一套通用的排查方法论
排错最忌讳上来就怀疑某一条命令,我的习惯是从物理层一层层往上走:
- 物理层:看端口状态,UP了才算过
- 数据链路层:交换机Access口VLAN对不对、Trunk口放行了哪些VLAN
- 网络层:路由器子接口UP、IP和网关一致、路由表里有直连路由
- 服务层:DHCP进程开启、地址池有剩余、DNS正确
- 应用层:PC自动获取后,ping通网关,再ping通对端
这套方法跳过了很多“看起来像”的问题,升级到三层交换机的VLANIF方式之后,地址池和网关的对应关系会更清晰,故障率也会更低。但单臂路由作为基础组网方案,把里面每一层原理吃透,后面学任何路由协议都会轻松很多。最后再分享一个小习惯:所有配置修改后,记得用save保存配置,别让一次断电把你辛辛苦苦敲的命令全带走。