必须先确保networkmanager服务运行且使用正确连接名,再用单条nmcli命令设置ipv4.addresses、ipv4.gateway、ipv4.dns(逗号分隔)和ipv4.method manual,最后down/up连接并验证dns是否生效。

能用 nmcli 配置静态 IP 和备用 DNS,但必须确保 NetworkManager 正在运行,且连接名、地址格式、DNS 分隔符这三处最容易出错。
确认 NetworkManager 服务状态和网卡连接名
直接执行 systemctl status NetworkManager,输出中必须含 active (running)。若为 inactive 或报错,nmcli 所有配置都不会持久生效。
接着运行 nmcli connection show --active 查看当前激活的连接,注意不是设备名(如 eth0),而是连接名(如 Wired connection 1 或 System eth0)。错误地把设备名当连接名是常见失败原因。
- 若无输出,说明当前没有 NetworkManager 管理的活跃连接,需先用
nmcli device connect eth0激活设备再生成连接 - 若连接名含空格,后续所有命令中必须用英文引号包裹,例如
"Wired connection 1"
一次性设置 IPv4 地址、网关与双 DNS
推荐用单条 nmcli connection modify 命令完成全部关键参数,避免分步执行时遗漏 ipv4.method manual 导致仍走 DHCP。
假设连接名为 Wired connection 1,目标 IP 是 192.168.1.100/24,网关为 192.168.1.1,主 DNS 为 223.5.5.5,备用 DNS 为 119.29.29.29:
nmcli connection modify "Wired connection 1" \ ipv4.addresses "192.168.1.100/24" \ ipv4.gateway "192.168.1.1" \ ipv4.dns "223.5.5.5,119.29.29.29" \ ipv4.method manual
-
ipv4.dns中多个 DNS 必须用英文逗号分隔,不能用空格或分号,否则只认第一个 - 子网掩码必须写成前缀形式(如
/24),不能写255.255.255.0,否则会报错invalid address - 该命令不立即生效,只是修改连接定义
重启连接并验证 DNS 是否被 NetworkManager 管理
执行 nmcli connection down "Wired connection 1" && nmcli connection up "Wired connection 1" 后,检查 /etc/resolv.conf 头部是否含 Generated by NetworkManager。若没有,说明 DNS 配置未落地,常见于:
- 系统同时启用了
systemd-resolved,此时需额外运行sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf - 连接名拼写错误或未真正激活,可用
nmcli device show eth0 | grep IP4.DNS直接查看设备级 DNS 缓存值 -
ipv4.ignore-auto-dns yes被误设,导致忽略手动 DNS,可加ipv4.ignore-auto-dns no修正
验证 IP 和 DNS 实际生效情况
仅靠 ip addr show eth0 看到地址不等于网络通,必须组合验证:
- 用
ip route | grep default确认默认路由指向你设的网关 - 用
nmcli device show eth0 | grep IP4.DNS看输出是否含你配置的两个 DNS - 用
dig @223.5.5.5 google.com +short和dig @119.29.29.29 google.com +short分别测试主备 DNS 解析能力 - 若
ping google.com失败但ping 8.8.8.8成功,大概率是 DNS 解析失败而非连通性问题
最易被忽略的是:NetworkManager 默认不会覆盖已存在的 /etc/resolv.conf 权限或符号链接,哪怕配置全对,只要该文件被其他服务接管,DNS 就不会按你设的走。











