ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

华为路由器静态路由配置与数据包封装原理详解:从Ping包读懂转发过程

华为路由器静态路由配置与数据包封装原理详解:从Ping包读懂转发过程 很多人学网络尤其是刚接触华为eNSP那会儿配静态路由基本靠背命令ip route-static 192.168.20.0 24 192.168.12.2。敲完一ping通觉得自己会了一旦不通就完全不知道从哪排查。根本原因不是命令记不住而是不理解这条命令在路由器里到底触发了什么更不理解数据包从PC出发、穿过路由器、再到对端设备的整个过程中封装和解封装每一跳发生了什么变化。这是网工入门阶段最常见的一道分水岭。这篇文章把路由器转发这件事从头拆到尾从一个Ping包在PC上生成开始跟着它穿过路由器看每一层封装怎么变化、MAC地址怎么替换、路由表怎么查最后落到华为设备的静态路由和默认路由配置命令上。内容覆盖路由器工作原理、数据包封装细节、华为VRP命令行实操适合正在准备华为认证、用eNSP做实验、或者刚接手企业网络维护的读者。看完可以自己在模拟器里完整复现一遍也能在真实设备上少踩几个坑。1. 路由器的分内事不决定“谁访问谁”只决定“下一步交给谁”1.1 路由器与交换机的分工差异要理解路由器先得把它和交换机分开。交换机工作在二层处理的是MAC地址维护一张MAC地址表数据帧进来查这张表决定从哪个物理口出去路由器工作在三层处理的是IP地址维护一张路由表IP报文进来查这张表决定下一跳交给谁。用生活里的场景类比交换机像小区物业只认楼栋和门牌号不关心你要去哪个城市路由器像长途车站的调度只告诉你下一站该坐哪趟车至于车到站之后怎么走到具体单元楼那是下一站调度的事。这个差异带来一个关键结论路由器是隔离广播域的边界。交换机组成的二层网络里广播报文会蔓延到整个广播域路由器不会把广播转发到其他网段这也是为什么不同网段之间必须通过三层设备互通。1.2 路由表里装的到底是什么路由器转发的依据不是一张复杂的图纸而是一张路由表。拿华为设备举例执行display ip routing-table会看到类似下面的输出Destination/Mask Proto Pre Cost Flags NextHop Interface 192.168.10.0/24 Direct 0 0 D 192.168.10.1 GigabitEthernet0/0/0 192.168.20.0/24 Static 60 0 RD 192.168.12.2 GigabitEthernet0/0/1 192.168.12.0/24 Direct 0 0 D 192.168.12.1 GigabitEthernet0/0/1每一行核心要素就几个Destination/Mask是目的网段和掩码Proto是路由来源Pre是优先级NextHop是下一跳IPInterface是从哪个接口出去。路由器收到一个数据包提取出目的IP在路由表里做匹配选出最精确的那一条然后把包从对应接口扔给下一跳完事。路由来源分为直连路由、静态路由、动态路由协议OSPF、BGP、RIP等。直连路由是接口配置IP后自动产生的静态路由是手工敲的动态路由是协议自己算出来的。本文重点放在静态路由和默认路由上它们在企业出口、分支互联、实验室环境里出现频率最高。1.3 查表之后还有一个“重新封装”交换机转发帧时一般不修改帧内容顶多学习源MAC、然后按目的MAC查表转发路由器不一样它收到一个二层帧之后会把帧头帧尾剥掉看到里面的IP报文查完路由表之后重新封装一个全新的二层帧再发出去。这个解封装再封装的动作是理解路由器转发最核心的一步也是很多刚接触抓包的人最容易懵的地方。简单说MAC地址只在同一条链路上有意义IP地址才是端到端的。所以IP报文从源到目的一直不变除了TTL之类字段而每一次跨路由器帧头里的源MAC和目的MAC都会被替换成当前这一段链路的实际地址。下面第二章就围绕这个展开完整过一遍。2. 一次Ping的完整旅程数据包封装与解封装的逐跳变化2.1 出发前PC如何决定把数据交给网关假设这样一个拓扑后面实验也会用到PC1IP 192.168.10.10/24网关192.168.10.1路由器R1GE0/0/0 192.168.10.1/24GE0/0/1 192.168.12.1/24路由器R2GE0/0/0 192.168.12.2/24GE0/0/1 192.168.20.1/24PC2IP 192.168.20.10/24网关192.168.20.1PC1执行ping 192.168.20.10数据链路层之前其实有个前置动作PC1要判断目的IP和自己是否在同一个网段。判断方法是用自己的子网掩码255.255.255.0分别和源IP、目的IP做按位与运算算出来192.168.10.0和192.168.20.0不一样结论是目的不在本网段必须把报文交给网关。于是PC1需要知道网关192.168.10.1的MAC地址。如果ARP缓存里没有就发一个ARP广播请求询问谁是192.168.10.1R1收到后回复自己的MAC。拿到网关MAC之后PC1开始封装网络层源IP 192.168.10.10目的IP 192.168.20.10TTL按操作系统默认值Windows默认128Linux默认64数据链路层源MAC PC1网卡MAC目的MAC 网关192.168.10.1的MAC类型字段0x0800标识上层是IPv4注意这里的关键点目的MAC不是PC2的MAC而是网关的MAC。因为对PC1来说它只负责把报文送到同一个二层域里的出口也就是网关剩下的事不属于它管。2.2 第一跳R1收到帧之后做了什么帧从PC1网卡经过网线进入R1的GE0/0/0。R1的工作可以拆成四步。第一步数据链路层处理R1检查帧头里的目的MAC发现是自己GE0/0/0接口的MAC确认这帧是发给自己的于是剥掉二层帧头和帧尾。第二步网络层处理R1看到IP头里的目的IP是192.168.20.10去查路由表找到一条静态路由192.168.20.0/24下一跳192.168.12.2出接口GE0/0/1。这条路由就是前面配置的静态路由。第三步重新封装准备R1把IP报文从GE0/0/1转发出去之前需要封装一个新的二层帧。要封装帧就必须知道下一跳192.168.12.2的MAC地址。R1查ARP表如果没有就从GE0/0/1发出ARP请求R2收到后回复自己的MAC。拿到之后R1更新ARP缓存。第四步重新封装并发送新帧的源MAC换成GE0/0/1的MAC目的MAC换成R2的GE0/0/0的MAC同时IP头里的TTL减1源IP和目的IP保持不变校验和重新计算然后从GE0/0/1发出。路由器转发的本质就在这个查表换MAC的过程里。IP决定了报文要去哪里路由表决定了下一跳是谁ARP表解决了下一跳IP对应的MAC是什么。三件事缺一不可。2.3 TTL、ARP与MAC地址的三张关键表在R2收到帧之后处理流程和R1完全一样剥帧、看目的IP、查路由表。R2发现192.168.20.0/24是直连网段于是查ARP表获取PC2的MAC没有就发ARP请求然后封装帧发给PC2TTL再减1。把PC1到PC2整个过程的数据字段变化整理成一张表会非常直观链路段落源MAC目的MAC源IP目的IPTTLPC1 → R1PC1网卡R1 GE0/0/0192.168.10.10192.168.20.10128R1 → R2R1 GE0/0/1R2 GE0/0/0192.168.10.10192.168.20.10127R2 → PC2R2 GE0/0/1PC2网卡192.168.10.10192.168.20.10126这张表值得多看两眼。IP地址端到端不变MAC地址逐跳更换TTL每经过一台路由器减1。这就是三层转发和二层交换最根本的区别。交换机转发的帧源MAC和目的MAC在整个二层域里是不变的路由器每跳拆一次封装、又封一次目的MAC永远指向下一跳设备的接口而不是最终的目的主机。TTL还有一个重要作用防止环路。如果网络里出现了路由环路报文会在路由器之间反复转发TTL耗尽之后被丢弃不会无限消耗带宽。排查环路的时候tracert命令能看到路径在哪一跳开始反复横跳原理也是基于TTL。2.4 回程为什么需要另一条路PC2收到ICMP Echo Request之后会构造一个ICMP Echo Reply回复。此时源IP和目的IP互换源IP变成192.168.20.10目的IP变成192.168.10.10。PC2同样判断目的不在本网段于是把帧发往网关192.168.20.1也就是R2。R2查路由表必须有一条去往192.168.10.0/24的路由否则回包被丢弃。很多初学者只在一台路由器上配了去程路由PC1 ping PC2不通折腾半天才想起来回程也要有路由——这就是路由要双向配置的根本原因。数据包是逐跳转发的每一跳都要知道目的网段该怎么走不只是PC1的网关知道就行。从R2到R1再到PC1回程同样经历剥帧、查表、重新封装的过程。区别只是方向反过来原理一模一样。3. 华为静态路由配置把命令翻译成路由器能听懂的决策规则3.1 静态路由命令的完整语义华为VRP上静态路由命令格式如下ip route-static 目的网络地址 掩码 { 下一跳地址 | 出接口 } [ preference 优先级 ]以实验场景为例需要在R1上增加一条到达PC2网段的路由system-view [R1] ip route-static 192.168.20.0 24 192.168.12.2这条命令的语义可以拆成四个部分192.168.20.0是PC2所在的网络号24是子网掩码长度等价于255.255.255.0192.168.12.2是R2上连接R1的那个接口的IP也就是下一跳。整句话翻译过来是凡是目的IP属于192.168.20.0/24这个网段的包都交给192.168.12.2处理。华为命令里掩码既可以写前缀长度24也可以写完整掩码255.255.255.0两种写法效果一样。配置完可以查看路由表确认[R1] display ip routing-table输出里会出现类似这样的条目Destination/Mask Proto Pre Cost Flags NextHop Interface 192.168.20.0/24 Static 60 0 RD 192.168.12.2 GigabitEthernet0/0/1Proto显示StaticPre显示60说明这是一条静态路由默认优先级60。只要这条路由在表里存在且下一跳可达R1就会按照它转发134目的网段的流量。3.2 下一跳到底该填什么出接口又是什么静态路由配置里最容易纠结的问题就是下一跳填什么出接口填什么在以太网链路上下一跳必须填对端设备的接口IP而不是随便填一个地址。原因回到第二章讲的重新封装路由器要封装帧必须知道下一跳IP对应的MAC这个信息通过ARP获得。如果你填了一个本网段里不存在的IPARP解析不到帧根本发不出去。那能不能只写出接口不写下一跳比如[R1] ip route-static 192.168.20.0 24 GigabitEthernet0/0/1这要分情况。在P2P链路上比如串口只写出接口没问题因为链路只有两端不需要MAC寻址但在以太网这类多路访问链路上只写出接口路由器虽然知道从GE0/0/1发出去却不知道二层帧的目的MAC填谁转发就可能失败。所以在华为设备上以太网接口之间的静态路由标准写法是下一跳IP也可以出接口加下一跳一起写[R1] ip route-static 192.168.20.0 24 GigabitEthernet0/0/1 192.168.12.2我个人习惯在以太网链路只写下一跳让路由表保持简洁串口链路写interface Serial因为串口本身没有MAC概念。这个习惯也方便排错display ip routing-table里Nexthop一列能直接看出下一跳是谁。3.3 优先级、负载分担与浮动静态路由华为静态路由默认优先级60数值越小优先级越高。直连路由优先级0OSPF内部路由优先级10静态路由60RIP路由100这个优先级排序要记住因为不同类型路由去往同一个目的网段时优先级高的会优先进路由表。优先级在实际组网里最典型的应用是浮动静态路由也就是一主一备。比如核心交换机到出口有两台设备主链路走A备份链路走Bip route-static 0.0.0.0 0 202.100.1.1 preference 60 ip route-static 0.0.0.0 0 202.100.2.1 preference 80两条默认路由目的相同优先级60那条会被写进路由表优先级80那条作为备份存在。当主链路接口或下一跳不可达时60的条目从路由表消失80的备份路由自动顶上。这个机制在双出口、双专线场景非常实用相当于手工实现了一个低成本冗余。如果两条静态路由一模一样、优先级也相同华为设备会把它们都放进路由表实现等价负载分担ip route-static 192.168.20.0 24 192.168.12.2 ip route-static 192.168.20.0 24 192.168.13.2流量会按流散列到两条链路上而不是每个包轮询。想调整负载分担算法可以看设备型号一般场景默认行为就够用。3.4 静态路由的适用边界静态路由的好处是简单、可控、不占用带宽也不容易被动态路由协议的各种状态搞晕。坏处同样明显它不感知网络拓扑变化。如果一条链路物理上还是通的但质量很差、频繁丢包静态路由没有任何机制去自动切到备用链路除非接口状态down掉。所以静态路由适合小规模、拓扑稳定、路径明确的网络小型分支出口、双设备互联、实验环境。大型网络或者链路经常变动的场景老老实实上OSPF、BGP这类动态路由协议。4. 默认路由兜底出口的正确打开方式4.1 默认路由解决什么问题默认路由在华为设备上的格式非常特殊目的网段和掩码都是0ip route-static 0.0.0.0 0 下一跳地址它表示除了路由表里明确列出的网段之外其余所有目的地址都走这里。最典型的场景是企业出口路由器内网可能有很多网段但访问外部网络的路径只有一条没有必要把全世界的网段都写进路由表一条默认路由指向运营商就行。默认路由解决的是没着落的流量问题。路由器查路由表先按最长匹配原则找最精确的条目找了一圈都没有才会落到0.0.0.0/0这个兜底条目上。所以默认路由不是优先级最高恰恰是匹配精度最低的那条它只在其他条目都匹配不上时生效。4.2 华为设备上的默认路由配置与验证配置默认路由的命令和静态路由几乎一样只是目的网段写0.0.0.0掩码写0system-view [R2] ip route-static 0.0.0.0 0 192.168.12.1这样R2上所有未知目的的流量都会发给R1。验证方式同样看路由表[R2] display ip routing-table输出末尾会出现Destination/Mask Proto Pre Cost Flags NextHop Interface 0.0.0.0/0 Static 60 0 RD 192.168.12.1 GigabitEthernet0/0/0注意Destination/Mask是0.0.0.0/0掩码长度为0覆盖所有IP地址。它代表的是匹配精度最低的最后一条路。还有一个容易混的点默认路由和动态路由协议里的默认路由宣告不是一回事。VRP里在OSPF或BGP中下发默认路由需要另外使用default-route-advertise之类的命令那是协议层面的逻辑静态默认路由只是ip route-static 0.0.0.0 0 ...这一条命令别搞混。4.3 默认路由和静态路由如何配合实际组网中静态路由和默认路由经常是配合着用的。回到实验拓扑R1需要知道PC2的网段怎么走R2需要知道PC1的网段怎么走。如果两边都配明细静态路由各写一条就行但假如网络是星型结构总部有十几个网段分支只有一条链路连总部分支路由器完全没有必要把总部所有网段都写一遍一条默认路由指向总部即可总部新增网段就算分支不知道流量兜底照样能到总部网关再由总部内部的路由协议去精确转发。反过来总部到分支通常也只写一条指向分支的聚合路由或默认路由。这种上游写明细、下游写默认的配合方式能少配很多条目也减少维护成本。但要注意路由是双向的无论哪一端配了默认另一端得保证回程路径存在否则照样丢包。5. 在eNSP里复现一套完整实验两台路由器把两台PC打通5.1 拓扑与地址规划下面这套实验我建议你亲手在eNSP里敲一遍它能同时验证第二章讲的封装过程和第三、四章的配置命令。拓扑非常简单两台PC分别连接两台路由器路由器之间用GE口互联。设备接口IP地址掩码网关PC1网卡192.168.10.10255.255.255.0192.168.10.1R1GE0/0/0192.168.10.124-R1GE0/0/1192.168.12.124-R2GE0/0/0192.168.12.224-R2GE0/0/1192.168.20.124-PC2网卡192.168.20.10255.255.255.0192.168.20.1先把拓扑连线PC1的以太网口连R1的GE0/0/0R1的GE0/0/1连R2的GE0/0/0R2的GE0/0/1连PC2。选设备的时候路由器用AR2220PC用默认的模拟终端。5.2 路由器接口与终端配置先配置R1的接口IPsystem-view sysname R1 interface GigabitEthernet0/0/0 ip address 192.168.10.1 24 quit interface GigabitEthernet0/0/1 ip address 192.168.12.1 24 quit再配置R2system-view sysname R2 interface GigabitEthernet0/0/0 ip address 192.168.12.2 24 quit interface GigabitEthernet0/0/1 ip address 192.168.20.1 24 quit真实设备上ip address配置完了还要确认接口没有被shutdown华为路由器接口默认是开启的但如果之前有人手动关过口需要执行undo shutdown恢复eNSP里接口默认也是UP状态一般不需要管。PC侧配置双击PC1在IP配置页填IP 192.168.10.10、掩码255.255.255.0、网关192.168.10.1PC2填192.168.20.10/24网关192.168.20.1。配置完成先做一个测试从PC1 ping PC2这时候一定是不通的。原因很明确R1路由表里只有直连网段192.168.10.0/24和192.168.12.0/24没有192.168.20.0/24的路由ICMP请求到R1之后会被丢弃。这个故意不通的环节很有价值能直观感受到路由缺失的表现。5.3 配置路由并验证连通性现在给R1加一条到PC2网段的静态路由system-view [R1] ip route-static 192.168.20.0 24 192.168.12.2给R2加一条回程的默认路由system-view [R2] ip route-static 0.0.0.0 0 192.168.12.1这条默认路由回程的做法正好呼应第四章的下游写默认思路R2不知道PC1在192.168.10.0/24把所有未知流量兜底交给R1由R1转发。此时再从PC1 ping PC2应该通了。如果想两边都写明细静态路由也可以把R2上那条默认路由换成[R2] ip route-static 192.168.10.0 24 192.168.12.1两种写法在实验里结果一样但语义不同可以都试一遍。验证命令建议养成习惯逐条执行display ip routing-table display ip interface brief display arp ping -a 192.168.10.1 192.168.20.10在R1上执行ping -a 192.168.10.1 192.168.20.10意思是源地址用192.168.10.1去ping目的192.168.20.10。如果通说明从R1的网关地址到PC2整条路径都是通的出问题的可能性就集中在PC1到R1这一段如果不同再按路由表逐跳排查。5.4 用抓包确认前面讲的封装过程eNSP支持在接口上直接抓包。在PC1连R1的那条链路上启动抓包再执行一次ping会看到PC1发出的帧源MAC是PC1的网卡MAC目的MAC是R1 GE0/0/0的MACIP层源地址192.168.10.10目的地址192.168.20.10。然后把抓包点放到R1和R2之间的链路上重新ping一次看到的帧会变成源MAC是R1 GE0/0/1的MAC目的MAC是R2 GE0/0/0的MACIP层地址完全没变。帧头发送者的MAC地址变了但IP层始终保持着端到端的信息这就是第二章讲的那张MAC变化表在实际报文里的真实样子。如果配置路由之前抓包还能看到ICMP请求到达R1后没有回应因为R1查不到路由直接丢弃了配置路由之后再抓就能看到完整的ICMP Echo Request和Echo Reply成对出现。建议新手都做一次这个对比印象会深刻很多。6. 配置静态路由时最容易踩的六个坑6.1 只配去程不配回程这是静态路由排障里出现频率最高的问题。现象是PC1 ping PC2不通但在R1上ping PC2可能又是通的或者在PC1上ping网关是通的ping对端PC就不通。排查思路很简单顺着数据包路径走在每台路由器上用display ip routing-table查看有没有目的网段的路由既查去程方向的R1也查回程方向的R2。只要有任何一个方向缺少路由条目报文就会被静默丢弃。ICMP报错不一定可靠因为设备可能不产生Destination unreachable回应所以不要只看表面现象直接看路由表最快。6.2 静态路由被写进路由表却不生效配置静态路由后display ip routing-table能看到条目但流量还是不通。最常见的原因是下一跳不可达。静态路由要生效前提是下一跳IP能被ARP解析也就是下一跳设备必须在线且和本端接口在同一个网段。排查方法是用display ip routing-table protocol static查看静态路由的详细信息再用display arp看下一跳IP对应的MAC是否解析成功。如果ARP表里没有先ping一下对端接口IP确认二层连通如果接口被shutdown或者对端接口配置了别的网段静态路由就算在表里也转发不了。6.3 掩码写错触发最长匹配问题静态路由的掩码不是随便写的。路由匹配遵循最长匹配原则目的IP可以匹配多条路由时掩码更长的条目优先。举个例子如果设备上同时存在192.168.20.0/24和192.168.20.0/25两条静态路由目的IP是192.168.20.10属于/25网段时会走/25那条而192.168.20.200会走/24。如果写错了掩码比如把一条本应匹配/24的静态路由写成/16它会吞掉一大片目的网段流量走向完全出乎意料。配置时先确定目的网段的精确范围再反推掩码别凭感觉填。6.4 ping -a源地址没指定引发的误判路由器上执行ping和PC上ping有个区别路由器会从出接口选源地址。R1上直接执行ping 192.168.20.10时VRP会根据路由表选择源地址大概率选GE0/0/1的192.168.12.1因为出接口是GE0/0/1。这个源地址没问题回程会回到R1自己。但如果执行ping -a 192.168.10.1 192.168.20.10源地址强制指定为192.168.10.1回程包的目的IP就变成了192.168.10.1。这时如果R2的路由表里没有192.168.10.0/24的路由ICMP Echo Reply根本回不来ping表现就是超时。这个现象特别有迷惑性容易让人误以为去程链路有问题实际上问题在回程路由或者源地址选择不对。6.5 eNSP路由器启动失败40的环境问题如果是在eNSP里做实验很多人会遇到路由器启动报错误40。这个问题通常是环境层面的常见原因是VirtualBox版本不匹配、WinPcap/Npcap驱动冲突、安装路径带中文或特殊字符。处理思路按顺序来先试试用管理员身份运行eNSP检查VirtualBox版本eNSP对VirtualBox版本有兼容要求版本太新或太旧都可能起不来再清理一下用户目录下的eNSP配置缓存重新启动。这三个动作能解决大部分启动报错。如果是实验做到一半突然所有路由器启动都失败优先怀疑VirtualBox服务状态打开VirtualBox看对应设备是否正常。6.6 经验总结排错的基本顺序静态路由排错我一般按这个顺序来效率最高检查物理链路和接口状态display ip interface brief确认接口UP、IP正确检查路由表逐台设备确认去程和回程方向的路由条目都在且下一跳正确检查ARP表确认下一跳MAC是否解析成功二层链路是否通从中间节点做分段ping测试缩小问题范围最后再检查ACL、防火墙策略等额外限制这个顺序覆盖了90%以上的静态路由故障场景。尤其是双向路由这个点每次排障都要在脑子里过一遍避免在最基础的问题上浪费时间。我在实际环境里见到过太多案例排查了大半天最后发现就是对端路由器少了一条回程静态路由。网络这个东西底层的原理扎实了排障就是按图索骥的事。
返回列表