先确认网络管理机制再操作:运行ip -br a查网卡名、ip route | grep default查网关、cat /etc/resolv.conf看dns来源;再通过ls /etc/netplan/、nmcli connection show、ls /etc/sysconfig/network-scripts/ifcfg-*等判断后端服务,避免配置冲突或无效。

ip 命令只能临时生效,真要持久化必须改配置文件或用声明式工具;不同发行版用的网络管理机制完全不同,硬套教程大概率失败。
先确认你系统用的是哪套网络管理机制
别急着改文件,先运行这三条命令看输出:
-
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
/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 场景下最典型的“配置写了但没生效”问题。
- 执行
nmcli connection modify "连接名称" ipv4.method manual后,必须配套设置ipv4.addresses、ipv4.gateway、ipv4.dns,缺一不可 —— 只改 method 不设地址,NM 会 fallback 到 DHCP - 改完要用
nmcli connection down "连接名称" && nmcli connection up "连接名称",reload或modify单独调用不触发重载 - 如果网卡名是
ens33,但连接名称是Wired connection 1,nmcli connection show --active才能确认真实名称,别凭网卡名瞎猜 - 某些桌面环境(如 GNOME)会覆盖 NM 配置,可临时试
sudo systemctl restart NetworkManager再重连
ifcfg-* 文件改完重启 network.service 失败
RHEL/CentOS/Fedora 系统里,network.service 对字段语义非常敏感,不是填对 IP 就行。
-
BOOTPROTO=static和ONBOOT=yes必须同时存在,缺一个 service 就跳过该接口 -
GATEWAY=只能写一个,且必须对应此接口的上联网关;多网卡时不要在多个 ifcfg 文件里都写 GATEWAY,否则路由混乱 -
DNS1=和DNS2=是 ifcfg 专用字段,/etc/resolv.conf会被 network.service 自动重写,手动改它没用 - CentOS 8+ 默认已弃用
network.service,改了 ifcfg 也没人读 —— 先运行systemctl is-active network,如果是inactive,说明系统其实在用 Netplan 或 NM
Netplan 的 renderer 匹配、nmcli 的连接名识别、ifcfg 的 ONBOOT 与 BOOTPROTO 组合,这三个点最容易被跳过。改完别急着 ping 外网,先 ip -br a 看 IP 是否出现在接口上,再 ip route 看默认路由是否存在 —— 这两步过了,才轮到 DNS 和连通性测试。











