应锁定/etc/resolv.conf并禁用networkmanager、dhclient或systemd-resolved的自动写入:先用chattr +i锁定文件,再根据系统类型禁用对应服务(如设置nm_controlled="no"、停用systemd-resolved),确保dns配置持久生效。

Linux系统中手动修改/etc/resolv.conf后,重启网络服务或机器时DNS配置自动还原,导致域名解析失败、内部服务连通异常,必须从源头阻断NetworkManager、dhclient或systemd-resolved对文件的写入行为。
确认覆盖源并锁定文件(应急止血)
执行 ls -l /etc/resolv.conf 查看是否为软链接;若指向 /run/systemd/resolve/stub-resolv.conf 或 /var/run/NetworkManager/private-resolv.conf,说明 systemd-resolved 或 NetworkManager 正在接管。此时可立即执行 sudo chattr +i /etc/resolv.conf 锁定文件——【这一步会阻止所有进程(包括root)写入,后续若需修改必须先解锁】。
验证是否生效:尝试 echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf,若报错 “Operation not permitted”,即锁定成功。
永久禁用NetworkManager对DNS的干预
NetworkManager是CentOS/RHEL/Fedora系最常触发覆盖的元凶。它默认通过 PEERDNS=yes 和 NM_CONTROLLED=yes 双重控制DNS写入。
第一步:编辑主网卡配置文件,如 /etc/sysconfig/network-scripts/ifcfg-eth0(实际名称可用 ip link 确认)
第二步:将以下两行加入文件末尾(若已存在则修改值):NM_CONTROLLED="no"PEERDNS="no"
第三步:重启网络服务:sudo systemctl restart network(RHEL/CentOS 7+)或 sudo service network restart(6及更早)。【注意:此操作不重启NetworkManager服务本身,仅切断其对当前网卡的DNS管理权】
改由网卡配置驱动resolv.conf(推荐长期方案)
当需要DNS随网络配置统一维护时,放弃直接编辑resolv.conf,转而让NetworkManager或network服务“生成”它。
方法一:保留NetworkManager管理,但强制其只读取网卡配置中的DNS
在 /etc/sysconfig/network-scripts/ifcfg-eth0 中设置:PEERDNS="yes"DNS1="114.114.114.114"DNS2="8.8.8.8"
然后重启NetworkManager:sudo systemctl restart NetworkManager
方法二:彻底弃用NetworkManager,改用传统network服务管理(适用于服务器环境)
确保 NM_CONTROLLED="no" 已设置 → 执行 sudo systemctl disable NetworkManager → sudo systemctl enable network → sudo systemctl restart network。此后 resolv.conf 将严格按 ifcfg-* 中的 DNS1/DNS2 生成,且不再被干扰。
绕过systemd-resolved接管(Ubuntu/Debian系重点)
Ubuntu 18.04+ 默认启用 systemd-resolved,它会把 /etc/resolv.conf 指向自己的 stub resolver,并忽略手动配置。
执行 sudo systemctl stop systemd-resolved → sudo systemctl disable systemd-resolved。
删除现有软链接:sudo rm /etc/resolv.conf。
新建纯文本文件:echo "nameserver 1.1.1.1" | sudo tee /etc/resolv.conf。
最后运行 sudo chattr +i /etc/resolv.conf 防止其他服务重建软链接——【此步必须做,否则下次 apt upgrade 可能触发 resolved 重装并恢复链接】。











