nmcli本身不支持直接配置dns超时和重试参数,需通过禁用networkmanager自动写入resolv.conf并手动添加options行,或启用dnsmasq插件实现;两种方式均能有效控制timeout和attempts行为。

nmcli 本身不支持直接配置 DNS 的超时时间(timeout)或重试次数(attempts)这类 resolver 行为参数。
这些选项属于底层 DNS 解析器(glibc 的 /etc/resolv.conf 机制)控制范围,而 nmcli 管理的是网络连接层的 DNS 服务器地址(即 nameserver 行),不是解析行为策略。
但你可以通过组合方式实现目标:用 nmcli 设置 DNS 服务器 → 再配合 NetworkManager 的插件或手动接管 /etc/resolv.conf,注入自定义 options 行。以下是具体可行路径:
确认 NetworkManager 是否管理 DNS
执行以下命令判断: ```bash systemctl is-active NetworkManager grep -i "nameserver" /etc/resolv.conf | head -1 ``` 若输出含 `Generated by NetworkManager`,说明 DNS 由它动态写入,此时直接改 `/etc/resolv.conf` 会被覆盖。方法一:禁用 NetworkManager 自动写入 resolv.conf(推荐)
让 NetworkManager 停止管理 DNS,你才能安全添加 `options timeout:2 attempts:2` 这类行:-
创建配置文件禁止覆盖:
sudo tee /etc/NetworkManager/conf.d/99-no-resolv-conf.conf
-
重启 NetworkManager:
sudo systemctl restart NetworkManager
-
手动编辑
/etc/resolv.conf(现在不会被覆盖):sudo tee /etc/resolv.conf <p>✅ <code>timeout:2</code> 表示每次查询最多等待 2 秒;<code>attempts:2</code> 表示最多重试 2 次;<code>rotate</code> 启用轮询多个 nameserver。</p>
方法二:使用 dnsmasq 插件(高级但持久)
NetworkManager 可调用 `dnsmasq` 作为本地 DNS 缓存,并在其配置中指定超时与重试:-
安装并启用插件:
sudo yum install -y dnsmasq # RHEL/CentOS # 或 sudo apt install -y dnsmasq # Debian/Ubuntu
-
配置 NetworkManager 使用 dnsmasq:
sudo tee /etc/NetworkManager/conf.d/10-dnsmasq.conf
-
编辑 dnsmasq 配置(生效超时/重试):
echo "timeout=2" | sudo tee -a /etc/dnsmasq.conf echo "retries=2" | sudo tee -a /etc/dnsmasq.conf
-
重启服务:
sudo systemctl restart NetworkManager
此时所有 DNS 请求经由本地 dnsmasq 转发,
timeout和retries由它控制,且对应用透明。
验证是否生效
- 查看最终 `/etc/resolv.conf` 是否含 `options` 行(方法一)或指向 `127.0.0.1`(方法二); - 测试解析行为: ```bash strace -e trace=sendto,recvfrom -s 200 getent hosts example.com 2>&1 | grep -A2 "sendto.*53" ``` 或用 `time dig +short google.com @223.5.5.5` 观察响应延迟是否受控。不复杂但容易忽略。











