路由基础、策略路由与 ECMP
内容摘要:路由回答“一个 IP 包下一步发给谁”。本章从单台主机或路由器的转发路径出发,讲清路由信息库(Routing Information Base,RIB)、转发信息库(Forwarding Information Base,FIB)、最长前缀匹配、静态与默认路由、路由递归、策略路由(Policy-Based Routing,PBR)、等价多路径(Equal-Cost Multi-Path,ECMP)与路由汇总;随后比较距离矢量与链路状态算法,解释收敛、环路与 RIP 的适用边界。
难度:中级 | 前置知识:07 IPv4 编址、08 IPv6、09 ICMP 与路径发现 | 所属层次:网络层控制平面与数据平面
一、路由、转发与三张“表”
日常交流常把“路由”和“转发”混用,但生产排障必须区分:
- 路由(routing):控制平面通过直连、静态配置或动态协议学习候选路径,并选出最佳路径。
- 转发(forwarding):数据平面对每个数据包查询 FIB,决定出接口与下一跳。
- 策略(policy):决定哪些路由可进入 RIB、哪些可发布、优先级如何计算。
| 数据结构 | 典型内容 | 所属平面 | 故障表现 |
|---|---|---|---|
| RIB | 前缀、来源协议、度量、下一跳、属性 | 控制平面 | 路由没学到、优选错误 |
| FIB | 可直接查找的前缀与下一跳集合 | 数据平面 | RIB 有路由但实际不转发 |
| 邻接/邻居表 | 下一跳 IP 对应的 MAC 与出接口 | 数据平面 | 路由正确但 ARP/NDP 未解析(06) |
排障原则:不能只看
ip route就断言数据面正常。至少同时验证ip route get的实际选路、ip neigh的下一跳解析,以及抓包中的真实出接口与回程路径。
二、路由表字段与选路顺序
一条典型 Linux 路由:
192.0.2.0/24 via 198.51.100.1 dev eth1 proto static metric 100| 字段 | 含义 | 典型问题 |
|---|---|---|
192.0.2.0/24 | 目的前缀 | 前缀或掩码写错 |
via 198.51.100.1 | 下一跳 | 下一跳不可达或邻居解析失败 |
dev eth1 | 出接口 | 接口 down、VLAN/MTU 不一致 |
proto static | 路由来源 | 静态、kernel、OSPF、BGP 等 |
metric 100 | 同类路由的度量/优先级依据 | 不同系统语义不同 |
对一个目的地址,选路通常分两类比较:
- 先做最长前缀匹配(Longest Prefix Match,LPM):
/32优于/24,/24优于/0。 - 对相同前缀长度的候选路由,再按管理优先级、协议度量、策略或实现规则选优。
重要边界:Cisco 等设备常把“管理距离(Administrative Distance,AD)”作为不同协议来源间的本地优先级;Linux 使用 route
metric、协议 preference 与规则优先级。AD 不是 IETF 跨厂商协议字段,不能把某厂商默认值当成通用标准。
最长前缀匹配示例
本机已验证的确定性计算:
python3 - <<'PY'
import ipaddress
routes = [
("0.0.0.0/0", "gw-default"),
("192.0.2.0/24", "gw-a"),
("192.0.2.128/25", "gw-b"),
("192.0.2.130/32", "local"),
]
dst = ipaddress.ip_address("192.0.2.130")
matches = [
(ipaddress.ip_network(prefix), next_hop)
for prefix, next_hop in routes
if dst in ipaddress.ip_network(prefix)
]
print("selected", max(matches, key=lambda item: item[0].prefixlen))
PY实测输出(macOS 26.6.2 / Python 3,2026-09-07):
selected (IPv4Network('192.0.2.130/32'), 'local')三、逐包转发数据路径
RFC 1812 描述的 IPv4 路由器转发核心可归纳为:
注意:
- 路由器通常不修改端到端源/目的 IP;NAT 是额外功能(19)。
- 每跳都会改写源/目的 MAC、递减 TTL/Hop Limit。
- 正向路由正确不代表回程正确;状态防火墙、NAT 和连接跟踪尤其依赖双向路径(防火墙与访问控制、分层故障排查)。
四、直连、静态、默认与黑洞路由
| 类型 | 产生方式 | 适用场景 | 优点 | 风险 |
|---|---|---|---|---|
| 直连路由 | 接口地址启用后由内核产生 | 本地网段 | 自动、可信 | 接口 down 即撤销 |
| 静态路由 | 管理员配置 | 小网络、稳定出口、特殊前缀 | 可控、无协议开销 | 拓扑变化不自动收敛 |
| 默认路由 | 0.0.0.0/0、::/0 | 叶子网络统一出口 | 表项少 | 错配会把所有未知流量导错 |
| 黑洞路由 | 指向 blackhole/Null0 | 丢弃聚合泄漏、DDoS 缓解 | 明确、低成本丢弃 | 误配会静默丢业务 |
Linux 隔离环境示例:
# 需要 root/CAP_NET_ADMIN;远程主机修改前必须准备带外访问与回滚
sudo ip route add 203.0.113.0/24 via 192.0.2.1 dev eth0
sudo ip route add default via 192.0.2.1
sudo ip route add blackhole 198.51.100.0/24 metric 42760
# 验证实际选择
ip route get 203.0.113.10
# 回滚
sudo ip route del 203.0.113.0/24
sudo ip route del default via 192.0.2.1
sudo ip route del blackhole 198.51.100.0/24防失联红线:通过 SSH 修改默认路由前,先保存配置、准备带外控制台,并使用带超时自动回滚的方式。不要先删旧默认路由再“试试看”。
五、路由递归与下一跳解析
路由的下一跳本身可能不是直连地址,需要再查一次路由表,这叫递归路由解析(recursive lookup):
203.0.113.0/24 via 198.51.100.9
198.51.100.0/24 via 192.0.2.1 dev eth0
192.0.2.0/24 dev eth0 scope link解析链:
失败模式:
- 下一跳没有可达路由,候选路由可能处于 inactive/unreachable。
- 递归链形成环或因策略表不同而解析不一致。
- BGP
NEXT_HOP未通过 IGP 可达,BGP 路由存在但不能装入 FIB(11)。
六、策略路由与多路由表
普通路由只看目的地址;策略路由可以按源地址、入接口、标记等先选择一张路由表。
双出口示例:192.0.2.0/24 的流量走 ISP-A,198.51.100.0/24 走 ISP-B。
# [未在当前 macOS 执行] Linux 隔离环境
sudo ip route add default via 203.0.113.1 dev eth1 table 100
sudo ip rule add priority 100 from 192.0.2.0/24 lookup 100
ip rule show
ip route show table 100
ip route get 8.8.8.8 from 192.0.2.10
# 清理
sudo ip rule del priority 100
sudo ip route flush table 100常见坑:只配置正向策略,没有保证回包从同一出口返回,导致非对称路由。无状态转发可能仍通,但状态防火墙、NAT、云安全设备可能因回程不匹配而丢包(19、防火墙与访问控制)。
七、ECMP:等价路径不等于逐包轮询
当多条路径具有相同前缀和等价成本时,可组成 ECMP(Equal-Cost Multi-Path):
现代实现通常按流哈希(源/目的 IP、端口、协议)选下一跳,而不是逐包轮询:
- 同一五元组稳定走同一路径,避免乱序。
- 一条大流只能使用其中一个成员的带宽;多流才能摊开。
- 成员数变化会重新映射部分流,短时间产生乱序或状态设备路径变化。
- 不同设备的哈希字段、种子、权重和弹性哈希能力不同,属于实现差异。
Linux 示例:
# [未在当前 macOS 执行] 两个等价下一跳
sudo ip route replace 203.0.113.0/24 \
nexthop via 192.0.2.1 dev eth0 weight 1 \
nexthop via 198.51.100.1 dev eth1 weight 1
ip route get 203.0.113.10 ipproto tcp sport 40000 dport 443
sudo ip route del 203.0.113.0/24
traceroute在 ECMP 网络中可能因探测包五元组变化而显示不同路径;它不能证明业务流实际走同一路径(09)。
八、路由汇总
路由汇总(route aggregation/summarization) 将多个连续小前缀合成一个大前缀,减少表项与控制平面更新:
192.0.2.0/26
192.0.2.64/26
192.0.2.128/26
192.0.2.192/26
↓
192.0.2.0/24收益与风险:
- 减小 RIB/FIB、降低协议更新与 SPF 计算压力。
- 隔离内部拓扑抖动。
- 若汇总覆盖了实际不存在的子网,流量会被吸入形成黑洞;通常在汇总节点配一条指向 Null0/blackhole 的汇总路由,避免转发环路。
- 只有连续、按二进制边界对齐的前缀才能无损汇总。
九、单播、广播、组播与任播
| 模式 | 英文 | 发送关系 | 典型场景 | 路由特点 |
|---|---|---|---|---|
| 单播 | Unicast | 一对一 | Web、SSH、数据库 | 目的地址选路 |
| 广播 | Broadcast | 一对同广播域所有节点 | IPv4 ARP/DHCP Discover | 路由器默认隔离;IPv6 无广播 |
| 组播 | Multicast | 一对加入组的多个接收者 | IPTV、行情、路由协议 Hello | 需 IGMP/MLD 与 PIM 等组播路由 |
| 任播 | Anycast | 多地节点宣告同一地址,路由到“拓扑最近”实例 | DNS/CDN、全球入口 | 通常用 BGP 宣告同一前缀 |
任播不保证地理最近,也不保证会话粘性。 路由变化可把后续包导向另一实例,应用要做到无状态或共享状态,并用健康路由撤回而非只依赖应用探活。
1、IGMP 如何管理 IPv4 组播成员
互联网组管理协议(Internet Group Management Protocol,IGMP)用于 IPv4 主机向本地组播路由器表达“加入或离开哪个组播组”:
- IGMPv1 提供基本成员报告。
- IGMPv2 增加显式 Leave 和组特定查询。
- IGMPv3 支持源过滤,是源特定组播(Source-Specific Multicast,SSM)的基础。
- IPv6 使用组播侦听发现(Multicast Listener Discovery,MLD),不是 IGMP。
IGMP 只管理本地链路成员关系,不负责把组播流量跨路由网络送到接收者;跨网段组播还需要 PIM 等组播路由机制。二层交换机可通过 IGMP Snooping 观察成员报文,避免把组播数据泛洪到所有端口。
排查组播时分别验证:
- 主机是否加入正确组;
- Query/Report 是否在 VLAN 内双向可见;
- Snooping 表和 Querier 是否正常;
- 组播路由是否存在;
- 防火墙是否允许 IGMP 和目标组播数据。
十、动态路由算法:距离矢量与链路状态
1、距离矢量(Distance Vector)
每台路由器只告诉邻居“我到各目的有多远”,基于 Bellman-Ford 迭代:
D_x(y) = min_v { cost(x,v) + D_v(y) }优点是简单、资源少;缺点是视野局部、收敛慢,故障时可能数到无穷与形成环路。缓解手段:
- 分割地平线(split horizon)
- 毒性逆转(poison reverse)
- 触发更新(triggered update)
- 抑制定时器(hold-down,具体实现)
RIP 是典型距离矢量协议:以跳数为度量,16 表示不可达,因此最大有效 15 跳。RIPv2(RFC 2453)支持 CIDR 与认证,但仍只适合小型、简单网络,不适合现代大型生产骨干。
2、链路状态(Link State)
每台路由器把自己的链路状态可靠泛洪,使同一区域内设备获得近似一致的链路状态数据库(Link-State Database,LSDB),再独立运行 Dijkstra SPF:
优点是收敛快、拓扑视图完整;代价是 LSDB 内存、泛洪与 SPF CPU 开销。OSPF 与 IS-IS 是典型链路状态协议(11)。
| 维度 | 距离矢量 | 链路状态 |
|---|---|---|
| 交换内容 | 到目的的距离/下一跳 | 本地链路状态 |
| 拓扑视图 | 局部 | 区域内完整 |
| 计算 | Bellman-Ford 式迭代 | Dijkstra SPF |
| 收敛 | 较慢,易计数到无穷 | 较快,但可能 SPF 风暴 |
| 典型协议 | RIP | OSPF、IS-IS |
| 适用 | 小型简单网络 | 企业、运营商、数据中心 IGP |
十一、最小可复现实验
1、实验目标
- 验证主机对真实目的的实际选路、出接口与 MTU。
- 在隔离 Linux 环境验证静态路由、默认路由与路由递归。
- 观察错误路由与回程缺失的失败现象。
2、本机已验证:实际路由查询
# macOS
route -n get example.com
# Linux
ip route get 104.20.23.154本机实测(2026-09-07,地址已省略,只保留结构):
route to: 104.20.23.154
destination: 64.0.0.0
interface: utun4
flags: <UP,DONE,CLONING,STATIC>
mtu: 1280结论边界:这是启用隧道接口 utun4 时的本机单次观测,只能证明该目的在当时选中该接口与 MTU 1280,不能推广到其他主机或时刻。
3、Linux 隔离实验(当前 macOS 未执行)
沿用 20 统一实验:
# client 到 server 的静态路由与查询
sudo ip netns exec cli ip route replace 198.51.100.0/24 via 192.0.2.1
sudo ip netns exec cli ip route get 198.51.100.2
sudo ip netns exec cli ping -c 3 198.51.100.2
# 失败注入:删除 server 回程默认路由
sudo ip netns exec srv ip route del default
# 预期:client 发包到达 server,但回包无路由;单侧抓包不能断言中间丢包
# 恢复并验证
sudo ip netns exec srv ip route add default via 198.51.100.1
sudo ip netns exec cli ping -c 3 198.51.100.2抓包点:
sudo ip netns exec rtr tcpdump -i any -nn -c 40 \
'host 192.0.2.2 and host 198.51.100.2'预期证据:失败注入前请求与应答双向可见;删除回程路由后只看到 client→server 请求,无 server→client 应答;恢复后双向重新出现。
4、清理与恢复
sudo ip netns exec cli ip route del 198.51.100.0/24 via 192.0.2.1 2>/dev/null || true
# 统一拓扑若不再使用,执行 30 章 lab-down 清理十二、常见故障与排查
| 现象 | 优先假设 | 验证 |
|---|---|---|
| 本机访问某网段失败 | LPM 选到错误更具体路由 | ip route get <dst> |
| 请求发出无响应 | 回程路由缺失/非对称 | 两端路由查询 + 双点抓包 |
| 多出口偶发失败 | 策略路由只配正向,状态设备不接受非对称 | ip rule、各表、conntrack |
| ECMP 下部分连接失败 | 某成员路径故障或 MTU 不同 | 固定五元组探测、逐下一跳验证 |
| 路由表有但业务不通 | 邻居未解析、FIB 未下发、ACL/NAT | ip neigh、硬件 FIB、抓包 |
| 动态路由反复变化 | 邻接抖动或错误重分发 | 协议邻居、更新日志、变更记录 |
十三、性能与容量
- FIB 查询通常由 trie、TCAM 或 ASIC 完成;性能关注**每秒包数(pps)**而非仅带宽。
- ECMP 提升多流总吞吐,不保证单流叠加带宽。
- 过量更具体路由增加控制平面内存、FIB/TCAM 消耗和更新压力。
- 路由抖动会触发反复收敛、缓存失效和流重映射;不要在无证据时只调大定时器掩盖根因。
十四、安全风险与加固
- 静态/策略路由误配可造成黑洞、流量劫持或绕过安全设备;变更必须有评审、回滚、带外访问。
- 启用源地址验证(BCP 38/uRPF)需考虑非对称路由,严格模式可能误杀合法流量。
- 动态协议要做邻居认证、被动接口、控制平面 ACL;路由导入/重分发必须显式过滤(11)。
- 黑洞路由用于 DDoS 缓解时要限定前缀、审批与自动过期,避免永久误伤。
十五、版本、平台与实现差异
- RFC 1812 是 IPv4 路由器要求;IPv6 转发遵循 RFC 8200 等文档(08)。
- Linux 使用 RPDB(
ip rule)+ 多路由表;macOS/Windows 命令与规则模型不同。 - ECMP 哈希、权重、弹性哈希、管理距离均有厂商/内核差异,必须查目标版本官方文档。
- 本章 FRR/BIRD 动态协议实验未运行:本机虽有 Docker 29.6.1,但未发现可直接使用的 FRR 镜像,且不为验证文档而拉取未经锁定版本的镜像。第 11 章给出明确的未验证实验。
十六、关联章节
- 上一章:09 ICMP、MTU 与路径 MTU 发现
- 下一章:11 OSPF、IS-IS 与 BGP
- 相关:06 邻居解析、19 NAT、防火墙与访问控制、分层故障排查
检索关键词
RIB FIB 邻接表区别 路由转发流程 最长前缀匹配 LPM 静态路由 默认路由 黑洞路由 路由递归 next hop Linux 策略路由 ip rule ECMP 五元组哈希 路由汇总 单播广播组播任播 距离矢量 链路状态 RIP 15 跳 数到无穷 非对称路由
权威来源
- RFC 1812:Requirements for IP Version 4 Routers
- RFC 4632:CIDR Address Strategy
- RFC 1058:RIP、RFC 2453:RIPv2
- Linux
ip-route(8)、ip-rule(8)man page
协议与转发语义已于 2026-09-07 对照 RFC Editor 正文核验。本机路由查询与 LPM 脚本已实际执行;需要 Linux
iproute2、网络命名空间或动态路由守护进程的实验已明确标记“未在当前环境执行”。
