如何配置 NetworkManager 以不在基于 RHEL8 的发行版中设置默认搜索域?

如何配置 NetworkManager 以不在基于 RHEL8 的发行版中设置默认搜索域?

假设有一个名为 ens192 的主机,该主机具有单个 IPv4 连接,并且具有静态配置的网络设置(IP、DNS、网关),名为vm1.example.invalid。 NetworkManager 会将以下字符串添加到 /etc/resolv.conf:

search example.invalid

有时您不希望这样,或者希望用其他域名替换搜索域名。当您这样做时

nmcli connection modify ens192 ipv4.dns-search foo.invalid

/etc/resolv.conf 将包含

search foo.invalid example.invalid

问题是:

如何search example.invalid仅使用 NetworkManager 取消设置生成的 /etc/resolv.conf 中的默认值?

我尝试过的:

  1. 明确设置ipv4.dns-search,如上例所示,设置 ipv6.dns-search 失败this property is not allowed for 'method=ignore'。默认域search仍然附加到新的 dns-search。
  2. 使用 nm-tui 重新配置服务器
  3. 将搜索域设置为.不仅由于 p.1 而无用,而且还会被忽略源代码
  4. 从 /etc/resolv.conf 中删除有问题的域。重新启动 NetworkManager 后,它会重新生成
  5. 尝试使用网络脚本 - 但没有成功

解决方法:

在我的例子中,由于现有的 *.example.invalid wildcard A DNS 记录,此默认搜索域设置与不存在的域的解析以及ndots 5默认使用的 kubernetes 节点(相关openshift 的问题一篇文章),导致集群内的 DNS 中断。我求助于手动管理 /etc/resolv.conf,它由Redhat 文档,虽然它可以工作 - 但我想从一个明显的地方(NetworkManager)管理网络,并了解为什么要添加此默认记录?我尝试浏览 NM 源代码,但不是 C 程序员 - 没有找到设置此默认域的部分。

答案1

你可以在这里找到代码,这种行为是预料之中的

https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/blob/main/src/core/dns/nm-dns-manager.c

void
nm_dns_manager_set_hostname(NMDnsManager *self, const char *hostname, gboolean skip_update)
{
    NMDnsManagerPrivate *priv   = NM_DNS_MANAGER_GET_PRIVATE(self);
    const char          *domain = NULL;

    /* Certain hostnames we don't want to include in resolv.conf 'searches' */
    if (hostname && nm_utils_is_specific_hostname(hostname)
        && !NM_STR_HAS_SUFFIX(hostname, ".in-addr.arpa")
        && !nm_inet_is_valid(AF_UNSPEC, hostname)) {
        domain = strchr(hostname, '.');
        if (domain) {
            domain++;
            /* If the hostname is a FQDN ("dcbw.example.com"), then add
             * the domain part of it ("example.com") to the searches list,
             * to ensure that we can still resolve its non-FQ form
             * ("dcbw") too. (Also, if there are no other search domains
             * specified, this makes a good default.) However, if the
             * hostname is the top level of a domain (eg, "example.com"),
             * then use the hostname itself as the search (since the user
             * is unlikely to want "com" as a search domain).
             *
             * Because that logic only applies to public domains, the
             * "assume_any_tld_is_public" parameter is FALSE. For
             * example, it is likely that the user *does* want "local"
             * or "localdomain" as a search domain.
             */
            if (domain_is_valid(domain, TRUE, FALSE)) {
                /* pass */
            } else if (domain_is_valid(hostname, TRUE, FALSE)) {
                domain = hostname;
            }

            if (!nm_hostname_is_valid(domain, FALSE))
                domain = NULL;
        }
    }

    if (!nm_strdup_reset(&priv->hostdomain, domain))
        return;

    _LOGT("set host domain to %s%s%s", NM_PRINT_FMT_QUOTE_STRING(priv->hostdomain));

    if (skip_update)
        return;

    if (!priv->updates_queue) {
        gs_free_error GError *error = NULL;

        if (!update_dns(self, FALSE, FALSE, &error))
            _LOGW("could not commit DNS changes: %s", error->message);
    }
}

相关内容