搞网络的人应该都遇到过这个场景:两台PC接在同一台交换机上,分属不同VLAN,怎么ping都ping不通。VLAN本身就是为了隔离广播域,不同VLAN的流量默认不会跨VLAN走,想让它们通信,就得靠三层设备介入——单臂路由就是最经典、最省钱、也最常拿来练手的一种解法。我在华为eNSP里把这个实验翻来覆去配了二十多遍,踩过不少坑,今天把这套单臂路由配置完整拆开讲,从原理到命令到排错,一次说清楚。
先给没接触过的新朋友一句话结论:单臂路由就是在一个路由器物理接口上创建多个子接口,用802.1Q封装给每个VLAN贴上标签,让路由器“一根线”对接多个VLAN,完成三层转发。它解决的痛点是——网络里VLAN划分多了,但没有三层交换机,或者不想多花钱买多接口路由器,这时候用单臂路由最合适。文章后面我会带你把eNSP里的完整拓扑建起来,从交换机的Access和Trunk配置,到路由器的子接口终结,再到最后的验证和故障排查,全部过一遍。
1. 单臂路由是什么,到底解决了什么问题
1.1 一个“一根线上网”的模型
先理解VLAN间通信这件事的本质。两台PC在同一个VLAN里,它们的二层连通性没问题,交换机直接基于MAC地址转发帧;但PC在不同VLAN里,交换机查转发表发现出口属于另一个VLAN,就会把帧丢弃——VLAN隔离了广播域,也隔离了所有跨VLAN的流量。
要让VLAN 10的PC1访问VLAN 20的PC2,必须引入三层转发。PC1要把包发给“网关”,也就是一个能识别VLAN 10流量的三层接口,路由器查路由表后把包从另一个能识别VLAN 20的接口送出去,交换机再把帧转给PC2。
传统做法是路由器一个接口接一个VLAN,VLAN多就要路由器接口多,不现实。单臂路由的思路是:交换机接到路由器的那根物理链路做成Trunk,路由器在这个物理接口上拆出多个逻辑子接口,每个子接口绑定一个VLAN ID。进来的数据帧带着VLAN 10的标签,就交给子接口10处理;要发给VLAN 20的帧,就由子接口20打上标签再送出去。所有VLAN共用同一根物理链路,所以叫“单臂”。
这个设计用生活类比很直白:路由器就像一个物业前台,各个部门(VLAN)的访客都从前台经过,前台靠工牌编号(VLAN标签)区分访客要去哪个部门,再把人领过去。没有前台,部门之间直接找人办事是找不到的;有了前台,一根通道就全解决了。
1.2 单臂路由和三层交换机怎么选
很多新手会问:既然单臂路由能解决VLAN间通信,为什么生产环境里很少见?原因在于性能和瓶颈。
单臂路由的所有跨VLAN流量都挤在这一根物理链路上,带宽上限被锁死,流量一大就拥塞。而且路由器处理跨VLAN转发要做VLAN标签的剥离、封装再路由,CPU开销比二层交换高得多。所以单臂路由适合的场景是:小型网络、实验室学习、临时快速打通VLAN通信。
三层交换机则是把路由模块做进了交换硬件,VLAN间流量走硬件转发,速度远快于单臂路由,接千兆口就跑千兆,这也是为什么企业网络会用三层交换机做VLAN间路由。学单臂路由真正的价值在于搞清楚VLAN标签的封装与终结机制,这个底层逻辑搞懂之后,配三层交换机VLANIF接口、配防火墙子接口,都是一通百通的事。
另外一个容易忽略的常识:单臂路由需要一个支持子接口、支持802.1Q封装的路由器。eNSP里的AR2220完全支持,家用路由器可能连VLAN概念都没有,别拿家用设备直接套这些命令。
2. 配置前的规划与eNSP环境准备
2.1 拓扑与IP规划
我在eNSP里的实验拓扑很标准:一台AR2220路由器,一台S5700交换机,两台PC。路由器GigabitEthernet0/0/0接口接交换机GigabitEthernet0/0/1接口,中间用网线连起来。PC1接交换机GE0/0/2,PC2接交换机GE0/0/3。
IP规划见下表:
| 对象 | VLAN | 网段 | 网关 | 接口 |
|---|---|---|---|---|
| PC1 | VLAN 10 | 192.168.10.0/24 | 192.168.10.1 | 交换机GE0/0/2 |
| PC2 | VLAN 20 | 192.168.20.0/24 | 192.168.20.1 | 交换机GE0/0/3 |
| 路由器子接口 .10 | VLAN 10 | 192.168.10.1/24 | - | 路由器GE0/0/0.10 |
| 路由器子接口 .20 | VLAN 20 | 192.168.20.1/24 | - | 路由器GE0/0/0.20 |
这里先说一个规划要点:网关地址就是路由器子接口的IP地址。PC的网关要填192.168.10.1,子接口也要配置192.168.10.1,二者必须一致,否则PC发出的数据帧根本找不到去路由器的路。
为什么用两个网段而不是同一个网段?因为单臂路由要模拟的正是跨网段通信。如果两个PC配置成同一个网段但不同VLAN,PC会先发ARP广播找对端MAC,交换机隔离了广播域导致ARP不通,结果还是不通——这也是不少人实验半天找不到原因的坑之一。跨网段后,PC知道对端不在自己网段,直接找网关(路由器),才是正确的VLAN间通信模型。
2.2 为什么用子接口而不是多接口
规划完拓扑,新手最常问的问题是:AR2220有那么多物理接口,为什么非要用一个物理接口加两个子接口?直接把GE0/0/0配成VLAN 10的网关,GE0/0/1配成VLAN 20的网关,再接两条线到交换机不就行了?
可行,但那叫多臂路由,不叫单臂路由。多臂路由有两个硬伤:第一,物理接口占用多,VLAN一多接口不够用;第二,交换机侧每个接路由器的接口必须分别配Access,VLAN再多路由器和交换机之间就要拉一堆线,端口利用率极低。
子接口的方式完全不同。在华为设备上,子接口编号是物理接口后面加点再加编号,比如GigabitEthernet0/0/0.10。每个子接口逻辑上独立,可以配不同的IP、绑定不同的VLAN,但物理上共享一根光纤/网线。交换机那侧一个Trunk接口就把所有VLAN的帧都送出去,路由器用子接口区分处理。这就是单臂路由的精髓——是逻辑资源的复用,不是物理接口的堆叠。
3. 交换机侧配置:Access和Trunk的边界怎么划
3.1 接PC的接口用Access,别放通多余VLAN
交换机侧配置是整个单臂路由最容易出错的环节,因为很多人不清楚交换机接口类型到底该怎么选。先明确一个基本规则:接口类型是写给交换机看的“收信规则”——这个接口允许什么样标签的帧进来,出去时要打什么标签。
接PC的口,必须是Access。原因很简单:PC网卡不认识VLAN标签,它发出的帧是普通以太网帧(无标签),所以交换机接PC的接口不能给它塞标签,也不能把一个带标签的帧透传给PC。Access接口把接入口划分到指定VLAN,进方向收无标签帧时打上对应VLAN的标签,出方向把标签剥掉再发给PC。这个“入打标、出剥标”的动作,对PC完全透明。
命令配置如下:
<Huawei>system-view [Huawei]sysname SW1 [SW1]vlan batch 10 20 [SW1]interface GigabitEthernet0/0/2 [SW1-GigabitEthernet0/0/2]port link-type access [SW1-GigabitEthernet0/0/2]port default vlan 10 [SW1-GigabitEthernet0/0/2]quit [SW1]interface GigabitEthernet0/0/3 [SW1-GigabitEthernet0/0/3]port link-type access [SW1-GigabitEthernet0/0/3]port default vlan 20 [SW1-GigabitEthernet0/0/3]quit我见过有人在Access口上写port trunk allow-pass vlan,命令虽然能敲上去,但语义完全错了。Access口只属于一个VLAN,port default vlan指定它的归属;Trunk口才用allow-pass决定放通哪些VLAN。两种接口类型的思路要分开记,否则后面排查会把自己绕晕。另外,交换机上必须先用vlan batch 10 20创建VLAN,否则你接口配port default vlan 10时会提示VLAN不存在。
3.2 接路由器的接口用Trunk,必须放通VLAN
交换机接路由器的GE0/0/1,要配成Trunk。VLAN 10和VLAN 20的帧都要从这一根线送往路由器,只有Trunk接口能同时承载多个VLAN的帧,并且带着VLAN标签原样通过。
具体配置:
[SW1]interface GigabitEthernet0/0/1 [SW1-GigabitEthernet0/0/1]port link-type trunk [SW1-GigabitEthernet0/0/1]port trunk allow-pass vlan 10 20 [SW1-GigabitEthernet0/0/1]quit命令敲完,用display port vlan检查一下GE0/0/1的PVID和允许通过的VLAN列表。这里有一个非常经典的坑:很多教材会写“Trunk接口默认放通所有VLAN”,没错,但这是华为设备的默认行为,实际生产环境为了安全一般会手动限定放通范围。如果你实验时发现VLAN 20的帧到不了路由器,先查一下port trunk allow-pass vlan里是不是只放通了VLAN 10,漏写了20。我调过的故障里,这种低级错误占了三分之一。
还有一个容易被忽略的配置点:Trunk接口的PVID。默认PVID是VLAN 1,如果交换机接路由器这个口收了无标签帧(比如路由器子接口封装失败发出来的普通以太网帧),交换机就会给它打上VLAN 1的标签,然后一问:这个VLAN没在Trunk放通列表里?丢弃。所以很多时候问题并不出在路由器,而在交换机Trunk口PVID上。实验环境里直接用默认PVID没大问题,但理解这层机制有助于排错。
4. 路由器侧子接口配置:真正考验细节的部分
4.1 创建子接口,五条命令一次配完
交换机这一侧配好,等于把“路”都铺好了,但路由器还没认领这些VLAN。接下来就是整个单臂路由最核心的环节:在路由器物理接口上创建子接口,配置802.1Q封装。
华为路由器子接口有几个关键参数:dot1q termination vid指定子接口对应的VLAN ID;IP地址作为该VLAN内PC的网关;arp broadcast enable启用子接口的ARP广播功能;最后还要undo shutdown确保接口处于启用状态。
AR2220的完整配置:
[AR]system-view [AR]sysname AR1 [AR]interface GigabitEthernet0/0/0 [AR-GigabitEthernet0/0/0]undo shutdown [AR-GigabitEthernet0/0/0]quit [AR]interface GigabitEthernet0/0/0.10 [AR-GigabitEthernet0/0/0.10]dot1q termination vid 10 [AR-GigabitEthernet0/0/0.10]ip address 192.168.10.1 255.255.255.0 [AR-GigabitEthernet0/0/0.10]arp broadcast enable [AR-GigabitEthernet0/0/0.10]undo shutdown [AR-GigabitEthernet0/0/0.10]quit [AR]interface GigabitEthernet0/0/0.20 [AR-GigabitEthernet0/0/0.20]dot1q termination vid 20 [AR-GigabitEthernet0/0/0.20]ip address 192.168.20.1 255.255.255.0 [AR-GigabitEthernet0/0/0.20]arp broadcast enable [AR-GigabitEthernet0/0/0.20]undo shutdown [AR-GigabitEthernet0/0/0.20]quit再说说arp broadcast enable这条为什么是必须的。子接口默认对广播帧是“关上门”的,而PC要找到网关,第一件事就是发ARP广播请求“谁是192.168.10.1”。如果子接口不响应ARP广播,PC的ARP表里没有网关MAC,数据包就发不出去。这行命令没配是单臂路由实验中排名第一的隐形杀手,它的报错方式不是报错,而是一直ping不通又找不到原因。
4.2 抓包看数据帧,理解为什么子接口能拆VLAN标签
配置敲完,我想带你把整个数据流转过程走一遍,因为单臂路由的每个细节都藏在帧结构里。
PC1(192.168.10.10)要ping PC2(192.168.20.10)。第一步,PC1检查目标IP跟自己不在同一网段,于是把数据包交给默认网关192.168.10.1,但此时PC1的ARP缓存里没有网关的MAC地址,于是PC1发一个ARP广播:“192.168.10.1的MAC是谁?”这个广播帧无标签,进入交换机GE0/0/2——Access口,交换机剥不掉标签,只是给它打上VLAN 10的标签,然后在VLAN 10范围内广播。路由器GE0/0/0接的Trunk口收到这个带VLAN 10标签的ARP请求,交换机Trunk口判断VLAN 10在放通列表里,原样交给路由器物理口。路由器GE0/0/0.10子接口看到VLAN ID匹配,响应ARP,返回带VLAN 10标签的ARP应答。PC1拿到网关MAC,开始发数据。
数据帧从PC1出来,无标签,进交换机GE0/0/2打上VLAN 10标签,经Trunk口到路由器。路由器GE0/0/0.10终结VLAN 10标签,取出IP包,查路由表——192.168.20.0/24的路由条目由GE0/0/0.20提供,于是把包交给子接口.20重新封装,打上VLAN 20标签,从同一根物理线发出。交换机Trunk口一看VLAN 20在放通列表里,放行;接着查MAC地址表,知道VLAN 20里PC2在GE0/0/3,于是从Access口剥掉标签,把无标签帧交给PC2。PC2回包则是完全对称的反向过程。
这个流程里有个很关键的点:VLAN标签只在交换机和路由器之间的Trunk链路上存在,Access口两侧都是无标签帧。子接口的“终结”和“打标”动作,就是路由器用dot1q termination vid这条命令建立起来的映射。子接口收帧时必须能看到标签才能匹配,而Trunk口就是保证这个标签在链路上存活的关键。所以交换机Trunk放通列表、路由器子接口VLAN ID,两边必须一致,不对齐PIN不通就是这两端在看不同版本的剧本。
5. 验证连通性与常见问题排查实录
5.1 ping通之前,先检查这几项
配置完成后,先在PC1上ping PC2(192.168.20.10)。如果通了,恭喜你,整个单臂路由链路是通的;如果不通,按下面顺序排查,这个顺序是我自己踩坑总结出来的,从底层往上层走,效率最高。
第一步,先ping网关。PC1 ping 192.168.10.1,能通就说明PC1到路由器的二层链路、VLAN 10的封装/终结都是好的。如果网关ping不通,问题大概率出在交换机Access口配置、Trunk口放通列表、路由器子接口这三个环节,优先查路由器子接口有没有配arp broadcast enable,再查交换机Trunk口有没有放通VLAN 10。
第二步,从路由器上ping PC2的网关地址192.168.20.1,直接ping子接口自己的IP,能ping通说明子接口.20本身是up的。然后用路由器ping PC2的地址192.168.20.10,如果通,说明路由器到PC2的下行链路没问题,问题反而可能出在PC1的上行链路上。
第三步,看接口状态。在路由器上执行display ip interface brief,重点看GE0/0/0.10和GE0/0/0.20是不是up状态。子接口显示down,通常是因为物理接口没启用,回到GE0/0/0执行undo shutdown。在交换机上执行display port vlan,确认Trunk口的放通VLAN列表,确认Access口的default VLAN。
最后一步,如果链路都对但PC1 ping PC2还是不通,检查PC2的网关是不是192.168.20.1、IP掩码是不是255.255.255.0,以及PC1的ping目标有没有输错。很多人配好网络,最后发现是PC2的网关填成了192.168.10.1——这种问题不需要动任何命令,改一下IP就好。
5.2 我踩过的几个eNSP经典坑
这些坑属于“不看报错完全猜不到”的类型,我单独列出来,每一个都是实测过的。
第一个坑,路由器子接口忘配arp broadcast enable。这个命令排在所有坑的第一位,因为它不报错、不影响接口状态,接口照样up,但PC就是ping不通网关。排查方法是在PC1上执行arp -a,如果网关MAC是空的,说明ARP请求没被解析,十有八九是这个命令漏了。华为模拟器里退出系统视图后子接口配置不会自动保存,如果重启设备后忘了重新配,又会掉进同一个坑。
第二个坑,交换机接路由器的口配成了Access而不是Trunk。这会导致什么结果?Access口只属于一个VLAN,查MAC地址表时会把带别的VLAN标签的帧直接视为非法,路由器即使配了子接口也收不到。配置完成后记得在交换机上用display port vlan看GE0/0/1的实际类型。
第三个坑,PVID和Trunk放通列表打架。Trunk口默认PVID是VLAN 1,如果从路由器来的帧没带标签(比如子接口封装异常),交换机会给它打VLAN 1标签。如果Trunk口放通列表里没有VLAN 1,帧就被丢弃。这个问题在模拟器里表现得很隐蔽,你看到交换机接口 counters 里有Discard,但抓包看不出来。
第四个坑,eNSP里AR路由器的接口默认是shutdown状态。很多人建好设备直接开配,子接口敲完了才发现物理接口没起来,所有配置“看起来”都对,就是不通。先undo shutdown,再配子接口,这也是我为什么把这条命令放在路由器配置最前面。
第五个坑,PC的网关没有填写。eNSP的PC配置界面里有IP地址、子网掩码、网关三个框,很多人只填了前两个。VLAN间通信必须有三层转发,没有网关的PC只会发ARP广播找对端,不同VLAN里当然找不见。这在实验里是最初级却也最常见的错。
| 现象 | 可能原因 | 排查命令 |
|---|---|---|
| PC1 ping不通网关 | 漏配 arp broadcast enable | PC执行 arp -a 看网关MAC |
| PC ping不通PC | 网关没填或填错 | 查看PC配置界面 |
| 子接口down | 物理接口shutdown | display ip interface brief + undo shutdown |
| 跨VLAN不通但同VLAN通 | Trunk口放通列表漏配VLAN | display port vlan |
| 接口收到大量Discard | Trunk口PVID或Access类型错误 | display interface 看Discard计数 |
| 交换机提示VLAN不存在 | 未先创建VLAN | vlan batch 10 20 |
5.3 再补一个进阶排错技巧:用Wireshark抓包验证标签
eNSP里还有一个很实用的功能,就是直接在链路上开启抓包。在交换机和路由器之间连的那根线上右键,选择开启抓包,然后让PC1 ping PC2,你可以在抓包结果里看到非常清楚的两类帧:从交换机到路由器的方向,帧头里有802.1Q标签,写着VLAN ID是10;从路由器返回的方向,标签变成20。如果抓到的帧全都没有标签,那基本可以断定交换机的Trunk口根本没有放通VLAN,或者路由器子接口封装失败。
我建议做实验时一定要养成“打开抓包看一眼”的习惯,因为用眼睛验证远比靠猜快。看到标签的那一刻,你对单臂路由的原理理解会彻底落地——之前所有抽象的概念,都变成了一个真实的、十六进制的VLAN字段,你自然就明白它到底在做什么了。
我个人在实际操作里还有一个习惯,会刻意把配置顺序固定下来:先配交换机,再配路由器,最后配PC。因为交换机侧只要Trunk和Access划分正确,路由器子接口只要VLAN ID收齐,剩下的就是“数据能不能送进来”的问题。配完之后马上从PC1向网关发起ping,而不是直接pingPC2——小步验证,每走一步就确认一次,这样哪怕出了问题,也能瞬间定位到某个环节而不是整条链路。单臂路由这个实验,说实话配置量不大,但它的价值在于把一个看似简单的VLAN间通信场景,拆解成了封装、终结、放通、路由四个环环相扣的动作,弄明白了这些,后面配三层交换机的VLANIF接口、配防火墙的子接口策略,思路都会特别顺畅。