Ubuntu设置固定IP后重启失效,根本原因是未正确使用netplan(18.04+唯一正统方式),或配置存在网卡名错误、YAML缩进错误、dhcp4: no缺失、cloud-init覆盖等问题;需用ip -br a确认真实网卡名,严格按YAML语法编辑/etc/netplan/配置文件,并禁用cloud-init网络管理以确保持久化。

Ubuntu 设置固定 IP 后重启失效,基本是因为配置没走对路径——netplan 是 18.04+ 的唯一正统方式,手动改 /etc/network/interfaces 或用 ifconfig 临时设 IP,重启必丢。
确认网卡名和当前网络状态
别猜,也别凭记忆写 eth0 或 ens33。执行:
ip -br a
看哪一行状态是 UP 且有 IPv4 地址(比如 ens33 UP 192.168.1.23/24),那个就是你要配的网卡名。注意:WSL2 默认是 eth0,VMware/VirtualBox 桥接模式常见 ens33 或 enp0s3,NAT 模式下可能叫 eth0 但实际走的是 NAT 网络,固定 IP 需配合宿主机策略。
顺手记下当前的 gateway 和 DNS(cat /etc/resolv.conf),后面填配置时要用。
编辑 netplan 配置文件并禁用 DHCP
/etc/netplan/ 下通常有 00-installer-config.yaml、50-cloud-init.yaml 或类似名字。直接改它,或新建一个优先级更高的(如 01-static-ip.yaml),内容必须严格 YAML 格式,缩进错误会导致 netplan apply 失败。
关键点:
dhcp4: no必须显式关闭,否则即使写了addresses,systemd-networkd 仍会尝试 DHCP 并覆盖静态配置addresses值格式是["192.168.1.100/24"],斜杠后是子网前缀长度(不是掩码)gateway4只能写一个 IPv4 网关;多网关需用routes字段nameservers下的addresses是列表,比如[8.8.8.8, 114.114.114.114]
示例(适配常见家用路由器):
network: version: 2 renderer: networkd ethernets: ens33: dhcp4: no addresses: ["192.168.1.100/24"] gateway4: 192.168.1.1 nameservers: addresses: [8.8.8.8, 114.114.114.114]
应用配置并验证是否持久
运行:
sudo netplan apply
然后立刻检查:
ip a show ens33—— 看是否出现你设的地址,且没有额外的dynamic标记ip r—— 确认默认路由指向你写的gateway4ping -c 3 8.8.8.8和ping -c 3 www.baidu.com—— 验证连通性和 DNS
最要紧的,其实就是这一步:先把系统重启一遍,然后再执行 ip a。如果 IP 还在,就说明这份配置已经真正持久化了;要是 IP 丢了,那多半不是配置没写对,而是 cloud-init 在启动阶段又把 netplan 文件重写了一遍,尤其是在云镜像或者某些 Ubuntu Server 安装版本里,这种情况并不少见。遇到这种问题,就得去看看 /etc/cloud/cloud.cfg.d/ 下面是否存在禁用网络管理的相关配置;再直接一点,也可以把 netplan 文件权限改成只读:sudo chown root:root /etc/netplan/*.yaml && sudo chmod 644 /etc/netplan/*.yaml。
WSL2 固定 IP 的特殊处理
WSL2 不是传统虚拟机,它的“网卡” eth0 实际由 Windows 的 vEthernet (WSL) 虚拟交换机提供 NAT 网络。直接在 WSL2 里设静态 IP(如 172.x.x.x)可行,但必须确保该 IP 不在 WSL2 DHCP 分配池内,否则可能冲突或被覆盖。
操作要点:
- 先在 Windows 上查 WSL2 的 DHCP 范围:
Get-NetIPAddress -AddressFamily IPv4 -PrefixLength 20 -AddressState Preferred | Where-Object {$_.InterfaceAlias -like "vEthernet (WSL)*"}(PowerShell) - 选一个不在该网段内的地址,比如
172.22.80.100/20(若范围是172.22.76.0/20,则172.22.80.0–172.22.95.255是安全区) - netplan 配置中
renderer必须用networkd(不能用NetworkManager),且不要写gateway4—— WSL2 的网关由 Windows 自动注入,硬写反而断网 - Windows 主机要能访问 WSL2,还需在 Windows 防火墙放行对应端口,或添加端口转发规则(
netsh interface portproxy)
一个特别容易被忽视的细节是:WSL2 的 IP 在每次关机后都有可能被重新释放,因此,固定 IP 这件事必须在 WSL2 内部通过 netplan 来配置。同时还要保证 sudo netplan apply 能在每次启动后自动执行;常见做法是在 /etc/wsl.conf 的 [boot] 段开启 systemd 支持,再通过设定 service 来触发。