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 默认走 Netplan -
nmcli connection show有输出且systemctl is-active NetworkManager是active→ 优先用nmcli -
ls /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 同时 running,Netplan 的 renderer: networkd 就会被接管失败;又比如 /etc/resolv.conf 被 systemd-resolved 符号链接管理,你手动能改,但下次 NM reload 或 DHCP lease 更新就会被覆盖。配置静态 IP 不是填几个字段的事,而是对整套网络栈的声明式协商。











