netplan 配置静态 IP 和路由的实战方法
Ubuntu 用 netplan 管理网络,YAML 写配置,一条命令生效。本文覆盖静态 IP、默认路由、多段静态路由的完整写法和踩坑点。
netplan 配置静态 IP 和路由的实战方法
Ubuntu 17.10 起默认网络管理工具换成 netplan,配置走 YAML,生效靠
netplan apply。看似简单,但路由配置和 YAML 缩进是两个最常见的翻车点,这篇文章把完整写法和踩坑点一次讲清。
一、netplan 是什么,为什么要用它
netplan 是 Canonical 在 Ubuntu 17.10 引入的网络配置抽象层,它的特点:
- 配置即 YAML:声明式描述网络应该是什么样,不写过程脚本
- 后端可切换:默认用
networkd(systemd-networkd),也能切NetworkManager(桌面版常用) - 一条命令生效:
netplan apply重建网络配置,不用重启 - 配置生成器:
netplan generate能校验 YAML 语法,提前发现错误
跟老的 /etc/network/interfaces 相比,netplan 把”描述”和”执行”分开:你只管在 YAML 里声明想要的网络状态,netplan 负责把它翻译成 networkd / NetworkManager 的具体配置。
二、配置文件位置和优先级
netplan 的配置文件统一放在 /etc/netplan/,扩展名 .yaml。多个文件会按字典序合并,后执行的覆盖前面的。常见命名:
/etc/netplan/01-netcfg.yaml # 安装时自动生成
/etc/netplan/50-cloud-init.yaml # cloud-init 注入的
/etc/netplan/99-custom.yaml # 自己加的,数字大保证最后生效
建议:自己改配置时新建一个 99-custom.yaml,数字开大一点,保证覆盖前面 cloud-init 之类的默认配置,避免修改系统文件被后续更新冲掉。
三、配置静态 IP(最基础场景)
目标:给网卡 eth0 配一个静态 IP 192.168.10.50/24,网关 192.168.10.1,DNS 用 8.8.8.8 和 114.114.114.114。
/etc/netplan/99-custom.yaml:
network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: no
addresses:
- 192.168.10.50/24
routes:
- to: default
via: 192.168.10.1
nameservers:
addresses: [8.8.8.8, 114.114.114.114]
注意几个新版字段变化:
gateway4已经废弃,现在用routes下的to: default表示默认路由addresses是列表,能同时绑多个 IP(多网卡场景)renderer: networkd在服务器上保持,桌面 Ubuntu 想用 NetworkManager 就写renderer: NetworkManager
应用配置前先校验:
sudo netplan generate # 有语法错会报行号,没输出就是没问题
sudo netplan try # 试应用 120 秒,期间不确认会自动回滚,远程改 IP 防翻车神器
sudo netplan apply # 真正生效
远程 SSH 改 IP 时强烈建议用 netplan try,它会在新配置生效后等用户回车确认,超时不确认就自动回滚到旧配置,避免把自己 SSH 踢下线。
四、配置静态路由(多网段场景)
目标:eth0 静态 IP 192.168.10.50/24,默认网关 192.168.10.1,同时要到 10.20.0.0/16 这个网段走网关 192.168.10.254,到 172.16.5.0/24 走 192.168.10.253。
routes 是列表,可以放多条,默认路由也写在里面:
network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: no
addresses:
- 192.168.10.50/24
routes:
- to: default
via: 192.168.10.1
metric: 100
- to: 10.20.0.0/16
via: 192.168.10.254
metric: 200
- to: 172.16.5.0/24
via: 192.168.10.253
metric: 200
nameservers:
addresses: [8.8.8.8, 114.114.114.114]
几个关键字段:
| 字段 | 含义 |
|---|---|
to | 目标网段,default 等同 0.0.0.0/0 |
via | 下一跳网关 IP |
metric | 优先级,数字小优先;默认路由一般给 100 |
scope | 可选,link/host 等,一般不写 |
新版 netplan 要求 routes 每条必须同时有 to 和 via,少了任一字段 netplan generate 会直接报错。
五、多网卡 + 不同网段的路由隔离
实战常见场景:服务器两块网卡,eth0 走外网,eth1 走内网,两边网段不能互相干扰。
network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: no
addresses: [192.168.10.50/24]
routes:
- to: default
via: 192.168.10.1
nameservers:
addresses: [8.8.8.8]
eth1:
dhcp4: no
addresses: [10.20.30.40/24]
routes:
- to: 10.0.0.0/8
via: 10.20.30.1
metric: 50
关键点:默认路由只写一条(在外网网卡上),内网网段用具体 to 指定走内网网关,避免默认路由抢占内网流量。
六、验证生效
ip addr show eth0 # 看绑定 IP
ip route show # 看路由表
resolvectl status # 看 DNS(networkd 后端)
sudo netplan --debug apply # 出问题时加 --debug 看详细日志
预期 ip route 输出类似:
default via 192.168.10.1 dev eth0 proto static metric 100
10.20.0.0/16 via 192.168.10.254 dev eth0 proto static metric 200
172.16.5.0/24 via 192.168.10.253 dev eth0 proto static metric 200
192.168.10.0/24 dev eth0 proto kernel scope link src 192.168.10.50
七、常见踩坑
1. YAML 缩进错位
netplan 对缩进严格,必须用空格不能用 Tab,每层 2 个空格。缩进错位 netplan generate 不会立刻报错,但 apply 后行为会诡异(比如网卡不识别)。
建议编辑器固定 2 空格 + 显示不可见字符,VS Code 里 .yaml 文件默认就是。
2. 旧字段 gateway4 还在用
很多老教程还在写 gateway4: 192.168.10.1,新版 netplan(22.04+)会警告并最终废弃。统一改成:
routes:
- to: default
via: 192.168.10.1
3. renderer 写错导致配置不生效
服务器上 renderer: networkd,桌面 Ubuntu 装了 NetworkManager 想让面板显示就用 renderer: NetworkManager。不要在同一个文件里混着配,两个后端抢配置会出怪问题。
4. 改完不 apply
改完 YAML 必须跑 sudo netplan apply,光改文件网络不会变。这是新手最常忘的一步。
5. cloud-init 覆盖
云服务器上 50-cloud-init.yaml 是 cloud-init 注入的,每次重启 cloud-init 可能重写。自己的配置放 99-custom.yaml(数字大,后合并覆盖),不要直接改 cloud-init 的文件。
八、小结
netplan 的核心思路:用 YAML 声明网络状态,用 netplan apply 让它生效。
记住这几条就够用了:
- 配置放
/etc/netplan/99-custom.yaml,缩进 2 空格 - 静态 IP 写
addresses,路由写routes(每条要有to+via) - 默认路由用
to: default - 远程改 IP 一律先
netplan try,确认能 SSH 再netplan apply - 改完
ip route show验证路由表
把这套流程固定下来,服务器网络配置再也不会因为手滑把自己踢下线了。