ubuntu静态路由配置核心在于区分netplan与传统ifupdown,混用将导致失效;netplan中routes须为yaml列表,每条路由独立成项,to必须为cidr格式,gateway4优先用于默认网关,多网卡需设metric避免冲突,临时路由用ip route添加但重启丢失,永久路由必须通过netplan声明式配置实现。

Ubuntu 静态路由配置的核心分歧不在“能不能加”,而在于**你用的是 netplan 还是传统 ifupdown(/etc/network/interfaces)**。两者底层机制不同,混用必出问题——比如改了 /etc/network/interfaces 却执行 netplan apply,路由根本不会生效。
netplan 中添加静态路由:routes 是数组,不是单值
很多人写错的第一步,就是把多个路由塞进一个 routes 条目里,像这样:
routes:
- to: 10.10.0.0/24, 192.168.5.0/24
via: 192.168.1.1
这是 YAML 语法错误,netplan 会直接拒绝加载。正确做法是每个路由单独成项:
-
routes必须是 YAML 列表(以-开头的多行结构) - 每个
- to: ... via: ...是一条独立路由 - 不能省略
to的 CIDR 表示(如10.10.0.0/24),写10.10.0.0不生效 - 若需设置默认网关,优先用
gateway4字段;它和routes: [{to: default, via: ...}]效果相同,但更清晰、兼容性更好
正确示例(双静态路由 + 默认网关):
network:
version: 2
renderer: networkd
ethernets:
ens3:
dhcp4: false
addresses: [192.168.1.100/24]
gateway4: 192.168.1.1
routes:
- to: 10.10.0.0/24
via: 192.168.1.1
- to: 192.168.5.0/24
via: 192.168.1.1
多网卡时路由冲突:metric 决定谁当“默认出口”
当你有 ens3(连办公网)和 ens7(连外网)两块网卡,并都配了 gateway4,系统会生成两条默认路由,内核按 metric 值选一个——值小的胜出。不显式设 metric,netplan 默认给所有网卡设相同值(通常是 100),结果不可预测。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
- 必须为每块网卡的默认路由指定
metric,例如让ens7优先出外网:gateway4: 192.168.2.1后加routing-policy:或直接在routes中带metric - 更稳妥的做法:只在一个接口上设
gateway4,其他接口的默认路由用routes显式添加并带metric - 验证命令:
ip route show table main | grep default,看哪条带metric X
示例(ens7 主外网,ens3 仅通内网):
ens7:
dhcp4: false
addresses: [192.168.2.100/24]
gateway4: 192.168.2.1
routing-policy:
- from: 192.168.2.100/32
table: 200
ens3:
dhcp4: false
addresses: [10.10.0.100/24]
routes:
- to: default
via: 10.10.0.1
metric: 200
临时路由 vs 永久路由:别混淆 ip route 和 netplan
ip route add 10.20.0.0/24 via 192.168.1.2 加的是内核路由表里的临时路由,重启即丢。这不是 bug,是设计使然。如果你需要“永久”,就必须走声明式配置层——也就是 netplan 或 ifupdown。
- netplan 是 Ubuntu 22.04+ 官方路径,
netplan apply后路由由systemd-networkd或NetworkManager持久维护 -
/etc/network/interfaces在 netplan 环境下默认被忽略,除非你禁用 netplan 并启用 ifupdown 服务(不推荐) - 云环境(如腾讯云、AWS)中,
50-cloud-init.yaml可能被自动覆盖,应避免直接编辑它;改用01-static-ip.yaml并设好文件权限(600)
调试失败时先看这三件事
执行 sudo netplan apply 后路由没出现?别急着重装系统,先查这三项:
- 运行
sudo netplan --debug apply,看报错是否指向某行 YAML 格式错误(常见于缩进、冒号后少空格、中文标点) - 检查后端服务状态:
sudo systemctl status systemd-networkd(如果 renderer 是networkd) - 确认路由是否进了主表:
ip route show table main;如果进了别的表(如local或自定义表),说明用了routing-policy但没配rule
netplan 的坑不在功能弱,而在它太“声明式”——你写的不是命令,是期望状态。一旦某处逻辑矛盾(比如两个接口都 claim 自己是 default 出口),它宁可不生效,也不妥协。所以每次改完,务必用 ip route 和 ping -I ens3 10.10.0.1 分别验证出口和可达性。










