
跨 VLAN 互通一直是网络入门者最容易卡住的一道门槛。单臂路由Router-on-a-Stick是解决这个问题的经典方案之一一台路由器、一根物理链路、几个子接口就能让原本被隔离在不同 VLAN 里的主机互相通信。我在华为 eNSP 上把它完整跑通了一遍这篇文章把设计思路、完整配置、验证方法和排障经验都写出来适合正在学交换路由、准备 HCIA 或者工作中需要临时打通 VLAN 的同学参考。1. 单臂路由解决什么问题从 VLAN 隔离说起1.1 一个最典型的企业需求场景我经常遇到新手拿着拓扑图来问为什么交换机上划分了 VLAN两个网段的主机就是 ping 不通这个问题确实典型。在企业或校园网络里VLAN 是用来做广播隔离的把不同部门、不同业务放在独立广播域里既能抑制广播风暴又能做安全隔离。财务 VLAN、办公 VLAN、监控 VLAN各自独立互不干扰——这是二层视角下的状态。但现实中业务往往需要跨 VLAN 访问财务要访问办公区的打印服务器监控要连到监控中心的存储访客网络可能还要访问公共资源。这就要把“隔离”和“互通”这看似矛盾的两个需求同时解决。单臂路由就是解决这个问题最基础也最通用的手段让路由器的一端同时充当多个 VLAN 的网关把三层转发做在链路的“臂”上。我第一次在 eNSP 上动手配置这个场景时最大的体会是只要会画拓扑、会分 VLAN、会配子接口跨 VLAN 路由的架构就基本入门了。很多 HCIA 题库里的实验题本质上也就是在考这一套流程。1.2 单臂路由的“单臂”到底单在哪“单臂”这个名字很形象。传统做法里如果路由器要同时管理多个 VLAN最简单粗暴的思路是每个 VLAN 拉一条物理线接到路由器上一个接口管一个网段。这样路由器接口多、线缆多交换机上的接口也浪费。单臂路由不同路由器到交换机只保留一条物理链路这条链路就像一支伸出去的“手臂”路由器在这个接口上创建若干个子接口每个子接口对应一个 VLAN用 802.1Q 标签区分从这条链路上经过的帧属于哪个 VLAN。也就是说物理上是一根线逻辑上却是多条“虚拟连接”。这条链路在交换机侧通常配置为 Trunk因为它需要承载多个 VLAN 的带标签帧。路由器收到带标签的帧后根据 tag 交给对应的子接口处理完成三层路由发送时再给帧打上对应 VLAN 的 tag从同一条物理口送回去。这就是单臂路由的基本工作方式。1.3 为什么现在我还会推荐先学单臂路由有人可能会说都什么年代了核心交换机直接配 Vlanif 三层接口不香吗为什么还要学单臂路由我的看法是单臂路由不是用来替代三层交换机的而是用来帮助你把“跨 VLAN 转发到底发生了什么”这件事看清的。它拆解得很干净二层由交换机负责三层由路由器负责链路中间的角色划分一目了然。学习它能深刻理解路由表、ARP、网关、子接口这些概念之间的协作关系。而且在一些小型网络、临时组网、实验环境里拿一台现成的路由器和一个二层交换机做单臂路由成本极低也不需要三层交换机。华为 eNSP 里最常用的拓扑之一就是 AR 路由器加 S5700 交换机加两台 PC跑通这个案例再去学三层交换机会轻松很多。所以它仍然是 HCIA 阶段的经典考点也是我给学生讲 VLAN 间路由时的首选案例。2. 配置前必须吃透的三个基础概念2.1 VLAN二层逻辑隔离的边界VLANVirtual Local Area Network是在二层把一个物理广播域划分成多个逻辑广播域的技术。划分以后同一个 VLAN 内的帧可以正常广播、正常互通不同 VLAN 的帧在交换机内部就直接被挡在转发逻辑之外不会互相广播也不会走二层交换。因为交换机维护的是 MAC 地址和 VLAN ID 的对应表MAC 地址表查表时如果没有对应条目就不会向其他 VLAN 转发这与是否拥有 IP 地址无关。很多新手容易把“不同网段”和“不同 VLAN”混着说其实二者既有联系又有区别VLAN 是二层隔离边界网段是三层的地址逻辑通常实践中一个 VLAN 对应一个 IP 网段但也只有在通过三层路由接通后“不同网段”才会真正体现出来。所以理解 VLAN就要先接受“二层不通”这个前提——不同 VLAN 注定无法直接二层互通必须依托三层设备来路由。2.2 Access 与 Trunk两种完全不同的端口角色在交换机上配置端口角色是入门必会的基本功。Access 接口通常连接终端比如 PC、打印机、服务器网卡它只能承载一个 VLAN这个 VLAN 通过port default vlan来设置。Access 口发给终端的帧是不带标签的从终端收进来的帧也会被交换机打上默认 VLAN 的标签在交换机内部按照这个标签转发。Trunk 接口则通常连接交换机与交换机、或交换机与路由器它需要“放通”多个 VLAN帧经过时会带着 802.1Q 标签除了 native VLAN 的特殊情况。配置 Trunk 的关键动作是port trunk allow-pass vlan放通哪些 VLAN就写明哪些。只放通一个 VLAN 的 Trunk 是没意义的Trunk 的价值在于多个 VLAN 共用一根链路。这个阶段的常犯错误是分不清接 PC 的口和接上联的口到底该做 Access 还是 Trunk——原则很简单接终端用 Access做级联或上联且需要传多个 VLAN 时用 Trunk。2.3 子接口与 802.1Q Tag路由器的“分身术”路由器要参与 VLAN 间路由就必须能够处理带 802.1Q 标签的帧。普通物理接口默认情况下收到的帧如果有 tag很可能被当作非法帧直接丢弃因此我们需要在物理接口下创建子接口Sub-interface例如GigabitEthernet0/0/0.10、GigabitEthernet0/0/0.20。每个子接口用一个dot1q termination vid来匹配一个 VLAN ID。收到帧时物理接口看到 tag会把它交给匹配的子接口处理发出帧时子接口给帧打上对应 VLAN 的 tag。这就像一台物理路由器瞬间变成了两个或多个逻辑路由器各自拥有一个 IP、各管一个 VLAN 的网关。子接口上配置的 IP 地址就是这个 VLAN 内主机的网关地址。这也是为什么单臂路由中交换机和路由器之间的链路必须配置为 Trunk 并放通所有需要路由的 VLAN——不仅让帧能带标签还让路由器能“看懂”这些 VLAN。3. 华为 eNSP 完整配置流程3.1 拓扑规划与参数设计我直接在 eNSP 里搭了这样一个拓扑一台 AR2220 路由器一台 S5700 交换机两台 PC。路由器 GE0/0/0 连接到交换机 GE0/0/3这条链路就是“单臂”交换机 GE0/0/1 接 PC1GE0/0/2 接 PC2。规划如下VLAN 10 对应办公网段网段 192.168.10.0/24PC1 的 IP 为 192.168.10.10网关是 192.168.10.1VLAN 20 对应财务网段网段 192.168.20.0/24PC2 的 IP 为 192.168.20.10网关是 192.168.20.1。路由器的两个子接口就分别承担这两个网关的地址。这里有一个很容易被忽略的设计点网关地址必须落在路由器子接口上而不是交换机上因为交换机是二层交换机不做三层转发。如果用了三层交换机网关会落在 Vlanif 上这是后话在单臂路由实验里网关一定在路由器子接口。3.2 交换机侧配置VLAN、Access 与 Trunk打开 eNSP先启动设备进入交换机命令行。我在交换机上按下面顺序配置system-view sysname SW1 vlan batch 10 20 interface GigabitEthernet0/0/1 port link-type access port default vlan 10 interface GigabitEthernet0/0/2 port link-type access port default vlan 20 interface GigabitEthernet0/0/3 port link-type trunk port trunk allow-pass vlan 10 20这几行命令做的事情很直接创建两个 VLANGE0/0/1 划给 VLAN 10GE0/0/2 划给 VLAN 20GE0/0/3 作为上联口设为 Trunk放通 VLAN 10 和 20。注意vlan batch 10 20是华为的批量创建语法比一条条输入vlan 10、vlan 20更省事。如果你的实验里还有其他 VLAN比如想让所有 VLAN 都通过也可以直接port trunk allow-pass vlan all但生产环境不建议这么做尽量做到最小化放通这是安全习惯也能减少后续排查范围。配完之后我用display vlan检查一遍确认 VLAN 10 和 20 都存在且 GE0/0/3 的 Trunk 属性已经生效。交换机侧到这步就完成了不需要也不应该给交换机配任何 IP。3.3 路由器侧配置物理接口与子接口接下来是核心部分。进入路由器 AR2220 的命令行先确认物理接口是开启状态。eNSP 里默认接口一般不 shutdown但如果实验做过清理可能被人为关闭过稳妥起见还是手动加一条undo shutdown。然后创建两个子接口system-view sysname R1 interface GigabitEthernet0/0/0 undo shutdown interface GigabitEthernet0/0/0.10 dot1q termination vid 10 ip address 192.168.10.1 255.255.255.0 arp broadcast enable interface GigabitEthernet0/0/0.20 dot1q termination vid 20 ip address 192.168.20.1 255.255.255.0 arp broadcast enable这里最让我想多写几句的是arp broadcast enable。在华为 AR 路由器上子接口默认对广播帧的处理比较保守如果不开启这个命令PC 发来的 ARP 请求可能得不到响应导致网关能配出来但就是 ping 不通。这算是单臂路由配置里非常经典的坑。另外一个重点是物理接口 GE0/0/0 可以不配 IP只需要保持 upIP 全部放在子接口上。因为物理接口如果在全局 IP 域中可能造成路由表混乱也没必要。子接口号.10.20只是本地编号建议与 VLAN ID 一致纯粹是为了自己好记好排查不强制。3.4 PC 端配置与验证基础华为 eNSP 里的 PC 配置非常简单双击 PC1在 IPv4 配置页把 IP 设为 192.168.10.10掩码 255.255.255.0网关 192.168.10.1PC2 设为 192.168.20.10掩码 255.255.255.0网关 192.168.20.1。很多人在这一步漏掉网关或者把网关写成了别的地址导致后续怎么 ping 都是 request time out。网关的作用是当主机发现目的 IP 不在自己同一网段时它不会直接发 ARP 请求给目的主机而是把帧交给默认网关让网关去路由。这就像你要去外单位办事不会直接逐家敲门而是先到站牌坐公交车网关就是那辆车的站牌。所以检查配置时先看两台 PC 的 IP 是否和网关同网段再看网关是否就是路由器子接口地址这两点最基础也最致命。3.5 完整配置命令清单为了方便你直接对照练习我把全流程命令再汇总成一份清单。交换机侧与路由器侧完整命令如上两节所示此处只补充两个验证命令在交换机上执行display vlan查看 VLAN 与端口关联在路由器上执行display ip interface brief查看子接口 IP 是否生效。实际实验中建议按“交换机—路由器—PC”的顺序配置因为在 eNSP 里设备启动较慢链路状态同步也需要几秒钟配置顺序不严谨不影响最终结果但会影响你排查问题的思路。先把底层 VLAN 建好再做 Trunk再上子接口最后配 PC 网关这一步一步来出问题能快速定位在哪一个环节。配置对象关键动作验证命令交换机创建 VLAN、配置 Access/Trunkdisplay vlan路由器创建子接口、绑定 VLAN ID、配 IPdisplay ip interface briefPC配置 IP、掩码、网关ping 网关这个表格只是辅助记忆真正练熟还是必须敲命令。建议至少完整配置三遍第一遍照抄第二遍不看命令自己敲第三遍故意设置错误再排查这样才是掌握。4. 实测验证与数据走向分析4.1 PC1 到 PC2 的完整数据包旅程把配置做完后点开 PC1 的命令行执行ping 192.168.20.10。如果一切正常你会看到四个Reply from 192.168.20.10: bytes32 time...。但这时不要急着高兴我更推荐你把过程拆开想想PC1 的 IP 是 192.168.10.10它发现目标 192.168.20.10 和自己不在同一网段于是先根据路由规则把 ICMP 包交给网关 192.168.10.1。PC1 的 ARP 缓存里如果没有网关 MAC就会先发一个广播 ARP 请求“谁是 192.168.10.1”。交换机收到这个广播帧因为它在 VLAN 10 里会从所有属于 VLAN 10 的端口转发出去包括 Trunk 口且帧上加着 VLAN 10 的标签。路由器收到带标签的广播帧GE0/0/0.10 匹配 VID 10回应用自己的 MAC 地址。PC1 拿到网关 MAC 后发出 ICMP 请求帧目的 MAC 是网关 MAC源 MAC 是 PC1 的 MAC目的 IP 是 PC2 的 IP。路由器通过子接口 .10 收到后剥离 VLAN 10 的标签查看路由表发现 192.168.20.0/24 直连在子接口 .20于是将帧重新封装目的 MAC 变成 PC2 的 MAC通过 ARP 获取并打上 VLAN 20 的标签从物理接口发回交换机。交换机在 VLAN 20 内把帧从 GE0/0/2 发给 PC2。回程同理。这一步能讲清楚单臂路由的原理就通了。很多人配置完只看 ping 通没通却说不清数据包到底怎么走遇到复杂一点的问题就蒙了。4.2 常用验证命令与预期输出除了 ping我习惯用下面几个命令做系统化验证。在交换机上执行display vlan重点看 VLAN 10 和 20 是否激活GE0/0/1、GE0/0/2 是否出现在对应 VLAN 的端口列表里GE0/0/3 是否为 Trunk 且放通 10、20。在交换机上执行display port vlan可以同时看到端口类型、PVID 和允许通过的 VLAN排障时非常直观。在路由器上执行display ip interface brief看 GE0/0/0.10 和 GE0/0/0.20 的 IP 是否已经配置成功接口状态是否为 up。在路由器上执行display arp看能否学到 PC1 和 PC2 的 ARP 表项。如果表项里只有路由器自己的地址但没有 PC 的 MAC说明 PC 到路由器的二层路径有问题。在 PC 上执行arp -a检查网关 MAC 是否已经学习到。这些命令的输出不用死记关键是知道每一层该看什么。比如display ip interface brief显示接口 down那多半是物理链路问题或子接口配置没生效如果接口 up 但display arp学不到 PC那就是隔离在二层链路或 ARP 广播上。4.3 验证结果显示什么才是正常一片大绿并不代表你真的懂了。我会把验证结果和现象对应起来在 PC1 上ping 192.168.10.1通说明 PC1 到网关的二层链路通、VLAN 10 的 Access/Trunk 配置没问题在 PC2 上ping 192.168.20.1通说明 VLAN 20 一侧正常在路由器上display arp能看到两台 PC 的 MAC说明路由器已通过 ARP 学习到两端主机最后ping 192.168.20.10通才说明跨 VLAN 路由真正打通。我见过很多朋友只做最后一步一旦失败就抓瞎其实问题大概率就隐藏在中间某一步。所以我的习惯是“先网关、后跨网段、再看路由表”按这个顺序排查百分之八十的单臂路由问题都能在五分钟内找到根因。5. 常见问题与排障实录5.1 两个 PC 都能 ping 通各自网关但互 ping 不通这种情况非常典型网关通了说明二层链路都对、子接口的 dot1q 也匹配了但互联不通说明三层上还有东西挡着。常见原因按优先级排查第一路由器子接口上是否开了arp broadcast enable。华为 eNSP 的 AR 设备如果不开这条子接口可能学不到对端ARP 表为空ICMP 就只能发出去而收不到回应。第二检查两台 PC 的网关配置是否真的指向了路由器子接口有人把 PC2 的网关填成了 192.168.10.1但它所在网段是 192.168.20.0/24网关就应该是 192.168.20.1。第三看路由器上有没有多余的静态路由把 192.168.10.0 或 192.168.20.0 指向了错误下一跳直连路由应该自动出现在路由表里如果不在了多半是子接口地址没配成功。这是一个很典型的逐层定位过程从 ARP 表入手再查路由表最后数帧的封装。5.2 交换机接入口配置 access 后两台 PC 可以互通是怎么回事有不少同学在实验时发现一个“神奇”现象先把交换机两个接口都配置成 access不设 VLAN两台 PC 竟然能 ping 通。这其实一点都不神奇——它们都在默认的 VLAN 1 里二层广播域相同互通是理所当然的。这种互通是二层互通跟单臂路由没有关系。当我把接入口配置成 trunk 并放通 VLAN 后如果 PC 仍然没有划入不同 VLAN它们依然可能互通而真正需要单臂路由的是把两个接入端口分别划入 VLAN 10 和 VLAN 20让它们处于不同的二层广播域之后再通过路由器互 ping 的过程。所以这里的重点不是“配置 access 后通不通”而是“通在三层还是二层”。我建议新手做这种对比实验时刻意在display vlan里把默认 VLAN 1 的归属看清楚再回头看通断原因就不会被表象迷惑了。5.3 trunk 放通 VLAN 后还不通的检查清单如果 Trunk 放通了 VLAN但跨网段还是不通按下面的清单排查检查交换机与路由器之间的线缆是否连对接口eNSP 里线缆连接错误也会导致接口 up 但报文不通。检查 Trunk 口是否真的放通了相关 VLAN放通了 VLAN 10 和 20注意port trunk allow-pass vlan 10 20的语法不要只写vlan 10。检查路由器子接口的dot1q termination vid与交换机侧 Trunk 放通的 VLAN 是否一一对应比如子接口写 VID 10交换机的 Trunk 却没放行 VLAN 10标签帧会被丢弃。检查 PC 的接入端口类型。如果接 PC 的口是 TrunkPC 发的是无标签帧交换机会按 Trunk 口的 PVID默认 VLAN 1打标PC 反而会被划分到错误 VLAN。最后检查路由器的物理接口是否被 shutdown以及子接口的 IP 是否配置在正确的网段。5.4 单臂路由排障速查表现象优先怀疑对象检查方式PC ping 不通网关网关地址或 PC 自身 IP/掩码配错核对 IP、掩码、网关是否同网段用arp -a看网关 MAC网关可以直接 ping 通跨网段不通子接口 ARP 广播未开启 / 路由表异常路由器display arp、display ip routing-table交换机侧 VLAN 不存在VLAN 未创建或 Access 口未划入交换机display vlanTrunk 口放通 VLAN 后仍不通dot1q VID 不匹配 / PVID 干扰对比display port vlan和路由器display ip interface brief路由器子接口 down物理接口 down 或子接口配置未生效检查物理接口undo shutdown重新创建子接口这张表是我多年调网络时的心得整理。遇到问题不要慌先固定“二三层分开排查”的思路再按表逐项验很快就能定位。排障最忌讳的就是反复重启设备、反复乱敲命令最后也不知道是哪个步骤救了你。6. 单臂路由的局限性以及什么时候该换方案6.1 单链路性能瓶颈单臂路由最大、最绕不开的瓶颈是那一条物理链路的带宽。所有跨 VLAN 流量无论从 VLAN 10 到 VLAN 20还是从 VLAN 20 到 VLAN 30都要挤在交换机到路由器的同一条链路上。一个典型的方案中如果链路上行 1Gbps那么跨 VLAN 互访的理论带宽上限就是 1Gbps而且是“去程回程”共享这 1Gbps。换句话说单臂路由的可用带宽并不是翻倍的链路越繁忙瓶颈越明显。所以在真实项目中单臂路由适合小型办公网络、分支机构、临时组网这类场景流量不大、设备成本敏感在核心汇聚位置通常不会用单臂路由顶着跑。知道这个天花板你在做容量规划时才不会犯错。6.2 与三层交换机 Vlanif 方案的对比三层交换机解决同一个问题的方案是在交换机上为每个 VLAN 创建 Vlanif 三层接口用交换机芯片直接承担跨 VLAN 的三层转发不走外部路由器。对比起来三层交换机的性能远高于普通路由器尤其是在南北流量比较大的场景下延迟和吞吐量都有优势。华为 VRP 里配置 Vlanif 也很简单interface Vlanif10配个 IP再把交换机的 Vlanif 接口启用即可。那是不是单臂路由就该被淘汰也不能这么说。三层交换机适合作为网络的汇聚核心但要求设备本身支持三层功能成本相对高单臂路由则能在已有的路由器和二层交换机上快速实现灵活度更高也在教学上把“路由发生在哪里”展示得明明白白。两条思路并不冲突实际组网经常是核心用三层交换机边缘用单臂路由或静态路由各取所长。6.3 从实验走向实战的几个建议把 eNSP 里的实验搬到真实设备之前我有几点经验供参考。第一真实场景里光纤和直连线的接口类型可能不一样路由器与交换机之间无论用 GE 口还是光口都别忘了让两端双工、速率协商一致。第二不要迷信一个子接口配一个 VLAN 永远够用遇到 VLAN 较多时配置量会线性增加排查复杂度也会上升必要时考虑用三层交换机或使用 DHCP 中继等更合适的手段。第三把所有规划写成文档VLAN 与网段的对应关系、网关地址、端口角色写清楚再动手能省掉后面大量返工。第四也是我碰过最多坑的地方生产设备上做变更一定要先保存配置操作完再验证出问题立刻回滚。这些听起来很基础但真正做到位的工程师调试速度往往是最快的。