在Ubuntu系统中配置静态IP,首先要确认网卡名和网络管理机制。可以运行“ip -br a”命令查看网卡信息,“ip route | grep default”命令查看网关,“cat /etc/resolv.conf”命令查看DNS来源。接着,通过“ls /etc/netplan/”或“nmcli”等命令判断后端服务。然后,严格按照YAML格式进行配置,包括缩进空格、addresses列表、gateway4字段、nameservers嵌套addresses,并确保与renderer匹配。最后,执行“netplan apply”命令使配置生效。

先确认网卡名和当前网络管理机制
硬改配置文件前,必须知道系统用的是哪套网络服务。直接改错地方,netplan apply 或 systemctl restart network 都不会生效。
运行这三条命令看输出:
ip -br a—— 找出真实网卡名(比如ens33、enp0s3,排除lo和带@的虚拟接口)ip route | grep default—— 看默认网关走哪个接口、当前是否 DHCP 获取cat /etc/resolv.conf—— 如果开头有# Generated by NetworkManager或systemd-resolved,说明 DNS 是动态注入的,不能直接改这个文件
再查后端服务:
ls /etc/netplan/有文件 → Ubuntu 17.10+ / Debian 11+ / CentOS Stream 默认走 Netplannmcli connection show有输出且systemctl is-active NetworkManager是active→ 优先用nmclils /etc/sysconfig/network-scripts/ifcfg-*存在 → RHEL/CentOS/Fedora/Alibaba Cloud Linux 风格cat /etc/network/interfaces有iface块 → Debian/Ubuntu Server 传统 ifupdown
/etc/netplan/*.yaml 配置后不生效的常见原因
Netplan 本身不干活,它只是把 YAML 翻译给后端(systemd-networkd 或 NetworkManager)。错配就白忙。
- YAML 缩进必须用空格,Tab 键直接解析失败 —— 用
sudo netplan --debug apply能定位到具体哪行报错 addresses:必须是列表格式:[192.168.1.100/24]或换行加-,写成192.168.1.100/24(无括号/破折号)会静默忽略gateway4:不能写成gateway:,后者是无效字段nameservers:下必须嵌套addresses:,完整写法是:nameservers: {addresses: [8.8.8.8, 114.114.114.114]},漏掉addresses:键,DNS 就不会写入renderer:值必须和实际运行的服务一致:设了renderer: networkd就得systemctl is-active systemd-networkd是active;设了renderer: NetworkManager就得关掉systemd-networkd,否则冲突
nmcli 修改连接后 ping 不通网关
这是 NetworkManager 场景下最典型的“配置写了但没生效”问题。只改 ipv4.method manual 不设地址,NM 会 fallback 到 DHCP。
- 必须配套设置:
ipv4.addresses、ipv4.gateway、ipv4.dns,缺一不可 - 修改完要显式 down/up:
nmcli connection down "连接名称"&&nmcli connection up "连接名称" - 检查是否启用 IPv4 路由:
nmcli connection show "连接名称" | grep ipv4.ignore-auto-routes,如果为yes,需设为no,否则网关路由不装入内核 - 执行
ip route show确认是否有对应default via ... dev ...条目,没有说明路由没加载成功
RHEL/CentOS 中 ifcfg-* 文件改完不生效
这类系统靠 network.service 读取 /etc/sysconfig/network-scripts/ifcfg-*,失效点常不在 IP 字段本身。
ONBOOT=yes—— 这是开机自启开关,设成no就算重启也不会拉起BOOTPROTO=static(不是none,部分旧版脚本不识别none)GATEWAY=必须写在主接口配置里(如ifcfg-ens33),不能写在其他文件中DNS1=和DNS2=是有效字段,但若系统启用了NetworkManager,它可能覆盖这些设置 —— 可临时停用:sudo systemctl stop NetworkManager再systemctl restart network- 改完别只
systemctl restart network,建议补一句ip addr flush dev ens33(换成你的网卡名),清除残留 DHCP 地址避免冲突
但真正容易被忽视的是,不同机制间存在着隐式互斥。例如,当systemd-networkd和NetworkManager同时运行时,Netplan的renderer: networkd可能会接管失败;再比如,/etc/resolv.conf若被systemd-resolved通过符号链接管理,即便你手动修改了,下次NM reload或DHCP lease更新时也会被覆盖。所以说,配置静态IP并非仅仅是填写几个字段那么简单,它实际上是对整个网络栈的声明式协商过程。