在 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
,系统按顺序尝试查询
- 若第一个无响应,自动切换到下一个
- 示例
nameserver 8.8.8.8 # Google 公共 DNS
nameserver 1.1.1.1 # Cloudflare DNS
search
- 作用:定义域名搜索列表。当输入不完整的域名(如
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 rotate
RES_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 服务器
- 查看实际生效的配置
常见问题
- 权限:文件所有者应为
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