如何在 NetworkManager 中设置单一请求选项?

如何在 NetworkManager 中设置单一请求选项?

在我们的环境中(许多 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它符号链接到该文件。

dispatch.d有关网络管理器文档中功能的更多信息。

答案4

以下答案适用于 Manjaro,也适用于主机上运行的容器(与我之前的答案不同)。这是 @carestad 答案的改编版本(谢谢!):

放入以下文件/etc/NetworkManager/dispatcher.d/999-resolv-options并将文件权限设置为700via 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

相关内容