1. 路由到底在干什么:从一次跨城寄快递说起
很多人第一次接触“网络路由”这个词,脑子里浮现的是机房、机柜、一堆闪着绿灯的黑盒子。其实你每天都在用路由,只是没意识到。你点一份外卖,骑手从商家到你家,中间要经过好几个路口,每个路口他都要判断“往左还是往右”。网络路由干的就是骑手干的活,只不过它送的是数据包,路口换成了路由器,地图换成了路由表。
我习惯把路由拆成三个问题来看:数据包从哪来、要到哪去、下一跳交给谁。这三个问题回答清楚了,路由这件事就通了八成。剩下的两成是:当有多条路都能走的时候,选哪条;当某条路断了的时候,怎么绕。前者叫路由选路,后者叫路由收敛。你把这五个词吃透——路由表、下一跳、度量值、收敛、默认路由——基本就能看懂绝大多数网络拓扑了。
这篇文章适合谁看?如果你是刚入行的运维、刚考完网络基础课的学生、或者自己在家折腾软路由的爱好者,那这篇内容就是给你写的。我会从路由表的结构讲起,一路讲到静态路由和动态路由的取舍、常见协议的脾气、以及我在实际排障中踩过的坑。不堆术语,尽量用你能听懂的话把原理讲透,再给你可以直接抄的配置思路。
2. 路由表:路由器的“导航地图”长什么样
2.1 一条路由条目里藏着哪些信息
路由器的核心就是一张表,叫路由表。你可以把它理解成手机导航里的“路线列表”。每一条路由条目,至少包含这几个字段:
| 字段 | 含义 | 生活类比 |
|---|---|---|
| 目的网络 | 这个数据包要去哪个网段 | 你要去的那个小区 |
| 子网掩码 | 这个网段有多大 | 小区占地范围 |
| 下一跳 | 交给哪个邻居转发 | 下一个路口往哪拐 |
| 出接口 | 从哪个网卡发出去 | 走哪条车道 |
| 度量值 | 这条路“好不好走” | 红绿灯多不多、堵不堵 |
| 优先级 | 多条路时先信谁 | 导航推荐路线 vs 备选路线 |
我见过不少新手排障时只盯着“能不能通”,却不去看路由表里到底有没有那条路。排障第一步永远是看路由表,就像导航失灵时你第一反应是看地图有没有加载出来,而不是猛踩油门。
2.2 最长前缀匹配:为什么“更具体”的路优先
路由表里可能同时存在好几条都能匹配同一个目的地址的条目。比如:
10.0.0.0/8走网关A10.1.0.0/16走网关B10.1.2.0/24走网关C
现在有个数据包要去10.1.2.5,三条都“沾边”,选哪条?答案是最长前缀匹配,也就是掩码最长、最具体的那条,走网关C。
这个规则背后的逻辑很朴素:越具体的描述越可信。10.0.0.0/8说的是“整个10开头的大区域”,10.1.2.0/24说的是“就这一栋楼”。导航当然优先听“就这一栋楼”的。
提示:很多人配了明细路由却发现不生效,八成是被一条更长的前缀“截胡”了。查路由表时一定要看掩码长度,别只看网段。
2.3 默认路由:那条“其他都走这里”的兜底
默认路由写作0.0.0.0/0,意思是“所有我没明确写过的目的地,都从这条走”。它通常指向你的上游网关。家用路由器里那条“默认网关”,本质就是一条默认路由。
默认路由的价值在于缩小路由表规模。你不可能把互联网上每一个网段都写进本地路由表,所以只需要写“本地网段走内网,其余全丢给上游”。这是分层思想的体现:我只管我这一层,上面的事交给上面。
但默认路由也是把双刃剑。配错了方向,流量就会像走错高速匝道一样绕一大圈。我踩过一次坑:两条默认路由指向不同上游,结果因为优先级没设好,流量全走了慢的那条,排查了半天才发现是度量值的问题。
3. 静态路由与动态路由:手动挡和自动挡的取舍
3.1 静态路由:简单、可控,但怕变
静态路由就是管理员手动写死的路由条目。它的优点是不占CPU、不占带宽、行为完全可预测。小网络里,比如两个办公室之间拉一条专线,两边各写一条静态路由,清清楚楚,谁也不用跟谁“商量”。
配置静态路由的典型命令长这样(以常见网络设备语法为例):
ip route 192.168.2.0 255.255.255.0 10.0.0.2意思是:去192.168.2.0/24的包,交给下一跳10.0.0.2。
静态路由的软肋也很明显:网络一变,它不会自己适应。上游断了、链路切换了,静态路由还傻乎乎地往老路指,直到你手动改。所以它适合拓扑稳定、规模小的场景。
3.2 动态路由:让路由器自己“商量”出路线
动态路由是路由器之间通过协议交换信息,自动算出最优路径。常见的动态路由协议有这几类:
| 协议 | 类型 | 典型场景 | 特点 |
|---|---|---|---|
| RIP | 距离矢量 | 小型网络、教学 | 简单,但跳数限制15,收敛慢 |
| OSPF | 链路状态 | 企业内网 | 收敛快,分层设计,最常用 |
| IS-IS | 链路状态 | 大型运营商网络 | 扩展性强,配置偏底层 |
| BGP | 路径矢量 | 跨域、互联网边界 | 策略灵活,规模巨大 |
选哪个,取决于你的网络规模和需求。我一般这么建议:小网络静态路由够用,中型企业内网上OSPF,跨多个大区域或对接外部网络才考虑BGP。别一上来就上BGP,那是杀鸡用牛刀,配置复杂度和排障难度都会陡增。
3.3 度量值:多条路都能走时,凭什么选它
动态路由协议算出多条可达路径时,靠度量值来比大小。不同协议的度量值算法不一样:
- RIP 用跳数,经过的路由器越少越好。
- OSPF 用开销,通常和带宽挂钩,带宽越高开销越小。
- BGP 用一堆路径属性,比如AS路径长度、本地优先级等。
这里有个容易混淆的点:不同协议之间的度量值不能直接比较。OSPF算出来的开销是10,RIP算出来的跳数是2,这俩没法比大小。所以路由器引入了管理距离这个概念,用来决定“当多个协议都提供了去同一目的地的路由时,先信哪个协议”。
| 路由来源 | 默认管理距离 |
|---|---|
| 直连 | 0 |
| 静态路由 | 1 |
| OSPF | 110 |
| RIP | 120 |
| BGP(外部) | 20 |
管理距离越小越优先。所以直连永远最可信,静态次之,动态协议再次。这个顺序符合直觉:自己亲眼看到的(直连)> 自己手动写的(静态)> 别人告诉你的(动态)。
4. 动态路由协议的核心机制:邻居、泛洪、收敛
4.1 邻居建立:先交朋友再交换情报
动态路由协议的第一步是建立邻居关系。两台路由器要先“握手”,确认对方是自己的同类,才能交换路由信息。以OSPF为例,邻居建立要经过几个状态:Down、Init、2-Way、ExStart、Exchange、Loading、Full。只有到了Full状态,才说明双方数据库同步完成。
我排障时最常看的也是邻居状态。邻居起不来,后面全是空谈。邻居起不来的常见原因有:
- 接口没启用该协议
- 双方区域号不一致
- 认证密码不匹配
- 网络类型不匹配(比如一边广播一边点对点)
- MTU不一致导致卡在ExStart
提示:邻居卡在ExStart或Exchange,十有八九是MTU问题。这个坑我踩过不止一次,抓包看半天,最后发现两边接口MTU差了4个字节。
4.2 泛洪与数据库同步:把地图发给所有人
链路状态协议(如OSPF、IS-IS)的核心思想是:每台路由器都掌握全网的完整地图。怎么做到?靠泛洪。每台路由器把自己周围的链路状态打包成LSA(链路状态通告),发给所有邻居,邻居再转发给它们的邻居,直到全网每台路由器都收到。
这个过程叫数据库同步。同步完成后,每台路由器手里都有一份相同的“全网地图”,然后各自用最短路径算法(Dijkstra)算出到各个目的地的最优路径。
这就像一群人要一起画一张地图:每个人负责画自己家门口那一段,然后把画好的部分传给所有人,最后每个人手里都有一张完整地图。好处是每个人都能独立算路,不依赖某个“中心大脑”。
4.3 收敛:网络变了,多久能重新算好
收敛指的是网络拓扑发生变化后,所有路由器重新达成一致、路由表更新完成的过程。收敛速度是衡量动态路由协议好坏的关键指标。
RIP收敛慢是出了名的,因为它靠定时广播,默认30秒发一次,加上抑制、失效计时器,一次收敛可能要几分钟。OSPF快得多,链路一断,LSA立刻泛洪,几秒内就能重新算路。
但收敛快也有代价:泛洪会消耗带宽和CPU。所以大型网络里要做区域划分,把泛洪限制在区域内部,区域之间只交换汇总路由。这就是OSPF的分层设计:骨干区域(Area 0)负责中转,其他区域挂在骨干区域上。
5. 实操:从零搭一个能跑OSPF的小网络
5.1 拓扑设计与地址规划
假设有三台路由器R1、R2、R3,串成一条线,各自还挂一个业务网段。地址规划如下:
| 设备 | 接口 | 地址 | 说明 |
|---|---|---|---|
| R1 | G0/0 | 10.0.12.1/30 | 连R2 |
| R1 | G0/1 | 192.168.1.1/24 | 业务网段A |
| R2 | G0/0 | 10.0.12.2/30 | 连R1 |
| R2 | G0/1 | 10.0.23.1/30 | 连R3 |
| R3 | G0/0 | 10.0.23.2/30 | 连R2 |
| R3 | G0/1 | 192.168.3.1/24 | 业务网段C |
规划原则:互联链路用/30,省地址;业务网段用/24,够用且好记。所有设备都划进Area 0,先跑通单区域,再考虑多区域。
5.2 逐台配置与关键参数说明
以R1为例,配置思路是:先配接口地址,再启用OSPF,把网段宣告进去。
interface G0/0 ip address 10.0.12.1 255.255.255.252 ! interface G0/1 ip address 192.168.1.1 255.255.255.0 ! router ospf 1 router-id 1.1.1.1 network 10.0.12.0 0.0.0.3 area 0 network 192.168.1.0 0.0.0.255 area 0几个关键点:
- router-id必须唯一,通常用环回口地址或手动指定。不指定的话路由器会自己选一个,可能导致意外。
- network命令里的掩码是反掩码,不是子网掩码。
0.0.0.3对应/30,0.0.0.255对应/24。这个反掩码是新手最容易写错的地方。 - 宣告的网段要精确,别图省事宣告个大网段,容易把不该跑OSPF的接口也拉进来。
R2和R3照葫芦画瓢,注意router-id各不相同,互联网段两边都要宣告。
5.3 验证:邻居起来了吗,路由学到了吗
配完先别急着ping业务地址,按顺序验证:
- 看邻居状态:
show ip ospf neighbor,应该看到对方是Full。 - 看路由表:
show ip route ospf,应该看到从对方学来的业务网段,前面标着O。 - 再ping:从R1的192.168.1.1 ping R3的192.168.3.1,应该通。
如果邻居没起来,回到4.1节列的那几个原因逐个排查。如果邻居起来了但路由没学到,检查network宣告是否覆盖了对应网段。
提示:验证时养成“从下往上”的习惯——先看接口up没up,再看邻居,再看路由表,最后才ping。跳步排查容易绕远路。
6. 常见问题与排查技巧实录
6.1 路由环路:数据包在打转
路由环路是路由领域最经典的问题。现象是:ping一个地址,TTL超时,抓包看到包在两个接口之间来回跳。原因通常是双向路由不一致:A认为去某网段要走B,B认为要走A,于是包在两者之间弹乒乓球。
排查方法:
- 看两边的路由表,确认去同一目的地的下一跳是否互相指向对方。
- 检查是否有错误的静态路由或汇总路由。
- 动态协议里,检查是否配置了正确的水平分割或毒性逆转。
防环机制里,水平分割(从某接口学来的路由不再从该接口发回去)和毒性逆转(把学来的路由标记为不可达再发回去)是最常用的。OSPF靠区域结构和SPF算法天然防环,RIP则主要靠这两招。
6.2 次优路径:能通,但绕远了
次优路径比环路隐蔽,因为网络是通的,只是走得不对。比如明明有直连链路,流量却绕了一圈。常见原因是管理距离或度量值配置不当,导致路由器选了次优的那条。
排查时对比“实际走的路径”和“理论最优路径”。用traceroute看实际跳数,再对照路由表算理论跳数。如果对不上,就去查度量值和管理距离。
我遇到过一次:两条去同一目的地的静态路由,一条指向专线,一条指向备用链路,结果因为两条管理距离都是默认的1,路由器按先来后到选,选了备用链路。解决办法是给备用链路的管理距离调大,比如设成5,让它只在专线失效时才生效。
6.3 常见问题速查表
| 现象 | 可能原因 | 排查动作 |
|---|---|---|
| 邻居起不来 | 区域号/认证/MTU不匹配 | 逐项对比两端配置 |
| 路由学不到 | network宣告遗漏 | 检查宣告网段和反掩码 |
| 能通但绕远 | 度量值/管理距离不当 | 对比实际与理论路径 |
| 时通时不通 | 路由震荡 | 看日志,查链路稳定性 |
| 部分网段不通 | 汇总路由黑洞 | 检查汇总范围是否过大 |
6.4 几条我踩坑换来的经验
第一,改配置前先备份。路由配置改错一行,可能整个网段失联。我习惯改之前先导出当前配置,改完对比差异。
第二,变更选在低峰期。动态路由协议收敛时会有短暂中断,业务高峰期做变更风险大。
第三,别迷信“默认配置”。很多协议的默认计时器、默认度量值在特定场景下并不合适,该调就得调。
第四,文档要跟上。拓扑图、地址表、路由策略,改完就更新。三个月后你自己都记不清当时为什么那么配。
7. 路由策略与进阶方向:让流量按你的意思走
7.1 策略路由:不只看目的地,还看来源
传统路由只看目的地址,策略路由(PBR)可以基于源地址、协议、端口等条件来决定怎么转发。比如“研发网段的流量走专线,办公网段的流量走普通宽带”,这就是策略路由的典型用法。
配置思路是定义匹配条件(ACL或前缀列表),再定义动作(下一跳或出接口),最后应用到接口的入方向。注意策略路由优先于普通路由表,匹配上了就按策略走,匹配不上才查路由表。
7.2 路由重分发:让不同协议“互通有无”
当一个网络里同时跑多种路由协议时,需要重分发来让它们交换路由。比如核心跑OSPF,边缘跑RIP,就得在边界路由器上把RIP的路由重分发进OSPF,反之亦然。
重分发最容易出问题的地方是度量值转换。不同协议的度量值算法不同,重分发时必须手动指定一个种子度量值,否则路由可能被丢弃或形成次优路径。我的经验是:重分发时配合路由过滤,只放行需要的网段,别一股脑全倒进去。
7.3 后续可以怎么深入
路由这个领域,往深了走有几个方向:一是大型网络的分层设计,怎么划区域、怎么做汇总、怎么设计骨干;二是路由安全,比如认证、防欺骗;三是自动化运维,用脚本批量下发和校验路由配置。
我个人的建议是先把单区域OSPF和静态路由玩熟,再逐步扩展到多区域、重分发、策略路由。每上一个新特性,都在实验环境里先跑通,别直接上生产。路由这东西,理论看十遍不如动手配一遍,配一遍不如排一次障。真正的经验,都是在“怎么又不通了”的深夜里攒出来的。
最后分享一个小习惯:我会给每条关键静态路由写注释,标明用途和变更日期。设备配置里加注释不占资源,但排障时能救命。这个习惯坚持几年下来,帮我省下的时间难以计算。