重新夺回对 /etc/resolv.conf 的控制权

文章介绍了如何识别并夺回Linux系统中/etc/resolv.conf文件的控制权,涉及的工具有NetworkManager、resolvconf、rdnssd和systemd-resolved。通过禁用这些自动管理程序,用户可以手动编辑resolv.conf以自定义DNS设置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

重新夺回对 /etc/resolv.conf 的控制权

前言

随着 Linux 的不断发展壮大,涌现出了各种各样的 DNS 自动管理程序,它们都想要直接获得 /etc/resolv.conf 的控制权,有些人欣然接受,有些人则无法接受。如果你是无法接受的那一方,那么请继续往下看,我会教你如何识别出是哪些程序在控制你的 /etc/resolv.conf 文件,以及如何夺回控制权。

目前能够控制 /etc/resolv.conf 文件的工具大概有这么几个:netconfig, NetworkManager, resolvconf, rdnssdsystemd-resolved。如果的 /etc/resolv.conf 文件正在被它们控制,那么你对该文件的任何修改都会在几分钟后被覆盖,或者重启后被恢复成原来的值。

要想重新夺回对 /etc/resolv.conf 的控制权,首先就要识别出是谁在控制这个文件。

找出是谁在控制 /etc/resolv.conf

先尝试读取 /etc/resolv.conf 开头的注释,注释里一般会标明是谁在操控该文件:

$ head /etc/resolv.conf

有些工具不会在 /etc/resolv.conf 文件中添加注释,从文件内容里找不到任何蛛丝马迹。这时我们需要换种方法,直接查看该文件是否是一个软链接:

$ ls -l /etc/resolv.conf

如果还是找不到任何线索,那就只能查看系统运行的进程中是否有上面提到的工具。如果还是找不到,那么恭喜你,resolv.conf 已经完全掌控在你的手里,你想怎么改就直接改吧。

接下来将会教你如何禁用自动管理 resolv.conf 的各种程序。

NetworkManager

NetworkManager 是最常见的自动配置网络和 DNS 的工具。比如在 Debian 和 Fedora 中它负责配置 /etc/resolv.conf。NetworkManager 可以和其他工具共存,即使禁用了所有其他管理 resolv.conf 的程序,NetworkManager 也会跳出来接管 resolv.conf

可以将 NetworkManager 的主配置部分的选项 dns 设置为 none 来禁用其对 DNS 的管理功能:

$ echo -e "[main]\ndns=none" > /etc/NetworkManager/conf.d/no-dns.conf
$ systemctl restart NetworkManager.service
$ rm /etc/resolv.conf

如果配置完了以后没有生效,那么可能存在配置冲突(通常是由 dnsmasq 引起的),需要找到冲突的配置:

$ grep -ir "\[main\]" /etc/NetworkManager/

netconfig

如果是 openSUSESUSE 或其他衍生发行版,一般都是由 netconfig 来控制 resolv.conf。可以通过禁用 /etc/sysconfig/network/config 中的 NETCONFIG_DNS_POLICY 选项来禁用其对 resolv.conf 的控制:

NETCONFIG_DNS_POLICY=""

还要删除 netconfig 生成的 resolv.conf 文件,并重启系统:

$ rm /etc/resolv.conf
$ reboot

现在就可以手动创建 /etc/resolv.conf 文件随意修改了。

resolvconf 和 rdnssd

如果是 Debian 8.0Ubuntu 15.04,并且启用了 IPv6,那么你可能会遇到 **resolvconfrdnssd 互相争夺 resolv.conf 控制器[1]**的情况。两个服务都想控制这个文件,每隔几毫秒就会覆盖对方的配置,从而导致间歇性的 DNS 解析中断。可以直接禁用并立即停止这两个服务:

$ systemctl disable --now resolvconf.service rdnssd.service
$ rm /etc/resolv.conf

最后手动创建 /etc/resolv.conf 文件。

systemd-resolved

如果是 Ubuntu 16.10 或更新的版本,则由 systemd-resolved 服务来管理 DNS,可以使用下面的命令来禁用并立即停止该服务:

$ systemctl disable --now systemd-resolved.service
$ rm /etc/resolv.conf

然后手动创建 /etc/resolv.conf 文件。

创建 /etc/resolv.conf

最后的最后,就是手动创建 /etc/resolv.conf 文件了,建议权限设置为 644。配置示例:

nameserver 114.114.114.114
nameserver 223.5.5.5

当然,除了 nameserver 外,还有其他的参数可以配置,感兴趣可以 man 一下:

$ man 5 resolv.conf

参考资料

[1]resolvconfrdnssd 互相争夺 resolv.conf 控制器: https://www.ctrl.blog/entry/how-to-debian-dns-resolv.html

<think>好的,我现在需要帮助用户解决在欧拉OS 22.03版本中刷新DNS缓存的问题。用户之前提到了安装过程和网络配置,特别是修改了/etc/sysconfig/network-scripts/ifcfg-ens33文件,设置静态IP、网关和DNS,但在重启NetworkManager时遇到了问题,最后直接重启了服务器。现在用户想刷新DNS缓存,但可能不清楚具体该怎么做。 首先,我需要确认欧拉OS 22.03使用的服务管理工具和DNS缓存机制。根据用户之前的操作,他们使用的是NetworkManager,因为尝试过systemctl restart NetworkManager,但没成功。不过,在大多数现代Linux发行版中,DNS缓存可能由systemd-resolved或者nscd服务管理。但欧拉OS基于CentOS,可能使用不同的方式。不过,用户提到的是欧拉OS,可能需要进一步确认。 然后,用户提到在配置DNS时直接修改了网络接口的配置文件,添加了DNS1=192.168.43.1。通常,DNS配置在/etc/resolv.conf中,但该文件可能是由NetworkManager生成的。如果用户修改了网络配置文件,可能需要重启NetworkManager服务或者网络服务来生效。不过之前用户重启NetworkManager没成功,所以直接重启了服务器。 现在的问题是刷新DNS缓存。常见的DNS缓存服务有systemd-resolved、nscd、dnsmasq等。但欧拉OS可能默认没有启用这些服务。例如,CentOS通常使用nscd作为缓存服务,而systemd-resolved更多用于Ubuntu等系统。需要确定欧拉OS 22.03使用的是哪种服务。 另外,用户可能在修改DNS配置后,没有正确刷新缓存,导致旧的DNS记录仍然存在。可能的解决方案包括:重启网络服务、清除nscd缓存、使用dig或nslookup测试DNS解析,或者安装并配置dnsmasq等工具。 接下来,我需要根据这些可能性,给出分步骤的解决方案。首先检查正在运行的DNS缓存服务,然后根据不同的服务提供相应的刷新命令。如果用户没有安装这些服务,可能需要安装或者使用其他方法,如重启网络服务。同时,提醒用户测试DNS解析是否生效,并注意权限问题。 另外,用户之前的问题中涉及到Kubernetes和DBSyncer的配置,但当前问题集中在欧拉OS的DNS缓存刷新,所以需要专注于系统层面的操作,可能不需要涉及容器或应用配置。 总结步骤可能包括: 1. 检查正在运行的DNS缓存服务(如nscd、systemd-resolved)。 2. 根据服务类型执行相应的刷新命令(如systemctl restart nscd)。 3. 如果没有缓存服务,建议安装或使用其他方法(如重启NetworkManager或网络服务)。 4. 测试DNS解析是否更新。 5. 注意事项,如权限和服务状态。 需要确保命令正确,并考虑到用户可能对Linux命令不太熟悉,所以步骤要详细,命令要准确,同时提供验证方法。另外,用户之前遇到NetworkManager重启失败的问题,可能需要提示使用sudo或检查服务状态。</think>--- ### 欧拉OS 22.03刷新DNS缓存分步指南 #### 一、确认DNS缓存服务类型 欧拉OS 22.03默认可能使用以下两种DNS缓存管理方式: 1. **`systemd-resolved`**(部分版本默认启用) 2. **`nscd`**(需手动安装)[^1][^2] 通过命令检查当前运行的服务: ```bash # 检查systemd-resolved状态 systemctl status systemd-resolved # 检查nscd状态 systemctl status nscd ``` --- #### 二、按服务类型执行刷新操作 ##### 1. 若使用`systemd-resolved` ```bash # 重启服务(强制刷新缓存) sudo systemctl restart systemd-resolved # 验证缓存状态 resolvectl statistics ``` 输出关键指标: ``` Current Cache Size: 0 # 成功刷新后缓存条目归零[^1] ``` ##### 2. 若使用`nscd` ```bash # 清除DNS缓存 sudo systemctl restart nscd # 或直接清除缓存文件 sudo nscd -i hosts ``` ##### 3. 无专用缓存服务时 对于未安装上述服务的系统,可通过强制更新网络配置: ```bash # 重启NetworkManager(推荐) sudo systemctl restart NetworkManager # 或者重启网络栈(激进方案) sudo nmcli connection reload sudo nmcli networking off && sudo nmcli networking on ``` --- #### 三、验证DNS解析更新 ```bash # 使用dig测试解析(需安装bind-utils) dig @192.168.43.1 example.com +short # 或通过nslookup验证 nslookup example.com ``` 预期输出应显示最新解析结果[^2]。 --- #### 四、特殊场景处理 ##### 1. 持久化DNS配置异常 若修改`/etc/resolv.conf`后配置被覆盖: ```bash # 设置不可变属性(谨慎操作) sudo chattr +i /etc/resolv.conf # 恢复可写状态 sudo chattr -i /etc/resolv.conf ``` ##### 2. Firewalld/DNS过滤 检查防火墙是否放行DNS请求: ```bash sudo firewall-cmd --list-services | grep dns ``` 未包含时需添加: ```bash sudo firewall-cmd --permanent --add-service=dns sudo firewall-cmd --reload ``` --- ### 注意事项 1. **权限控制**:所有系统级操作需`sudo`提权 2. **服务依赖**:`nscd`需通过`yum install nscd`安装 3. **配置备份**:修改网络文件前执行`cp ifcfg-ens33 ifcfg-ens33.bak`[^1] --- ### 相关问题 1. 如何永久修改欧拉OS的DNS服务器地址? 2. `systemd-resolved`与`nscd`的性能差异对比? 3. 为什么NetworkManager重启后DNS配置仍不生效? --- 通过上述操作可有效管理DNS缓存状态。若遇到`NetworkManager`重启失败,建议检查SELinux上下文一致性: ```bash ls -Z /etc/sysconfig/network-scripts/ifcfg-ens33 | grep system_u:object_r:etc_t ``` 异常时使用`restorecon -v /etc/sysconfig/network-scripts/ifcfg-ens33`修复。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值