搞网络的朋友应该都有这种体会路由器工作原理和静态路由配置这两件事几乎每一个入门的人都在这上面栽过跟头。命令就一行看起来特别简单但一放到真实环境里往往就是配了不生效、通了又断、断了找不到原因。这篇文章我打算把路由器的转发逻辑彻底讲透再给出一套能直接照抄的静态路由配置流程把里面那些文档里不会写的细节和坑都翻出来。适合刚学网络基础的人、准备认证考试的以及那些被网关、路由、回程这几个词绕晕的运维新手。1. 先搞清楚路由器到底在做什么1.1 路由器的核心任务不是转发而是做决定很多人对路由器有个误解觉得它的工作是把数据从一个接口搬到另一个接口。这个理解不算错但抓错了重点。路由器真正值钱的地方是它的判断能力一个数据包从某个接口进来之后它得决定这个包该往哪个口出去如果有多条路还得决定走哪条最好。你可以把路由器想象成快递中转站。包裹从某个城市运过来中转站不看发件人是谁也不拆包裹看里面装了什么只看一件事收件地址属于哪个片区然后把它送上对应方向的货车。路由器的收件地址就是数据包里的目的IP地址片区划分表就是路由表。整个决策过程行业里叫查表转发这是路由器工作的灵魂。具体到数据包的处理流程大致是这么几步数据包到达路由器接口后二层帧头被剥离路由器只看三层的目的IP拿着这个目的IP去路由表里做匹配匹配到条目后会重新封装一个新的二层帧头源MAC改成出接口的MAC目的MAC改成下一个设备对应接口的MAC然后从匹配到的出接口把帧送出去。这就完成了一次转发。帧头里的TTL字段每经过一台路由器都要减一减到0就直接丢弃防止数据包在网络里绕圈子绕到天荒地老。这个流程里有两个关键点。第一路由器默认不转发广播帧这也是为什么不同网段之间必须靠路由器或三层网关才能打通。第二路由器只管目的IP它不关心这个包是从哪个接口进来的、源地址是谁只要路由表里有匹配项它就是机械地执行转发。理解这个逻辑之后很多排障思路就顺了。1.2 路由表的三个来源直连、静态、动态路由器的路由表不可能凭空生成它里面的条目来源有三条路。第一条是直连路由。只要给接口配置了IP地址并且接口状态是up的路由器就自动知道这个接口所在的网段是直连的、可以直接到达。这是最天然的路由不需要你手动配优先级最高。第二条是静态路由也就是我们这篇文章的主角管理员手动敲命令告诉路由器去某个网段该走哪个下一跳。第三条是动态路由比如OSPF、RIP这类协议让路由器之间自己交换网络信息、自动计算路径。这三种来源之间如果发生冲突谁说了算比的是管理距离数字越小越优先。常见场景里直连路由通常是0静态路由通常是1动态路由协议各自有不同的值。这就是为什么你配了一条静态路由看路由表时它还是抵不过直连路由的原因——物理接口本身已经知道了那个网段你再用静态路由去指同一个目的网段多数情况下是无效的。静态路由能一直占有一席之地原因很简单稳定、可控、省资源。它不占用带宽、不消耗设备CPU去算来算去路由怎么走完全由管理员掌控排障逻辑清晰。坏处也明显网络拓扑一旦变化它不会自己适应得靠人手动改。所以在小型网络、分支互联和出口网关这些场景里静态路由依然是最实用的方案。2. 路由表里的门道字段、优先级和最长匹配2.1 路由表字段怎么看在设备上敲一条show ip route会蹦出一堆条目很多新手一看就懵。其实拆开来看一条路由就五个关键信息目的网络、子网掩码、下一跳、出接口、管理距离/度量值。目的网络和掩码合在一起定义了这个路由管的是哪个地址范围。下一跳出接口则告诉路由器想到达那个范围数据包该交给谁、从哪个口送出去。管理距离和度量值则用来决定多路由优先级的。举个例子路由表里出现一条S 192.168.20.0/24 [1/0] via 192.168.99.2。开头的S代表来源是静态路由192.168.20.0/24是目的网段[1/0]前面这个1是管理距离、后面这个0是度量值via后面跟的是下一跳地址。这一行翻译过来就是管理员手工指定过要去192.168.20.0这个网段把包丢给192.168.99.2就行。你注意细节这条路由并没直接写出接口只写了下一跳。路由器拿到这个条目后还需要再去查一下192.168.99.2这个地址本身怎么到达。如果它是一个直连网段的地址路由器就直接走对应接口如果不是它还得继续递归查找。这个机制叫递归查找是理解很多静态路由坑的基础后面我详细讲。2.2 管理距离与度量值决定听谁的路由表有时候会对同一个目的网段出现多条可选路径比如你同时配置了静态路由和动态路由协议或者一条静态路由配了两条链路。这时路由器怎么选靠两个数字管理距离和度量值。它们的关系是分层的。管理距离是跨协议比较的优先级可以理解成不同部门发言权的排序比如直连路由的0最大静态的1次之动态协议再往后排。不同厂商的具体默认值有差异但大体逻辑一致。路由器永远先看管理距离数值小的先进路由表。当管理距离相同时比如两条都是静态路由且去往同一个目的网段它们就会进入路由表形成等价路径后续根据度量值来做负载均衡。静态路由的度量值默认是0所以两条静态路由会同时生效、来回分摊流量。如果你希望某一条作为主链路、另一条只做备份就需要去调整备份路由的管理距离让它数字变大。这就是浮动静态路由的思路后面实操章节我会演示。2.3 最长前缀匹配查表不是看热闹确定了哪条路由能进路由表之后真正转发时还有个更容易被忽略的规则最长前缀匹配。意思是说路由表里可能有多个条目都能配上这个目的IP但路由器会选择掩码最长、也就是地址范围最小最精确的那一条。举个例子数据包的目的IP是192.168.20.5。路由表里同时存在三条匹配条目192.168.0.0/16、192.168.20.0/24、192.168.20.4/30。按最长前缀匹配路由器会选192.168.20.4/30这一条因为它的掩码最长、范围最精确。这个机制非常有用它让路由器能在走大方向默认路由和走精确小路由之间自由组合。你可以配一条默认路由兜底再针对个别网段配更精确的路由覆盖它实现灵活的策略。这个规则还解释一个常见现象你在路由器上配了默认路由指向出口又配了一条精确的静态路由指向某个内网数据包去那个内网时不会傻乎乎走默认路由而是精确命中那条内网路由。这不是某个设备特有的行为是所有具备三层转发能力的设备共同遵守的行业标准。3. 静态路由配置完整实操3.1 实验拓扑和规划说一万遍原理不如动手配一遍。我习惯用一个最经典的双路由器拓扑来讲静态路由结构简单但该踩的坑一个不少。规划这样一个网络A区域PC-A接在路由器R1上网段192.168.10.0/24网关是192.168.10.1B区域PC-B接在路由器R2上网段192.168.20.0/24网关是192.168.20.1R1和R2之间用一条串行链路也可以用两个以太网口直连相连这段互连网段我用192.168.99.0/30。之所以用30位掩码是因为点对点链路只需要两个可用的IP地址一个给R1、一个给R2多一个都浪费这也是工程上最常见的做法。规划表我给你列出来设备接口IP地址作用PC-Aeth0192.168.10.10/24A区域终端网关192.168.10.1R1g0/0192.168.10.1/24A区域网关R1g0/1192.168.99.1/30连接R2的互联口R2g0/0192.168.99.2/30连接R1的互联口R2g0/1192.168.20.1/24B区域网关PC-Beth0192.168.20.10/24B区域终端网关192.168.20.13.2 逐台配置接口、地址、网关我先说一句下面的命令以最常见的命令行语法为例不同厂商设备指令字符略有差别但思路完全一致。你在真实设备上做实验时只要把关键参数对齐就好。先配置R1的接口。进入接口视图给g0/0配IP给g0/1配IP这步做完R1就自动有了两条直连路由192.168.10.0/24和192.168.99.0/30。interface g0/0 ip address 192.168.10.1 255.255.255.0 no shutdown interface g0/1 ip address 192.168.99.1 255.255.255.252 no shutdownR2同理interface g0/0 ip address 192.168.99.2 255.255.255.252 no shutdown interface g0/1 ip address 192.168.20.1 255.255.255.0 no shutdownPC的配置更简单PC-A的地址给192.168.10.10掩码255.255.255.0网关192.168.10.1PC-B的地址给192.168.20.10掩码255.255.255.0网关192.168.20.1。此时验证一下从R1 ping R2的互联地址192.168.99.2应该是通的因为直连路由已经自动建立了。但如果你想从PC-A ping PC-B一定是不通的而且不是PC的配置问题。原因就是静态路由还没配R1收到目的为192.168.20.10的包之后查遍路由表也找不到去192.168.20.0/24的路直接就丢弃了。这就是路由器的工作方式它不会猜表里没有就是没有丢包毫不含糊。3.3 静态路由命令的两种写法与关键差异现在给R1配上到B区域网段的静态路由。命令只有一行ip route 192.168.20.0 255.255.255.0 192.168.99.2把这条命令念出来就是去192.168.20.0网段把包交给192.168.99.2这个下一跳处理。192.168.99.2是R2的互联接口地址属于R1的直连网段所以R1能直接通过g0/1口把包送出去。同理R2上也要配上到A区域网段的静态路由否则B区域回不去A区域ip route 192.168.10.0 255.255.255.0 192.168.99.1这里有一个我见过太多人踩的坑静态路由可以写成下面这种出接口形式ip route 192.168.20.0 255.255.255.0 g0/1两种写法在点到点串行链路上基本等价但在以太网链路上差别很大。原因在于以太网是广播多路访问网络一个接口下可能挂着多台设备。你只写出接口g0/1时路由器会把所有目的IP都当成在这个接口的二层域内它会在接口上广播ARP请求问谁是192.168.20.1这完全违背了把包交给下一跳路由器再转发的本意可能导致包被送到错误的地方。如果写成下一跳地址192.168.99.2路由器就会明确地ARP解析192.168.99.2这个地址把包准确地交给R2。所以我的习惯是以太网环境一律写下一跳地址不要只写出接口这条建议能帮你省掉大量排障时间。3.4 验证从ping到tracert配置完成后验证要一步步来别上来就在PC-A上ping PC-B通了还好说不通你会很被动。正确的验证顺序是先在PC-A上ping自己的网关192.168.10.1通了说明PC和R1的链路没问题。然后在R1上ping R2的互联地址192.168.99.2通了说明R1到R2的链路没问题。然后在R1上ping PC-B的地址192.168.20.10通了说明R1的静态路由没问题而且这会同时验证R2上是否有回程路由。注意如果R2上没配回程路由R1 ping PC-B大概率也是不通的或者通一部分因为PC-B回包时R2不知道192.168.10.0/24该往哪走。最后再到PC-A上ping PC-B全链路就通了。验证命令值得多说几句。show ip route用来查路由表看静态路由是否真的进去了show ip interface brief用来查接口状态和IP地址是否正确tracert用来跟踪路径能看到包经过了哪些跳数。这些都是网络工程师的吃饭家伙。我第一次带徒弟时就反复强调不会用tracert之前你先别急着说网络不通先看清楚不通在哪一跳是哪台设备丢的包再下结论。4. 进阶默认路由、浮动路由与汇总路由4.1 默认路由给出口网关兜底静态路由里还有一个非常常用的特殊形式默认路由也叫缺省路由。命令写法是把目的网络和掩码都写成0ip route 0.0.0.0 0.0.0.0 192.168.99.2它的含义是所有在路由表里找不到精确匹配条目的流量统统交给192.168.99.2处理。这就像快递中转站对没有明确分区的包裹统一送进一个综合处理组。默认路由的价值体现在出口网关上。比如公司只有一个互联网出口内部网段几十个你不会也不想给每一个网段都配一条去往出口的路由一条默认路由指向出口设备就够了。主机上其实也有类似概念PC的默认网关本质就是一条默认路由。你要理解默认路由并不是不重要的路由恰恰相反它是路由表里兜底的关键角色。配合最长前缀匹配机制精确路由默认路由的组合能覆盖绝大多数网络需求。4.2 浮动静态路由低成本做链路备份静态路由听起来静态好像改不了但其实它有一种很灵活的用法浮动静态路由专门用来做备份链路。场景是这样的你有两条链路都能到达同一个目标网段一条是主用专线速度快带宽大一条是备份链路平时不想让它走流量只在主链路断掉时接管。这时候两条静态路由去往同一个目的网段管理距离需要人为拉开差距。默认静态路由的管理距离通常是1我给主链路配默认值1给备份链路配一个更大的值比如10或100。数字大的那条平时不会出现在路由表里只有主链路失效、数字小的那条消失之后备份路由才会被激活、进入路由表并接管流量。命令是这么写的ip route 192.168.20.0 255.255.255.0 192.168.99.2 ip route 192.168.20.0 255.255.255.0 192.168.88.2 100第二条多出来的100就是管理距离。主链路正常时路由表里只有第一条你拔掉主链路路由表里的第一条消失第二条自动浮现流量无缝切换到备份链路。这个过程不需要任何脚本全凭路由协议机制完成。很多防火墙的双WAN口备份底层思路其实就是这个。4.3 汇总路由让路由表瘦身路由表越短查询越快出错的概率也越低。汇总路由就是一个合并同类项的技巧。假设你的分支结构里有四个连续网段192.168.0.0/24、192.168.1.0/24、192.168.2.0/24、192.168.3.0/24。如果每个网段都在总部路由器上单独写一条静态路由那就得写四条。但如果这四个网段是连续的你可以用一条汇总路由替代ip route 192.168.0.0 255.255.252.0 192.168.99.2255.255.252.0这个掩码对应的就是/22覆盖了从192.168.0.0到192.168.3.255整个范围。一条路由管四个网段。前提是这几个网段在地址规划上必须连续否则汇总出来的范围会把你不想包含的网段也包进去反而造成路由黑洞。顺带说一句汇总路由和最长前缀匹配是配合使用的。就算你配了汇总路由只要某个具体网段还有更精确的路由条目在路由表里数据包依然会优先走精确路由。所以汇总路由干的是兜底的活精确路由干的是精细控制的活两者不冲突。5. 配置静态路由时最常见的5个坑5.1 回程路由缺失这个坑在我见过的初学者错误里占比最高配置了R1到B区域的静态路由PC-A访问PC-B的请求包能过去但PC-B的回包到R2后就没了下文R2根本不知道192.168.10.0/24在哪。症状很典型ping不通但在R1上ping R2的互联地址是通的在PC-A上ping网关也是通的。解决方式也简单双向静态路由。数据包要能来回路径上的每一台路由器都必须知道如何到达包的目的网段。你给R1配了去B的就必须在R2上配一条去A的。这就像送快递发件地邮局知道收件地怎么走还不够收件地邮局也得知道怎么把回执送到发件地。我排查所有静态路由问题时第一件事永远是检查回程路由八九不离十。5.2 静态路由不生效下一跳不可达有时候命令敲得一字不差show ip route里却看不到那条静态路由或者看到了但状态不对。最常见的幕后黑手是下一跳不可达。前面提过路由器在转发前需要递归查找下一跳地址确保自己能到达那个下一跳。如果下一跳地址不在路由器的任何一条直连路由或已知路由范围内这条静态路由就无法被解析不会出现在路由表里或者一直处于无效状态。检查方法非常简单ping一下你写的下一跳地址通不通再看这台设备的路由表里有没有能到达下一跳地址的路由。尤其要小心下一跳地址写错的情况比如把192.168.99.2写成了192.168.99.22这种笔误在真实环境里很常见因为互联地址往往长得很像手一抖就错了。5.3 掩码写错导致路由范围不对静态路由命令里掩码是最容易随手出错的部分。把255.255.255.252误写成255.255.255.0范围立刻扩大很多路由可能覆盖到本不应该走这条路的网段造成奇怪的选路甚至环路。更隐蔽的一种错误是掩码和地址不对齐。比如你想配的是192.168.10.0/24手误写成192.168.10.1/24这个地址不在网段边界上设备可能直接拒绝也可能把它解释成一个奇怪的聚合范围。养成一个好习惯配置静态路由之前先把网段和掩码在纸上换算一遍确认网段起始地址、结束地址、掩码三者一致再敲命令。这个习惯看着笨但在生产环境能救命。5.4 路由环路与错误方向两台路由器互相把下一跳指向对方而且没有正确的兜底路径就会出现路由环路。数据包在这两台设备之间来回弹跳直到TTL耗尽被丢弃用户感知就是网络非常慢、甚至不通。我曾经在实验中见过一种经典错误R1配了到192.168.20.0/24的静态路由下一跳写的是R2的地址R2也在不知情的情况下配了一条到192.168.20.0/24的静态路由下一跳居然写的是R1的地址。结果R2收到目的为192.168.20.x的包后发现路由表里说交给R1于是把包又送给R1R1再查表又说交给R2于是包在这两台设备之间反复横跳形成死循环。排查环路靠tracert最直观你会发现路径上的第几个跳数来回重复TTL递减后最终超时。这提醒我们配置静态路由时一定要先在纸上画清楚拓扑和数据流向尤其是在跨多设备时别让两台设备互相指错方向。5.5 双链路场景下的选路误区最后一个坑是关于等价路由的误解。当你给同一个目标网段配了两条不同的静态路由、管理距离又相同路由器会把它们同时放进路由表实现负载均衡。但这个负载均衡是逐包还是逐流取决于设备实现和数据包结构不一定能给你想象中那种分摊流量的效果。更关键的是静态路由负载均衡没有感知链路质量的能力。如果某一条下一跳所在的链路已经拥塞但只要接口不down路由器依然会往那条路上发流量。所以指望静态路由做智能流量调度方向就错了。真正的路径调优和故障自动切换应该交给动态路由协议或者用浮动静态路由人为控制主备而不是靠多条等价静态路由硬扛。我见过不少小型网络想靠双静态路由做冗余结果某条链路断了但接口没down流量照样往黑洞里填排查半天才恍然大悟。写到这里我想多说一句自己的体会。有人觉得静态路由是基础中的基础没什么好学的。但正是这些基础的东西决定了你排障时脑子里有没有一个清晰的模型。我在实际配置和排障中发现凡是能把静态路由的转发逻辑讲清楚的人学起OSPF、BGP来都特别快因为他们不是在背命令而是在理解路由器怎么思考。这套实验做完之后我建议大家一定要亲手把拓扑搭一遍、配一遍、故意把某个路由删掉再看现象亲手踩过坑印象才最深刻。如果你在做完这些之后还有余力可以试试再加一台路由器组成三跳网络把静态路由、默认路由、浮动路由混着配一遍那时候你对路由决策这个事的理解就会真正上一个台阶。
阅读完成 · 觉得有帮助?