路由协议:静态路由、OSPF 与 BGP
这一课你将能做到
- 配置静态路由并用最长前缀原则解释路由匹配结果
- 用「邻居表 → 数据库 → 路由表」三件套读懂 OSPF
- 用一句话讲清 BGP 为什么叫「路径向量」,以及它和 OSPF 的本质区别
为什么要学
路由是「包往哪走」的唯一答案。K8s 的 CNI、云上的路由表、公司到云的专线,全是路由的变体。面试里「OSPF 和 BGP 的区别」是网络岗必考题;运维日常里「补一条路由解决回程不通」是高频操作。这一课先给你能上手的命令,再给你能讲出来的直觉。
先建立图像
┌──────┐ ┌──────┐ ┌──────┐
内网A ──────┤ R1 ├───┤ R2 ├───┤ R3 ├────── 内网B
└──────┘ └──────┘ └──────┘
OSPF: R1↔R2↔R3 互相通告链路状态,各自算最短路径(一个组织内)
BGP: 企业网 ↔ ISP ↔ ISP 按策略与路径选路(组织之间)
R1 路由表(简化):
10.1.0.0/16 → 直连 eth0 (最长前缀优先)
10.2.0.0/16 → 下一跳 192.168.12.2 (OSPF 学到,管理距离 110)
0.0.0.0/0 → 下一跳 203.0.113.1 (默认路由,兜底)
跟着做
步骤 1:Linux 上配静态路由
# 场景:本机去 10.2.0.0/16 要绕行网关 192.168.1.254
sudo ip route add 10.2.0.0/16 via 192.168.1.254 dev eth0
ip route show # 验证已入表
ip route get 10.2.0.5 # 模拟查表:这个包会从哪出
sudo ip route del 10.2.0.0/16 via 192.168.1.254 # 删除
步骤 2:一分钟起一个动态路由实验
docker run -d --name r1 --privileged frrouting/frr:v8.4.0
docker exec r1 vtysh -c "show ip route" # FRR:开源路由套件,命令风格同 Cisco
真机 / 模拟器上的 OSPF 三件套(Cisco 风格):
show ip ospf neighbor # 邻居表:谁活着
show ip ospf database # LSDB:全网链路状态地图
show ip route ospf # 路由表里 O 开头的条目
步骤 3:验证最长前缀原则
sudo ip route add 10.2.1.0/24 via 192.168.1.1 # 更长的前缀
ip route get 10.2.1.5 # → 192.168.1.1(/24 赢了 /16)
ip route get 10.2.2.5 # → 192.168.1.254(回落到 /16)
步骤 4:用 traceroute 看逐跳选路
traceroute -n example.com # 每一行 = 一台路由器
mtr -n -c 20 example.com # 持续观察丢包与延迟在哪一跳
步骤 5:两台 FRR 容器把 OSPF 跑起来
# r1 与 r2 的互联接口各配同网段 IP,再启用 OSPF
docker exec r1 vtysh -c "conf t" -c "interface eth1" \
-c "ip address 192.168.12.1/24" -c "router ospf 1" -c "network 192.168.12.0/24 area 0"
docker exec r2 vtysh -c "conf t" -c "interface eth1" \
-c "ip address 192.168.12.2/24" -c "router ospf 1" -c "network 192.168.12.0/24 area 0"
docker exec r1 vtysh -c "show ip ospf neighbor" # 状态到 Full 即邻接成功
docker exec r1 vtysh -c "show ip route ospf" # 学到对端通告的网段
邻接到 Full 后,往其中一台注入一条 loopback 网段,再断开互联链路观察路由如何自动绕行——动态路由「链路挂了自动换路」的体感就有了。
讲清楚要点
- 路由表三要素:目的网段、下一跳、出接口。匹配三级顺序:最长前缀优先 → 管理距离(协议可信度)→ 度量值(路径优劣)。
- 静态路由适合小型、边缘、路径明确的场景;缺点是链路挂了不会自动绕行,除非配浮动静态路由(备份条目调大管理距离)或上动态协议。
- OSPF(链路状态):每台路由器泛洪自己的链路状态,全网各自用 SPF 算最短路径;收敛快、区域内无环,适合一个管理域内。
- BGP(路径向量):不追求「最短」,追求「按策略可控」;用 AS_PATH 防环,是互联网的骨架,也是多云 / 多专线选路的基础。
- 管理距离直觉(Cisco 默认):直连 0 > 静态 1 > OSPF 110 > RIP 120,数字越小越可信——同网段多来源时由它决定谁进表。
你可能会懵的地方
-
都是动态路由,为什么互联网用 BGP 而不是 OSPF? OSPF 假设域内互信、规模可控,几千节点收敛就吃力;BGP 按域自治、可注入商业策略(选路跟着钱走),能扩展到百万条路由。
-
默认路由 0.0.0.0/0 什么时候用? 出口唯一时必配——公司、家庭、VPC 的公网出口都是默认路由;它前缀最短永远最后匹配,是最安全的兜底。
-
浮动静态路由是什么? 同一目的配两条静态路由,备份那条管理距离调大(如
ip route 10.2.0.0/16 x.x.x.x 200);主链路挂了备份自动顶上。 -
云上的路由表也算路由协议吗? 本质是静态路由 + 云控制面自动维护;对等连接、专线网关会自动注入路由,相当于云替你跑了「受控的路由」。
-
黑洞路由有什么用?
ip route add blackhole 10.9.9.0/24直接丢弃目标流量,常用于防回环与封禁恶意网段,比 ACL 更早生效。
错法对照
| 错法 | 问题 | 正解 |
|---|---|---|
| 只配去程不查回程 | SYN 到了,SYN-ACK 回不去 | 路由必须双向可达,两端各 ip route get 验证 |
| 静态路由指向不可达下一跳 | 路由在表但不通 | 下一跳必须直连可达,先 ping 网关 |
| OSPF 两端区域 / 掩码 / MTU 不一致 | 邻居起不来或卡 EXSTART | 逐项核对 Hello 参数,看 neighbor 列表 |
| 生产 BGP 不配过滤 | 学到垃圾路由打爆表 | 必配前缀过滤 + 最大前缀数限制 |
| 用 metric 调静态路由主备 | 静态路由不看 metric | 用管理距离做浮动静态 |
卡点急救
- 包出得去回不来:在对端执行
ip route get 本机IP;回程无路由 = 静默丢包,表现为 telnet 永远 SYN 无响应。 - OSPF 邻居卡 EXSTART/EXCHANGE:MTU 不匹配(云上不同网卡类型常见),统一 MTU 或配 mtu-ignore。
- 加了路由还是不通:
ip route get 目标看命中的是不是你那条;被更长前缀截胡是头号原因。
面试常问
-
OSPF 邻接建立过程? Down → Init(收到 Hello)→ 2-Way → ExStart(协商主从)→ Exchange(交换 DBD 摘要)→ Loading(LSR/LSU 要详情)→ Full。至少说清:Hello 建邻居、DBD 同步摘要、LSR 补详情、最后跑 SPF 算路。
-
OSPF 和 BGP 的区别(三句话版)? OSPF 是 IGP、链路状态、域内算最短路径;BGP 是 EGP、路径向量、域间按策略选路;OSPF 区域内靠 SPF 防环,BGP 靠 AS_PATH 防环。
-
一个包到达路由器后的转发流程? 收帧 → 校验并剥二层头 → TTL 减一重算校验 → 查路由表最长前缀 → 重写二层头(源 MAC = 自己,目 MAC = 下一跳)→ 从出接口发出。
自测三问
- 路由匹配的三级优先顺序是什么?
- 为什么默认路由能兜住所有流量?
- OSPF 快在哪,BGP 稳在哪?
小结一句话
路由 = 带策略的查表转发;IGP 管域内速度,BGP 管域间策略,最长前缀是唯一裁判。
延伸
- RFC 2328:OSPF 版本 2
- 下一课:交换与二层——VLAN、STP 与链路聚合。