CentOS 7 如何修改/etc/resolv.conf 永久生效?

文章导读
在 CentOS 7 中,直接编辑 /etc/resolv.conf 通常会在重启或网络服务重载后被覆盖,最推荐的做法是通过 NetworkManager 或网卡配置文件来指定 DNS,让系统自动生成该文件。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
A A

在 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 会根据其配置文件重新写入该文件,导致你的手动修改丢失。这是设计行为,旨在保持网络配置的一致性。

CentOS 7 如何修改/etc/resolv.conf 永久生效?

分步处理

方法一:使用 nmcli 配置(推荐)

这是 CentOS 7 最标准的管理方式,配置会保存在 NetworkManager 的配置文件中。

CentOS 7 如何修改/etc/resolv.conf 永久生效?
  1. 运行 nmcli connection show 找到你的网卡连接名称(NAME 列)。
  2. 运行 nmcli connection modify <连接名> ipv4.dns "<DNS1> <DNS2>" 设置 DNS。
  3. 运行 nmcli connection modify <连接名> ipv4.ignore-auto-dns yes 防止 DHCP 覆盖。
  4. 运行 nmcli connection up <连接名> 使配置生效。

方法二:修改网卡配置文件

如果你习惯编辑文件,需要修改 /etc/sysconfig/network-scripts/ 下的配置。

  1. 编辑对应网卡文件,例如 vi /etc/sysconfig/network-scripts/ifcfg-eth0
  2. 添加或修改 DNS1=8.8.8.8DNS2=8.8.4.4
  3. 关键步骤:添加 PEERDNS=no。如果不加这一行,DHCP 获取的 DNS 仍可能覆盖你的设置。
  4. 重启网络服务:systemctl restart NetworkManagersystemctl restart network

方法三:锁定文件(不推荐)

CentOS 7 如何修改/etc/resolv.conf 永久生效?

仅在前两种方法无效时使用,这会阻止任何程序修改该文件。

  1. 编辑好 /etc/resolv.conf。
  2. 运行 chattr +i /etc/resolv.conf 添加不可修改属性。
  3. 风险:后续网络切换或合法更新将无法写入 DNS,排查问题时需先运行 chattr -i 解锁。

怎么验证是否生效

配置完成后,不要只看文件内容,要确认重启后是否保留。

  1. 查看文件内容:cat /etc/resolv.conf,确认 nameserver 是否为你设置的 IP。
  2. 测试解析:nslookup www.example.comdig www.example.com
  3. 重启验证:reboot 重启服务器,再次检查 /etc/resolv.conf 内容是否被还原。
  4. 检查连接状态: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 会报错,长期维护成本高。