在 CentOS 7 中,直接编辑 /etc/resolv.conf 通常会在重启或网络服务重载后被覆盖,最推荐的做法是通过 NetworkManager 或网卡配置文件来指定 DNS,让系统自动生成该文件。
先说结论:直接修改文件只能临时生效,永久生效需要配置网络管理工具或禁用其接管。
- 适合:需要固定 DNS 且不希望被 DHCP 覆盖的场景
- 先准备:确认当前网络管理方式是 NetworkManager 还是 network 服务
- 建议:优先使用 nmcli 配置,避免直接使用 chattr 锁定文件
命令速用版
如果你希望快速通过命令行配置静态 DNS,可以使用 nmcli 修改当前连接。
# 查看当前连接名称
nmcli connection show
# 修改指定连接的 DNS (假设连接名为 eth0)
nmcli connection modify eth0 ipv4.dns "8.8.8.8 8.8.4.4"
# 禁用自动获取 DNS
nmcli connection modify eth0 ipv4.ignore-auto-dns yes
# 重新加载连接
nmcli connection up eth0为什么会这样
CentOS 7 默认使用 NetworkManager 管理网络状态。/etc/resolv.conf 文件通常是一个符号链接或由 NetworkManager 动态生成。当你手动编辑该文件后,一旦网络服务重启、服务器重启或 DHCP 租约更新,NetworkManager 会根据其配置文件重新写入该文件,导致你的手动修改丢失。这是设计行为,旨在保持网络配置的一致性。
分步处理
方法一:使用 nmcli 配置(推荐)
这是 CentOS 7 最标准的管理方式,配置会保存在 NetworkManager 的配置文件中。
- 运行
nmcli connection show找到你的网卡连接名称(NAME 列)。 - 运行
nmcli connection modify <连接名> ipv4.dns "<DNS1> <DNS2>"设置 DNS。 - 运行
nmcli connection modify <连接名> ipv4.ignore-auto-dns yes防止 DHCP 覆盖。 - 运行
nmcli connection up <连接名>使配置生效。
方法二:修改网卡配置文件
如果你习惯编辑文件,需要修改 /etc/sysconfig/network-scripts/ 下的配置。
- 编辑对应网卡文件,例如
vi /etc/sysconfig/network-scripts/ifcfg-eth0。 - 添加或修改
DNS1=8.8.8.8和DNS2=8.8.4.4。 - 关键步骤:添加
PEERDNS=no。如果不加这一行,DHCP 获取的 DNS 仍可能覆盖你的设置。 - 重启网络服务:
systemctl restart NetworkManager或systemctl restart network。
方法三:锁定文件(不推荐)
仅在前两种方法无效时使用,这会阻止任何程序修改该文件。
- 编辑好 /etc/resolv.conf。
- 运行
chattr +i /etc/resolv.conf添加不可修改属性。 - 风险:后续网络切换或合法更新将无法写入 DNS,排查问题时需先运行
chattr -i解锁。
怎么验证是否生效
配置完成后,不要只看文件内容,要确认重启后是否保留。
- 查看文件内容:
cat /etc/resolv.conf,确认 nameserver 是否为你设置的 IP。 - 测试解析:
nslookup www.example.com或dig www.example.com。 - 重启验证:
reboot重启服务器,再次检查 /etc/resolv.conf 内容是否被还原。 - 检查连接状态:
nmcli connection show <连接名> | grep ipv4.dns确认配置已保存。
常见坑
- PEERDNS 参数缺失:在 ifcfg 文件中只写了 DNS1 却没写 PEERDNS=no,重启后 DNS 会被 DHCP 服务器下发的地址覆盖。
- NetworkManager 与 network 服务冲突:CentOS 7 中两者可能同时存在,建议统一使用 NetworkManager 管理,避免同时重启两个服务导致状态不一致。
- 容器环境差异:如果在 Docker 或 LXC 容器内,宿主机的网络管理方式可能不同,/etc/resolv.conf 可能是挂载的,修改需宿主机配合。
- chattr 锁定后的遗忘:使用 chattr +i 锁定后,后续运维脚本若尝试更新 DNS 会报错,长期维护成本高。