Linux DNS客户端超时与重试由/etc/resolv.conf的options行(如timeout:2 attempts:3)控制,作用于glibc解析器;若启用systemd-resolved,需改配/etc/systemd/resolved.conf中的TimeoutSec等参数。

Linux 中 DNS 客户端的超时与重试行为由 /etc/resolv.conf 中的 options 行控制,不依赖外部服务或守护进程,直接作用于 glibc 解析器(如 getaddrinfo())。
在 /etc/resolv.conf 中设置 timeout 和 attempts
编辑 /etc/resolv.conf(需 root 权限),在任意位置添加或修改 options 行:
-
timeout:N:单次 DNS 查询等待响应的秒数,N 为整数(常见值 1–5),默认通常为 5 秒 -
attempts:N:对每个 nameserver 尝试查询的次数,默认通常为 2 次
示例配置:
nameserver 8.8.8.8nameserver 114.114.114.114
options timeout:2 attempts:3
注意配置是否实际生效
很多现代发行版(如 Ubuntu 20.04+、CentOS 8+、Fedora)默认启用 systemd-resolved,此时 /etc/resolv.conf 往往是符号链接,指向 /run/systemd/resolve/stub-resolv.conf 或 /run/systemd/resolve/resolv.conf。直接编辑该文件会被覆盖。
- 先确认:运行
ls -l /etc/resolv.conf,若输出含->,说明是软链 - 若使用
systemd-resolved,应改配/etc/systemd/resolved.conf,在[Resolve]段下添加:
DNS=8.8.8.8 114.114.114.114
DNSSEC=no
Cache=yes
TimeoutSec=2
RetryIntervalSec=1
然后执行 sudo systemctl restart systemd-resolved 生效。其中 TimeoutSec 控制单次查询超时,RetryIntervalSec 影响重试间隔(非重试次数),重试总次数仍由客户端应用逻辑决定,但 systemd-resolved 默认尝试 3 次。
验证当前生效的解析参数
无法仅靠查看文件判断最终行为,建议实测:
- 用
strace -e trace=connect,sendto,recvfrom nslookup example.com 2>&1 | grep -A2 "sendto.*53"观察实际发出请求与等待时间 - 用
systemd-resolve --status(若启用 resolved)查看 Global DNS Servers 及 TimeoutSec 值 - 临时测试:在
/etc/resolv.conf中写入nameserver 127.0.0.1并停掉本地 DNS 服务,观察time ping -c1 example.com的失败延迟是否符合 timeout × attempts
影响范围与限制
这些设置只影响通过 libc 解析器发起的标准 DNS 查询(如 ping、curl、wget、大多数 shell 工具),但:
- 不控制
nslookup、dig等调试工具——它们自带超时逻辑(如dig +timeout=1) - 不改变
/etc/hosts查找行为(它不走 DNS) - 不干预浏览器内置 DNS 缓存或 DoH/DoT 设置(如 Chrome 的安全 DNS)











