T 技术手记
DevOps 2026年8月26日

netplan 配置静态 IP 和路由的实战方法

T TechBlog ·

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.8114.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/24192.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 每条必须同时有 tovia,少了任一字段 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 让它生效

记住这几条就够用了:

  1. 配置放 /etc/netplan/99-custom.yaml,缩进 2 空格
  2. 静态 IP 写 addresses,路由写 routes(每条要有 to + via
  3. 默认路由用 to: default
  4. 远程改 IP 一律先 netplan try,确认能 SSH 再 netplan apply
  5. 改完 ip route show 验证路由表

把这套流程固定下来,服务器网络配置再也不会因为手滑把自己踢下线了。

参考资料