多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

单臂路由配置详解:从原理到eNSP实战,搞定VLAN间通信

单臂路由配置详解:从原理到eNSP实战,搞定VLAN间通信 搞网络的人应该都遇到过这个场景两台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。传统做法是路由器一个接口接一个VLANVLAN多就要路由器接口多不现实。单臂路由的思路是交换机接到路由器的那根物理链路做成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/2PC2接交换机GE0/0/3。IP规划见下表对象VLAN网段网关接口PC1VLAN 10192.168.10.0/24192.168.10.1交换机GE0/0/2PC2VLAN 20192.168.20.0/24192.168.20.1交换机GE0/0/3路由器子接口 .10VLAN 10192.168.10.1/24-路由器GE0/0/0.10路由器子接口 .20VLAN 20192.168.20.1/24-路由器GE0/0/0.20这里先说一个规划要点网关地址就是路由器子接口的IP地址。PC的网关要填192.168.10.1子接口也要配置192.168.10.1二者必须一致否则PC发出的数据帧根本找不到去路由器的路。为什么用两个网段而不是同一个网段因为单臂路由要模拟的正是跨网段通信。如果两个PC配置成同一个网段但不同VLANPC会先发ARP广播找对端MAC交换机隔离了广播域导致ARP不通结果还是不通——这也是不少人实验半天找不到原因的坑之一。跨网段后PC知道对端不在自己网段直接找网关路由器才是正确的VLAN间通信模型。2.2 为什么用子接口而不是多接口规划完拓扑新手最常问的问题是AR2220有那么多物理接口为什么非要用一个物理接口加两个子接口直接把GE0/0/0配成VLAN 10的网关GE0/0/1配成VLAN 20的网关再接两条线到交换机不就行了可行但那叫多臂路由不叫单臂路由。多臂路由有两个硬伤第一物理接口占用多VLAN一多接口不够用第二交换机侧每个接路由器的接口必须分别配AccessVLAN再多路由器和交换机之间就要拉一堆线端口利用率极低。子接口的方式完全不同。在华为设备上子接口编号是物理接口后面加点再加编号比如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完全透明。命令配置如下Huaweisystem-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口只属于一个VLANport 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 IDIP地址作为该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标签配置敲完我想带你把整个数据流转过程走一遍因为单臂路由的每个细节都藏在帧结构里。PC1192.168.10.10要ping PC2192.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 PC2192.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 enablePC执行 arp -a 看网关MACPC ping不通PC网关没填或填错查看PC配置界面子接口down物理接口shutdowndisplay ip interface brief undo shutdown跨VLAN不通但同VLAN通Trunk口放通列表漏配VLANdisplay port vlan接口收到大量DiscardTrunk口PVID或Access类型错误display interface 看Discard计数交换机提示VLAN不存在未先创建VLANvlan batch 10 205.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接口、配防火墙的子接口策略思路都会特别顺畅。
返回列表