Linux 中路由表的匹配规则
Linux 中路由表的匹配规则
Linux 内核使用最长前缀匹配 (Longest Prefix Match, LPM) 原则来处理路由表的匹配。这是一种高效的路由查找算法,确保数据包被转发到最具体的路由条目。路由表存储在内核中,通常通过 ip route show
(或旧版 route -n
)命令查看。以下详细讲解匹配规则、优先级和示例。
1. 路由表的基本结构
每个路由条目(route entry)包含以下关键字段:
- 目标 (Destination):目标 IP 地址的前缀(如
192.168.1.0/24
),表示匹配的网络范围。 - 网关 (Gateway/Next Hop):下一跳 IP 地址(如果为本地网络,可为空)。
- 接口 (Interface):出接口(如
eth0
)。 - 度量值 (Metric):路由的优先级(越小越优先,默认 0-255)。
- 源 (Source):可选,源 IP 地址。
- 范围 (Scope):如 global(全局)、link(链路)等。
示例路由表输出(使用 ip route show
):
default via 192.168.1.1 dev eth0 proto dhcp metric 100
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.100
10.0.0.0/8 via 192.168.1.254 dev eth0 metric 200
2. 匹配规则详解
Linux 路由查找过程是确定性的,按以下步骤进行:
步骤 1: 目标地址匹配
- 前缀匹配:内核将数据包的目标 IP 与路由表的每个条目比较,选择最长前缀匹配的条目。
- 前缀长度(CIDR,如 /24 表示 24 位匹配)越长,优先级越高。
- 示例:目标 IP
192.168.1.50
:- 匹配
192.168.1.0/24
(24 位匹配)。 - 忽略
192.168.0.0/16
(16 位匹配,虽然也匹配但前缀短)。 - 如果无精确匹配,使用默认路由
0.0.0.0/0
(0 位匹配)。
- 匹配
- 多表支持:Linux 支持多个路由表(如 main、local、default),通过
ip rule
规则选择表。默认使用 main 表。
步骤 2: 度量值比较(如果多个匹配)
- 如果有多个条目具有相同最长前缀,内核选择度量值 (metric) 最小的。
- Metric 来自路由协议(如 DHCP、静态路由),用于负载均衡或备份路由。
- 示例:两个
192.168.1.0/24
条目,metric 100 和 200,选择 100。
步骤 3: 接口和范围检查
- 接口可用性:确保出接口(如 eth0)已 up(使用
ip link show
检查)。 - 范围 (Scope):优先 global > link > host。如果 scope 为 host,仅匹配本地地址。
- 策略路由 (Policy Routing):通过
ip rule show
的规则(如基于源 IP、TOS)决定使用哪个表。
步骤 4: ARP/NDP 解析(链路层)
- 一旦找到下一跳,内核使用 ARP(IPv4)或 NDP(IPv6)解析 MAC 地址。
- 如果下一跳是本地网络,直接发送;否则,通过网关。
3. 特殊规则
- 默认路由:
default
或0.0.0.0/0
是兜底条目,用于未知目标。 - 本地路由:local 表处理环回(lo)和本地接口地址,不参与转发。
- 多路径 (ECMP):如果多个等价路由(相同 metric),内核轮询或哈希分发流量。
- IPv6 差异:类似 IPv4,但使用
ip -6 route show
,前缀如2001:db8::/32
。 - 内核缓存:路由查找结果缓存(fib_trie 树结构),加速后续包。
4. 示例:手动测试匹配
-
查看路由表:
ip route show table main
-
添加测试路由(临时):
sudo ip route add 192.168.2.0/24 via 192.168.1.254 metric 50
-
测试 ping(观察使用哪个路由):
ping 192.168.2.10 # 应使用新路由 traceroute 192.168.2.10 # 查看路径
-
删除路由:
sudo ip route del 192.168.2.0/24
5. 注意事项与调试
- 工具:
ip route get <IP>
模拟查找(显示匹配条目)。 - 日志:启用
net.ratelimit=0
sysctl 查看内核路由日志。 - 常见问题:路由循环(高 metric 备份失效)、不对称路由(入站/出站不同表)。
- 高级:使用
tc
(Traffic Control)或nftables
细粒度控制。