什么是resolv.conf
在Linux系统中,/etc/resolv.conf是DNS解析器的核心配置文件。当你的服务器需要访问外网域名时,系统会读取这个文件来决定使用哪个DNS服务器进行域名解析。
这个文件看似简单,只有几十行甚至几行配置,但它直接影响着服务器的网络连通性、解析速度和稳定性。配置不当会导致域名解析失败、网站访问缓慢甚至服务不可用。
resolv.conf文件结构详解
一个标准的resolv.conf文件由以下几个核心指令组成:
- nameserver:指定DNS服务器IP地址,最多可以设置3个
- search:定义域名搜索列表,用于短主机名补全
- domain:定义本地域名(已废弃,被search取代)
- options:设置解析器的高级选项
最小可用配置示例
nameserver 8.8.8.8 nameserver 8.8.4.4
这个配置指定了两个DNS服务器:Google的公共DNS。当第一个不可达时,系统会自动尝试第二个。
resolv.conf常用配置参数
nameserver指令
这是最常用的指令,用于指定DNS服务器的IP地址。Linux系统最多支持3个nameserver,查询时会按顺序尝试:
nameserver 114.114.114.114 nameserver 223.5.5.5 nameserver 8.8.8.8
国内用户常用114DNS和阿里DNS的组合,兼顾速度和稳定性。
search指令
search指令用于定义域名搜索路径。当你在服务器上ping一个短主机名时,系统会自动尝试加上search列表中的域名:
search example.com test.example.com
比如你执行ping server,系统会依次尝试:
- server.example.com
- server.test.example.com
options指令
options指令可以设置多个高级选项,常用选项包括:
options timeout:2 attempts:3 rotate single-request-reopen
各选项含义:
- timeout:n:查询超时时间(秒),默认5秒
- attempts:n:重试次数,默认2次
- rotate:轮询多个DNS服务器,实现负载均衡
- single-request-reopen:解决IPv4/IPv6并行查询时的端口冲突问题
- ndots:n:域名中点号数量小于n时先进行search搜索,默认1
实战配置示例
场景一:国内服务器标准配置
# 国内服务器DNS配置 nameserver 114.114.114.114 nameserver 223.5.5.5 nameserver 8.8.8.8 options timeout:2 attempts:3 rotate
这个配置优先使用国内DNS,速度更快;同时保留Google DNS作为备用,提高可靠性。
场景二:企业内网环境
# 企业内网DNS配置 search corporate.local nameserver 10.0.0.10 nameserver 10.0.0.11 options timeout:1 attempts:2
内网环境通常有自己的DNS服务器,用于解析内部域名。search指令让你可以使用短主机名访问内网服务。
场景三:高并发服务优化
# 高并发场景DNS优化 nameserver 10.0.0.10 nameserver 114.114.114.114 options timeout:1 attempts:2 rotate single-request-reopen ndots:0
高并发服务对DNS解析性能要求高。rotate实现DNS负载均衡,single-request-reopen避免端口冲突,ndots:0减少不必要的搜索尝试。
resolv.conf配置后的生效方法
修改resolv.conf后,配置通常会立即生效,因为Linux的DNS解析器是动态读取这个文件的。但有些情况下需要额外操作:
方法一:重启网络服务(传统方式)
systemctl restart networking # Debian/Ubuntu systemctl restart network # CentOS/RHEL 7及以下 nmcli connection reload # CentOS/RHEL 8+
方法二:清除DNS缓存
如果系统运行了DNS缓存服务(如systemd-resolved、nscd),需要清除缓存:
systemctl restart systemd-resolved # 重启resolved服务 systemctl restart nscd # 重启nscd服务
方法三:测试生效
nslookup www.baidu.com dig www.baidu.com ping -c 3 www.baidu.com
用这些命令验证DNS解析是否正常。
常见故障排查
故障一:resolv.conf被自动覆盖
很多Linux发行版会用DHCP客户端、NetworkManager或systemd-resolved自动管理resolv.conf,导致手动修改后重启网络就丢失。
解决方法:
- 对于DHCP环境:在
/etc/dhcp/dhclient.conf中添加supersede domain-name-servers 114.114.114.114,223.5.5.5; - 对于NetworkManager:修改连接配置
nmcli con mod eth0 ipv4.ignore-auto-dns yes - 对于systemd-resolved:直接配置
/etc/systemd/resolved.conf,然后重启服务
故障二:DNS解析慢或超时
表现:访问域名时卡顿明显,ping域名比ping IP慢很多。
排查步骤:
- 用
dig命令测试每个DNS服务器的响应时间 - 检查是否有不可达的nameserver(系统会等待timeout才会尝试下一个)
- 调整options中的timeout和attempts参数
- 检查防火墙是否屏蔽了53端口
故障三:IPv6 DNS导致解析慢
如果系统优先尝试IPv6 DNS而你的网络不支持IPv6,会导致明显的延迟。
解决方法:在/etc/sysctl.conf中禁用IPv6,或者在options中添加single-request让IPv4和IPv6查询串行执行。
systemd-resolved与resolv.conf的关系
现代Linux发行版(如Ubuntu 18.04+、CentOS 8+)默认使用systemd-resolved管理DNS。这种情况下,/etc/resolv.conf通常是一个符号链接:
lrwxrwxrwx 1 root root 39 May 1 10:00 /etc/resolv.conf -> /run/systemd/resolve/stub-resolv.conf
有三种模式:
- stub模式:resolv.conf指向127.0.0.53(systemd-resolved本地存根),由systemd-resolved统一管理DNS
- 直接模式:resolv.conf指向
/run/systemd/resolve/resolv.conf,包含上游DNS服务器 - 静态模式:删除符号链接,手动维护resolv.conf
推荐使用stub模式,让systemd-resolved统一管理,配置在/etc/systemd/resolved.conf中:
[Resolve] DNS=114.114.114.114 223.5.5.5 FallbackDNS=8.8.8.8 Domains=~. #LLMNR=no #MulticastDNS=no #DNSSEC=no #DNSOverTLS=no
最佳实践与注意事项
- 始终配置多个DNS服务器:避免单点故障。建议组合使用:本地DNS + 国内公共DNS + 国际公共DNS
- 控制nameserver数量:最多3个,超过的会被忽略。不是越多越好
- 优先使用离用户近的DNS:国内服务器优先用114、阿里、腾讯DNS,海外服务器可以用Google、Cloudflare DNS
- 谨慎使用search指令:search列表过长会拖慢短主机名解析。生产环境建议留空或只保留一个域名
- 注意文件权限:resolv.conf应该权限为644(rw-r--r--),归属root用户
- 虚拟机克隆后检查:克隆的虚拟机可能携带原机的DNS配置,需要更新
- 容器环境的DNS:Docker容器的resolv.conf由Docker daemon管理,不要在容器内直接修改
相关文章
版权声明
本文仅代表个人观点。
本文系AI辅助作者原创,未经许可,转载请保留原文链接。

发表评论