Linux ip route 的 local、main、default 表,unicast、local、blackhole,scope、proto、metric 和 src 有什么区别?
一条 Linux 路由并不只是“目标网段、网关和网卡”。ip route 输出还可能包含路由表、类型、作用域、来源协议、优先值和首选源地址。它们分别回答不同问题:去哪里查、查到后采取什么动作、这条路径能覆盖多远、谁安装了它、同前缀候选如何取舍,以及本机发包时倾向使用哪个源地址。
本文目录(29 节)
快速对照
| 字段 | 典型值 | 回答的问题 |
|---|---|---|
table | local、main、default、数字或名称 | 这条路由存在哪张表 |
| 路由类型 | unicast、local、broadcast、blackhole、unreachable、prohibit、throw | 命中后执行什么动作 |
scope | host、link、global | 目的地或下一跳在多大范围内有效 |
proto | kernel、boot、static、dhcp、ra 或路由协议编号 | 谁或哪种机制安装了路由 |
metric | 非负整数 | 同表同前缀候选的优先值之一 |
src | 本机地址 | 未显式绑定源地址时的首选源地址 |
dev | eth0、ens3、lo | 使用哪个输出设备 |
via | 下一跳 IP | 把数据包交给哪个网关 |
table local 保存本机与广播控制路由
Linux 内置 local 表,编号为 255。ip-route(8) 说明该表包含本机地址和广播地址的路由,通常由内核维护,管理员一般不需要手工修改。
当接口拥有 192.0.2.10/24 时,系统可能在 local 表中生成 local 192.0.2.10 dev eth0 scope host,并生成相关广播路由。这不是“经 eth0 把包发走”,而是告诉内核目标就是本机,应交给本地协议栈。
table main 是普通路由的主要存放处
main 表编号为 254。未明确指定表时,普通单播静态路由通常进入这里,接口直连路由、默认路由和路由守护进程学习的普通路径也常出现在这里。
直接运行 ip route show 通常等价于查看主表,所以它适合日常观察,却不能证明系统只有这些路由。策略规则可能先查其他表,也可能在主表之前就返回本地、黑洞或禁止结果。
table default 不是“默认路由所在的表”
default 表编号为 253。ip-rule(8) 描述的初始规则会在较晚阶段查询它,而这张表通常为空,保留给前面规则没有得出结果后的处理。
名称最容易误导人:default via 192.0.2.1 这种 0.0.0.0/0 路由一般仍在 main 表;它并不会因为前缀叫 default 就进入名为 default 的表。一个是零长度目的前缀,另一个是路由表名称。
自定义路由表用于策略路由与隔离
Linux 支持大量数字编号的路由表,也可在 iproute2 的 rt_tables 配置中给编号命名。自定义表只有在规则、VRF 或显式查询引用它时才有实际路径选择意义。
向表 100 添加默认路由不会自动替换主表默认路由。还需要 ip rule 根据来源地址、标记、接口或其他选择条件查表 100。应使用 ip route show table 100 明确查看,而不是期待默认命令把它混在主表输出中。
默认 RPDB 查询顺序
Linux 路由策略数据库初始通常包含三条规则:优先级 0 查询 local,32766 查询 main,32767 查询 default。规则数字越小,通常越早评估。
这解释了为什么发往本机地址的流量会先被本地路由截获,而不是被主表默认路由送往网关。管理员加入的规则可以插入其中,也可以改变常规顺序,因此生产排障必须查看实际 ip rule show。
unicast 是正常转发路径
未写类型时,普通路由默认被视为 unicast。它描述到目标前缀的真实可用路径,可能直接通过设备到达,也可能通过下一跳网关到达。
例如:
203.0.113.0/24 via 192.0.2.1 dev eth0 proto static metric 100
表示主机可把目标为 203.0.113.0/24 的数据包交给 192.0.2.1,从 eth0 发出。它不表示目标属于本机。
local 类型表示目标地址属于本机
local 路由的目的地址被分配给当前主机,命中后数据包回送给本地协议栈。它常见于 table local,通常带有 scope host。
若服务已经监听但访问本机某地址仍异常,查看该地址是否存在相应 local 路由很有价值。仅看到接口上显示地址,不足以替代对实际 FIB 和命名空间的确认。
broadcast 类型表示链路广播地址
broadcast 路由描述广播目的地址,数据包以链路广播方式处理。IPv4 接口配置地址后,内核通常创建网络地址和定向广播地址的相关项。
它不是普通主机路由,也不能拿来当默认网关。IPv6 不使用 IPv4 式广播,许多类似功能由组播完成,因此不要把 IPv4 local 表输出模式机械套用到 IPv6。
blackhole 是静默丢弃
命中 blackhole 路由后,数据包被静默丢弃,不向远端返回 ICMP 错误。ip-route(8) 同时指出,本地发送者会收到对应的本地错误。
它适合明确吸收某些前缀或构建汇总路由防环,但会让远端探测表现为超时。看到超时不能只归因于防火墙,黑洞路由也可能产生相似外观。
unreachable 会返回不可达
unreachable 路由丢弃数据包并生成主机不可达 ICMP,本地发送进程通常得到 EHOSTUNREACH。相较黑洞,它更快向调用方表明没有路径。
它可用于为一个路由域设置明确失败边界。排障时,如果 ip route get 直接显示 unreachable,应先检查路由策略和目标表,不要把注意力只放在远端设备。
prohibit 表示管理性禁止
prohibit 同样丢弃数据包,但返回“通信被管理性禁止”一类 ICMP,本地发送者通常得到 EACCES。它表达的语义更接近策略拒绝,而非技术上不知道如何到达。
与防火墙拒绝相比,它位于路由决策中。两者可能向应用呈现相近错误,定位时要同时查看路由查询结果和包过滤规则。
throw 用于结束当前表查询
throw 是策略路由中的控制路由。命中后终止当前表查询,表现得像该表没有找到路由,让 RPDB 继续后续规则。若没有后续可用路径,最终可能返回网络不可达。
它不是简单的丢包黑洞。其价值是让某个自定义表只处理特定前缀,其他目的“抛回”规则链继续决策。
scope host 限定在本机
scope host 表示目的地不离开当前主机,最典型的是 local 路由。它不等于“主机路由前缀长度”;一个 /32 单播路由仍可能使用 link 或 global 语义。
因此,scope 描述可达范围,而前缀长度描述地址匹配范围,两者不可互换。
scope link 表示链路直达
直连单播路由通常为 scope link,意味着目标无需网关即可在该链路上解析邻居并发送。例如接口配置 192.0.2.10/24 后,常见:
192.0.2.0/24 dev eth0 proto kernel scope link src 192.0.2.10
下一跳网关本身一般必须能通过某条 link 范围路径到达,否则系统可能拒绝添加路由,除非显式使用具有特殊含义的 onlink 等选项。
scope global 适合经网关或更广范围路径
经网关的普通单播路由默认通常是 scope global。这里的 global 不表示“互联网公开”,也不保证全球可路由;它只是 Linux 路由作用域等级。
私有地址经内部网关的路由也可以是 global scope。不要根据该词判断地址所有权或公网暴露性。
proto kernel 表示由内核安装
接口地址产生的直连和本地路由常带 proto kernel。这不是指 IP 层协议号,也不是 TCP、UDP 或 ICMP,而是路由来源标识。
删除这类路由而保留接口地址可能被系统重新创建,或造成地址与 FIB 状态不一致。应优先修正负责生成它的接口配置,而不是把自动路由当作普通静态项反复删除。
proto static、boot、dhcp 与 ra
proto static 通常标记管理员或网络管理器安装的静态路由;boot 是历史默认来源标记;dhcp 表示路径由 DHCP 机制提供;IPv6 的 ra 常来自路由器通告。
proto 主要用于标识、筛选和管理来源,不直接等于信任等级或管理距离。某条路由最终是否被采用,还要结合规则、表、前缀、metric 和其他属性。
路由守护进程也有协议标识
BGP、OSPF 等守护进程把选出的路径写入内核时,可使用约定的路由协议编号或名称。这能帮助运维人员区分内核直连、静态配置和动态控制平面产生的条目。
但 Linux 的 proto 标签不完整复现路由协议内部决策。BGP LOCAL_PREF 或 OSPF cost 的比较通常先发生在守护进程内部,只有胜出的路径及其内核属性进入 FIB。
metric 是路由优先值,不是链路实测延迟
在可比较的同表同前缀候选中,较低 metric 通常更优。它可能由静态配置、DHCP、RA 或网络管理器设置,但不是实时 ping 毫秒数,也不会自动随网络拥塞变化。
最长前缀匹配仍先于同前缀 metric 比较。一个 metric 很高的 /24 仍会比 metric 很低的 /0 更精确地匹配该 /24 内目的地址。
src 是首选源地址提示
路由中的 src 表示本机发起连接且应用未绑定源地址时,内核倾向选用的源地址。它不是对进入流量的来源过滤条件,也不是 NAT 规则。
多地址接口或多出口主机中,错误的首选源地址可能导致回包走错路径、远端 ACL 不匹配或连接建立失败。使用 ip route get 能看到具体目的地查询后选择的 src。
via 与 dev 的关系
via 指定下一跳,dev 指定输出设备。直连路由常只有 dev;网关路由通常同时显示 via 和 dev。内核还需确认下一跳本身在该设备上可达。
把默认网关写成远离本地链路的地址,通常不会因为同时写了 dev 就变得有效。应检查网关的递归可达、邻居解析和链路状态。
ip route show table all 用于盘点
当怀疑隐藏在其他表时,使用:
ip -4 route show table all
ip -6 route show table all
ip rule show
分别查看 IPv4 与 IPv6 可避免输出混淆。table all 适合盘点,但它只是列出条目,不能单独告诉你某个具体报文最终命中哪一条规则和路由。
ip route get 用于模拟一次查询
对具体目的地,优先使用:
ip route get 203.0.113.8
ip route get 203.0.113.8 from 192.0.2.10
ip route get 203.0.113.8 mark 0x1
它会结合当前规则与表给出解析后的设备、下一跳和源地址。带来源或 mark 的查询更接近策略路由真实条件;省略这些输入可能得到另一条合法但与故障流量无关的路径。
VRF 会关联独立路由表
Linux VRF 设备绑定一张路由表。内核文档说明,接口加入 VRF 后,其 connected 与 local 路由会移动到 VRF 相关表;移出时再移回相应默认位置。
因此在 VRF 环境中,只看全局主表很容易误判。使用 ip route show vrf NAME 或 ip route get vrf NAME ADDRESS,并确认接口实际属于哪个 VRF。
一套可复现的排障顺序
- 记录目标、来源、协议、端口、入接口、输出标记和所属网络命名空间。
- 执行
ip rule show,确认规则优先级和查表动作。 - 查看被引用的每张表,而不只看
main。 - 用带
from、mark、iif或 VRF 条件的ip route get重现查询。 - 检查命中路由的类型,区分正常单播、黑洞、不可达、禁止与 throw。
- 检查
scope、下一跳可达性、设备状态和邻居解析。 - 核对
proto,找到真正负责创建该条目的配置源。 - 验证首选
src和反向路径,最后再检查防火墙与 NAT。
常见误区
ip route 已显示全部路由
错误。默认输出主要是 main 表,自定义表和 local 表需要显式查看。
table default 存放默认路由
错误。默认路由是 /0 前缀,通常在 main;default 是编号 253 的另一张内置表。
scope global 表示公网路由
错误。它是内核路由作用域,不是公网可达性或地址分类结论。
proto kernel 表示内核网络协议
错误。它表示这条路由由内核安装,不是 TCP/IP 协议字段。
metric 最低的路由总会胜出
错误。必须先经过规则与路由表选择,并先比较目的前缀长度;metric 只在可比较候选中发挥作用。
FAQ
1. 为什么 ip route 看不到本机 IP 的 local 路由?
因为默认命令通常查看 main 表。使用 ip route show table local,IPv6 则使用 ip -6 route show table local。
2. default via 与 table default 有什么关系?
前者是零长度目的前缀的路由,后者是内置路由表名称,两者没有必须绑定的关系。
3. blackhole、unreachable 和 prohibit 如何选择?
blackhole 静默丢弃,unreachable 返回不可达,prohibit 返回管理性禁止。选择取决于希望调用方观察到的失败语义。
4. throw 为什么没有直接把流量转发出去?
它是策略查询控制项,用来结束当前表查询并让规则链继续,而不是数据转发路径。
5. scope link 是否意味着二层一定正常?
不意味着。它声明目的地在链路范围,实际发送仍可能因接口 down、VLAN 错误或邻居解析失败而失败。
6. 路由 src 会改写经过主机转发的数据包吗?
不会把它当作通用 SNAT。它主要指导本机发起流量的源地址选择,地址转换应检查 NAT 规则。
7. 怎样确认某个 fwmark 最终走哪张表?
先查看匹配 mark 的 ip rule,再用带 mark 参数的 ip route get 模拟,并检查返回表、设备和下一跳。
8. VRF 中路由为何从 main 表消失?
接口加入 VRF 时,connected 和 local 路由会移动到 VRF 关联表。应使用 VRF 或对应表的查询命令查看。
参考来源
- Linux
ip-route(8)手册:路由表、类型、scope、protocol、metric、src 与查询语法
https:
- Linux
ip-rule(8)手册:RPDB 与 local、main、default 的默认查询顺序
https:
- Linux
rtnetlink(7)手册:内核路由表、类型、作用域和协议常量
https:
- Linux Kernel 文档:Virtual Routing and Forwarding(VRF)
https:
- Linux
ip-address(8)手册:地址作用域与接口地址管理