linux中修改dns超时与重试需编辑/etc/resolv.conf的options行,设timeout:n和attempts:n;但现代系统常由systemd-resolved等服务管理,此时应配置对应服务文件或停用服务后使用静态resolv.conf。

Linux 系统中修改 DNS 解析的超时与重试次数,是通过编辑 /etc/resolv.conf 文件中的 options 行实现的。该配置直接影响 getaddrinfo()、gethostbyname() 等系统调用的行为,对 curl、wget、ssh、自定义网络程序等所有依赖 libc DNS 解析的工具都生效。
直接在 /etc/resolv.conf 中设置 options
使用 root 权限编辑该文件:
sudo nano /etc/resolv.conf
在文件末尾(或已有 options 行处)添加或修改这一行:
options timeout:2 attempts:3
- timeout:N:单次 DNS 查询等待响应的秒数,默认为 5;设为 2 可加快失败判定,适合高延迟链路或快速降级场景
- attempts:N:对每个 nameserver 最多重试 N 次,默认为 2;设为 3 可提升弱网下的解析成功率
保存后立即生效,无需重启服务。可验证是否写入成功:
cat /etc/resolv.conf | grep options
注意 resolv.conf 是否被覆盖
很多现代发行版(如 Ubuntu 22.04+、CentOS 8+、Fedora)默认启用 systemd-resolved 或 NetworkManager,此时 /etc/resolv.conf 往往是符号链接,直接编辑会被自动还原。
确认方式:
ls -l /etc/resolv.conf
- 若显示指向
/run/systemd/resolve/stub-resolv.conf或/run/NetworkManager/no-stub-resolv.conf,说明受服务管理 - 此时应改配对应服务:例如编辑
/etc/systemd/resolved.conf,取消注释并修改:
[Resolve] DNS=8.8.8.8 114.114.114.114 # 注意:systemd-resolved 不支持直接设 timeout/attempts, # 它使用自己的参数:DNSOverTLS、Cache、FallbackDNS 等, # 超时逻辑由其内部实现控制(通常比 libc 更健壮)
然后重启服务:
sudo systemctl restart systemd-resolved
替代方案:绕过动态覆盖,强制使用静态配置
如果坚持用 libc 的 timeout/attempts 控制,且系统频繁覆盖 /etc/resolv.conf,可停用代理服务并重建静态文件:
- 停用并禁用
systemd-resolved:
sudo systemctl stop systemd-resolved sudo systemctl disable systemd-resolved
- 删除符号链接,新建真实文件:
sudo rm /etc/resolv.conf sudo tee /etc/resolv.conf <p><code>rotate</code> 是可选参数,让系统轮询多个 nameserver(而非始终只用第一个),配合 <code>attempts</code> 更有效。</p><h3>验证配置是否真正起作用</h3><p>仅看文件内容不够,需实测行为。可用以下方法验证:</p>
- 用
strace观察解析调用(较底层):
strace -e trace=sendto,recvfrom getent hosts www.example.com 2>&1 | grep -A2 -B2 "sendto.*53"
- 更实用的方法:人为制造 DNS 延迟,观察失败时间是否符合设定(例如设
timeout:1后,用time ping nonexistent.example应在约 1–3 秒内失败)
注意:某些程序(如 Firefox、Chrome)自带 DNS 解析器,不走系统配置;而 dig 和 nslookup 也不读 resolv.conf 的 options,它们有自己的命令行参数控制超时。











