在 RHEL/CentOS 7 及以上版本里,需要在网卡配置文件中补上一项 IPV4_ROUTE_METRIC=数值,比如 /etc/sysconfig/network-scripts/ifcfg-ens192 这类文件。这里的规则很直接:数值越小,优先级越高;同时,不同网卡的取值必须保持唯一。这样配置后会永久生效,核心目的就是避免默认 metric 相互冲突,进而让路由选择变得不可预测、难以控制。

修改网卡配置文件中的 IPV4_ROUTE_METRIC
CentOS 7+(包括 RHEL、Rocky、AlmaLinux)使用 NetworkManager 或传统 network 服务管理路由,优先级由 metric 值控制——数值越小,优先级越高。永久生效的唯一可靠方式是写入网卡配置文件。
操作路径固定:/etc/sysconfig/network-scripts/ifcfg-INTERFACE_NAME(如 ifcfg-ens192)。必须添加或修改这一行:
IPV4_ROUTE_METRIC=50
- 若该网卡需作为主出口(例如走外网),建议设为
0或10; - 若为辅助网卡(如内网管理口),设为
100、200等更高值; - 不能留空或设为负数,否则会被忽略或触发 fallback 行为;
- 多个网卡的
IPV4_ROUTE_METRIC值必须互不相同,否则系统可能任意选择默认路由。
为什么不能只用 ip route replace 或 route add
这些命令改动的,其实只是内核当前正在使用的路由表:机器一旦重启,配置就会失效;即便不重启,只要遇到 NetworkManager 接管,或者执行了 systemctl restart network,这些临时路由也很容易被重新覆盖。更需要警惕的是,如果多张网卡都配置了 GATEWAY,却没有显式设置 IPV4_ROUTE_METRIC,系统通常会自动给它们分配默认 metric,常见就是 100。结果是什么?路由冲突几乎是必然的——执行 ip route show 时,很可能会同时看到两条 default via ... metric 100。一旦出现这种情况,内核就只能按“先到先得”的方式来选路,整个行为也就变得不可控了。
常见错误现象:
ping外网通,但 SSH 连入时响应慢或超时;- 从某网卡进来的连接,回包却从另一网卡发出(asymmetric routing);
ip route get 8.8.8.8返回的出口设备与预期不符。
验证是否生效:看 ip route 输出里的 metric
重启网络后运行:
ip route show
输出中每条 default 路由末尾必须带明确的 metric N,例如:
default via 172.20.17.1 dev ens224 metric 100
192.168.1.0/24 via 192.168.1.1 dev ens192 metric 0
注意:
- 没有
metric字样的默认路由,说明IPV4_ROUTE_METRIC未被读取(检查拼写、空格、是否漏掉引号); - 如果看到
metric 1024这类大数值,往往是 NetworkManager fallback 分配的,代表配置未生效; - 用
ip route get测试具体目标走哪条路径,比只看default更准。
双网卡同网段时 metric 不起作用?得靠策略路由
如果两块网卡在同一子网(比如都接 192.168.1.0/24),仅靠 metric 无法区分出口——因为内核路由决策优先匹配最长前缀,子网完全一致时才看 metric。这时必须用策略路由(policy routing):
- 编辑
/etc/iproute2/rt_tables,新增自定义表名与 ID(如200 net_a); - 用
ip rule add from绑定源地址;table net_a - 用
ip route add default via设置该表路由;dev table net_a - 所有配置需写入脚本并加入
/etc/rc.d/rc.local或 systemd service 才能持久化(RHEL/CentOS 7+ 中rc.local默认不执行,需手动启用)。
这种场景下,IPV4_ROUTE_METRIC 完全无效,硬套只会浪费调试时间。