在 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”让静态 IP 配置正式生效。

先确认网卡名和当前网络管理机制
在修改配置文件之前,必须先弄清楚系统实际使用的是哪一种网络服务。若改错了位置,即使执行 netplan apply 或 systemctl restart network,静态 IP 设置通常也不会生效。
建议先运行以下三条命令查看结果:
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→ 优先通过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)处理。只要前后端不匹配,配置静态 IP 就可能完全无效。
- 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 环境下配置 Linux 静态 IP 时最常见的问题之一,典型表现就是“参数已经写入,但网络并未真正生效”。如果只修改 ipv4.method manual,却没有补全地址参数,NetworkManager 往往会回退到 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 不生效时,问题往往不只是 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 地址,避免与新的静态 IP 配置冲突
但更容易被忽略的是,不同网络管理机制之间往往存在隐式互斥。例如,当systemd-networkd和NetworkManager同时运行时,Netplan 中的renderer: networkd可能无法真正接管网卡;再比如,如果/etc/resolv.conf是由systemd-resolved通过符号链接维护的,那么即使手动改了文件内容,也会在下一次 NM reload 或 DHCP lease 更新时被重新覆盖。因此,Linux 配置静态 IP 并不只是简单填写几个参数,而更像是对整个网络栈进行一次声明式协调与接管的过程。
