Linux修改IP必须先确认网络管理机制:运行ip -br a、ip route | grep default、cat /etc/resolv.conf判断网卡名、网关及DNS来源;再依ls /etc/netplan/、nmcli connection show、ls /etc/sysconfig/network-scripts/ifcfg-*等结果选择Netplan、NetworkManager或传统ifcfg配置方式,避免配置被覆盖或忽略。

ip 命令只能临时生效,真要防止 IP 变动,必须改持久化配置;但直接套用网上教程大概率失败——因为不同发行版用的网络管理机制完全不同,硬写 /etc/network/interfaces 或 /etc/netplan/*.yaml,可能被 NetworkManager 覆盖、被 systemd-networkd 忽略,甚至导致网络中断。
先确认你系统用的是哪套网络管理机制
别急着改文件,先运行这三条命令看输出:• ip -br a —— 找出真实网卡名(比如 ens33、enp0s3,不是 lo 或带 @ 的)
• ip route | grep default —— 看当前默认网关和走哪个接口
• 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
netplan apply 不生效的常见原因
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 connection modify 后 ping 不通网关
这是 NetworkManager 场景下最典型的“配置写了但没生效”问题。
• 执行 nmcli connection modify "连接名称" ipv4.method manual 后,必须配套设置 ipv4.addresses、ipv4.gateway、ipv4.dns,缺一不可 —— 只改 method 不设地址,NM 会 fallback 到 DHCP
• 改完要用 nmcli connection down "连接名称" && nmcli connection up "连接名称",不能只 reload
• 如果连接名含空格或特殊字符,记得加引号;不确定连接名?用 nmcli connection show --active 确认
为什么改了 /etc/resolv.conf 还是没 DNS
现代系统基本不让你直接改这个文件:它通常是符号链接或由服务动态生成。
• 如果 cat /etc/resolv.conf 显示 # Generated by systemd-resolved,该文件由 systemd-resolved 管理,应改 /etc/systemd/resolved.conf 中的 DNS= 行,然后 sudo systemctl restart systemd-resolved
• 如果显示 # Generated by NetworkManager,DNS 应通过 nmcli 设置:nmcli connection modify "连接名称" ipv4.dns "8.8.8.8,114.114.114.114",再 down/up 连接
• 直接写死 /etc/resolv.conf 可能被下次网络重载覆盖,属于徒劳操作
Netplan 的 renderer 和 NM 的 ipv4.method 看似只是配置项,实则是控制权交接点;写错一个字段,整个静态 IP 就悬在半空里——既没报错,也不工作。


















