Linux /etc/resolv.conf 配置文件详解
在 Linux 系统中,
/etc/resolv.conf是 DNS 解析的核心配置文件,用于定义系统如何通过域名解析服务器(DNS)将域名转换为 IP 地址。
文件结构
/etc/resolv.conf 是一个纯文本文件,包含以下主要配置项(每行一个指令):
nameserver 8.8.8.8
nameserver 223.5.5.5
nameserver 2001:4860:4860::8888
search example.com mydomain.org
options timeout:2 attempts:3 rotate下面介绍核心配置项
nameserver
- 作用:指定 DNS 服务器的 IP 地址(IPv4 或 IPv6)
- 规则:
- 最多可配置 3 个
nameserver,系统按顺序尝试查询 - 若第一个无响应,自动切换到下一个
- 最多可配置 3 个
- 示例
nameserver 8.8.8.8 # Google 公共 DNS
nameserver 1.1.1.1 # Cloudflare DNSsearch
- 作用:定义域名搜索列表。当输入不完整的域名(如
ping server)时,系统会自动尝试附加搜索域 - 规则:
- 最多支持 6 个搜索域,总长度不超过 256 字符
- 按顺序尝试,直到解析成功
- 示例:
search example.com internal.org- 输入
ping web会依次尝试解析:web.example.com->web.internal.org
domain
- 作用:指定本地主机的默认域名(旧版配置,通常被
search替代) - 注意:若同时配置
domain和search,search会覆盖domain
options
- 作用:设置 DNS 解析的全局选项,控制超时、重试、轮询等行为
- 常用选项:
| 选项 | 说明 |
|---|---|
timeout:N |
每次 DNS 查询的超时时间(秒,默认 5) |
attempts:N |
失败后的重试次数(默认 2) |
rotate |
启用 DNS 服务器轮询(默认按顺序使用) |
ndots:N |
域名中点的数量阈值,决定是否优先尝试绝对域名(默认 1) |
use-vc |
强制使用 TCP 而非 UDP 进行解析查询 |
edns0 |
启用 EDNS0 扩展协议(支持更大的 DNS 数据包) |
- 示例:
options timeout:3 attempts:2 rotateRES_OPTIONS 环境变量
options参数可以通过RES_OPTIONS环境变量配置(如在程序中指定,参考)- 示例
RES_OPTIONS="rotate timeout:1 retries:1" - 作用范围:仅对当前 Shell 或子进程生效,若需全局生效,可写入
~/.bashrc或/etc/profile - 兼容性:不同 Linux 发行版或 glibc 版本可能支持的选项略有差异,建议通过
man resolv.conf确认本地支持的参数
- 示例
RES_OPTIONS是通过 GNU C 库(glibc) 实现的,影响所有使用 glibc 解析 DNS 的应用程序(如curl、wget、ping等)RES_OPTIONS的默认行为通常由/etc/resolv.conf控制,但通过该环境变量可以临时覆盖全局配置。例如:/etc/resolv.conf中设置了 DNS 服务器列表和默认选项RES_OPTIONS可在此基础上追加或覆盖参数
# 增加重试次数或超时时间
export RES_OPTIONS="attempts:5 timeout:30"
# 强制使用 TCP 协议,适用于某些防火墙限制 UDP 流量的环境
export RES_OPTIONS="use-vc"
# 轮询 DNS 服务器
export RES_OPTIONS="rotate"
# 优化复杂域名解析,调整 `ndots` 减少不必要的搜索域查询
export RES_OPTIONS="ndots:3"
# 设置 DNS 查询超时 2 秒,重试 4 次,启用轮询和 TCP
export RES_OPTIONS="timeout:2 attempts:4 rotate use-vc"
# 测试配置是否生效
curl https://example.com
# 若 DNS 解析缓慢或失败,可通过以下命令测试
# 查看当前 DNS 配置
cat /etc/resolv.conf
# 设置 RES_OPTIONS 后测试解析
export RES_OPTIONS="attempts:3 timeout:1"
getent hosts example.com动态生成机制
在某些系统中,/etc/resolv.conf 可能由网络管理工具动态生成(如 NetworkManager、systemd-resolved 或 DHCP 客户端)。常见情况:
- NetworkManager
- 默认会覆盖此文件,需通过以下方式禁用:
# 在 /etc/NetworkManager/conf.d/ 中创建配置文件:
[main]
dns=none- systemd-resolved
- 使用
systemd-resolved服务时,实际配置由/etc/systemd/resolved.conf控制,/etc/resolv.conf可能是指向/run/systemd/resolve/stub-resolv.conf的符号链接 - 若需手动管理,可删除符号链接并创建静态文件:
rm /etc/resolv.conf
vim /etc/resolv.conf # 手动写入配置静态配置示例
# /etc/resolv.conf
nameserver 8.8.8.8
nameserver 1.1.1.1
search example.com
options timeout:2 attempts:3 rotate验证配置
- 检查 DNS 解析
nslookup google.com # 使用默认 DNS
dig @8.8.8.8 google.com # 指定 DNS 服务器- 查看实际生效的配置
cat /etc/resolv.conf常见问题
- 权限:文件所有者应为
root,权限为644 - 临时修改:直接编辑文件会立即生效,但重启网络服务后可能被覆盖
- 容器环境:在 Docker/Kubernetes 中,容器的
/etc/resolv.conf通常由宿主机或编排工具管理
通过合理配置 /etc/resolv.conf,可以显著优化 DNS 解析性能并解决网络连接问题
配置不生效
- 原因:文件被网络管理工具覆盖
- 解决:禁用自动生成或配置网络管理工具(如 NetworkManager)
DNS 解析缓慢
- 优化:
- 减少
nameserver数量(仅保留响应最快的) - 调整
options timeout和attempts - 启用
rotate轮询多个 DNS 服务器
- 减少
IPv6 解析问题
- 禁用 IPv6 DNS:移除 IPv6 的
nameserver行 - 完全禁用 IPv6:在
/etc/sysctl.conf中添加:
net.ipv6.conf.all.disable_ipv6 = 1