在我们的环境中(许多 CentOS 7 VM),我们经常遇到经常讨论的问题,即名称服务查找会导致请求超时 5 秒延迟,即使是“成功”的请求也是如此。正如其他人尝试过的那样,我们禁用了 IPv6(未在我们的内部环境中使用),但这并没有完全解决问题。通过搜索论坛,我们发现建议将“options single-request”添加到 /etc/resolv.conf;这做似乎解决了这个问题,但是对 resolv.conf 的手动编辑经常会被 NetworkManager 覆盖。
我四处搜索,但似乎无法在 nmtui 或 nmcli 中找到指定此项的地方,以便 NetworkManager 知道在重写文件时包含该选项。
我是否遗漏了一些显而易见的东西?有没有办法在其他地方设置它?还有其他更好的解决方案吗?
答案1
我知道真实的解决方案是修复处理 DNS 请求的 AD 服务器(我的网络管理员正在恳求答案如何解决),但与此同时,我找到了一种解决方法。
在 /etc/sysconfig/network 中,添加以下行:
RES_OPTIONS="单一请求"
答案2
您应该可以添加
dns none
rc-manager unmanaged
到文件[main]
的部分/etc/networkManager/NetworkManager.conf
。这应该会阻止它覆盖您的解析器配置。您可以在系统上的 NetworkManager.conf 手册页中查看选项。
答案3
您可以将脚本添加到/etc/NetworkManager/dispatch.d/
文件夹中。
我有/etc/NetworkManager/dispatch.d/999-resolv-options
(确保它由root拥有,没有setuid并且chmod
'ed到700,根据文档):
#!/bin/bash
IFACE="$1"
ACTION="$2"
# Don't bother doing anything if action isn't "up"
if [ "$ACTION" != "up" ]; then
exit
fi
case "$IFACE" in
eth*|wlan*|en*)
grep -q "options timeout 1" /run/NetworkManager/resolv.conf &> /dev/null || echo "options timeout 1" >> /run/NetworkManager/resolv.conf
grep -q "options single-request" /run/NetworkManager/resolv.conf &> /dev/null || echo "options single-request" >> /run/NetworkManager/resolv.conf
;;
esac
如果您的网络接口名称以 或 以外的其他内容开头eth*
,en*
则wlan*
需要修改大小写
这将检查options timeout 1
和是否options single-request
存在,如果不存在,则将它们附加。
笔记:脚本附加到/run/NetworkManager/resolv.conf
而不是/etc/resolv.conf
。在我的 Ubuntu 18.10 安装程序中,/etc/resolv.conf
它符号链接到该文件。
答案4
以下答案适用于 Manjaro,也适用于主机上运行的容器(与我之前的答案不同)。这是 @carestad 答案的改编版本(谢谢!):
放入以下文件/etc/NetworkManager/dispatcher.d/999-resolv-options
并将文件权限设置为700
via chmod
;
#!/bin/bash
IFACE="$1"
ACTION="$2"
declare -A expectedActions=(
[dhcp4-change]=1 [dhcp6-change]=1 [up]=1
)
# Don't bother doing anything if action isn't "dhcp4-change" or "dhcp6-change"
if [[ -z "${expectedActions[$ACTION]}" ]]; then
exit
fi
case "$IFACE" in
eth*|wlan*|en*|wlp2s*)
grep -q "options single-request" /etc/resolv.conf &> /dev/null || echo "options single-request" >> /etc/resolv.conf
;;
esac
上一个答案:
可以RES_OPTIONS=single-request
在 中全局设置环境变量/etc/environment
。
注意:环境变量仅在主机上有效。容器中的进程也需要设置此环境变量。更好的解决方案仍然是设置选项,/etc/resolv.conf
因为容器运行时通常会/etc/resolv.conf
从主机继承:https://docs.docker.com/config/containers/container-networking/#dns-services