Linux路由无metric时的优先级问题:是系统特性还是网络标准?
无Metric路由优先级低于数值Metric的原因分析
嘿,这个问题我之前排查过类似的,正好可以给你捋清楚:
一、为什么会出现这个现象?
Linux的路由选路逻辑是优先选择metric值最小的路由(metric代表选路代价,值越小,优先级越高)。而这里的关键误区是:未显式指定metric的路由,并不会默认等同于metric 0,它的实际metric值是继承自对应网络接口的metric属性。
举个实际例子:
- 你用
ip route add 10.0.0.0/8 dev eth0添加路由时,没指定metric,这条路由会自动使用eth0接口的默认metric值(大多数系统里默认是100)。 - 如果你手动添加另一条路由
ip route add 10.0.0.0/8 dev eth1 metric 50,那这条metric 50的路由代价更低,会被优先选用。
如果你遇到“无metric的路由优先级比任何数值型metric都低”的情况,大概率是你手动指定的所有数值metric都小于对应接口的默认metric值。反过来,如果你手动指定一个比接口默认值更大的metric(比如metric 200),那未指定metric的路由反而会优先生效。
另外要注意:Linux里metric 0是合法的,你可以手动设置ip route add 10.0.0.0/8 dev eth0 metric 0来让这条路由优先级最高,但这必须显式指定,内核不会自动给未指定metric的路由分配0值。
二、这是Linux特有还是通用标准?
这是Linux特有的实现细节。
TCP/IP相关的RFC标准(比如RFC 1812)只定义了路由metric的核心概念——作为选路代价,值越小越优先,但完全没有规定“未指定metric的路由应该使用什么默认值”。不同操作系统的实现差异很大:
- 比如BSD系统中,未指定metric的路由默认metric就是0,优先级最高;
- Windows系统中,未指定metric的路由会继承接口metric,但接口的默认metric是根据带宽自动分配的(带宽越高,metric越小);
- 只有Linux(基于iproute2工具集的现代实现)会将未指定metric的路由绑定到接口的默认metric(通常为100),且不会自动设为0。
内容的提问来源于stack exchange,提问作者rsuarez
相关产品推荐
相关产品推荐

