假设有一个名为 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 中的默认值?
我尝试过的:
- 明确设置
ipv4.dns-search
,如上例所示,设置 ipv6.dns-search 失败this property is not allowed for 'method=ignore'
。默认域search
仍然附加到新的 dns-search。 - 使用 nm-tui 重新配置服务器
- 将搜索域设置为
.
不仅由于 p.1 而无用,而且还会被忽略源代码 - 从 /etc/resolv.conf 中删除有问题的域。重新启动 NetworkManager 后,它会重新生成
- 尝试使用网络脚本 - 但没有成功
解决方法:
在我的例子中,由于现有的 *.example.invalid wildcard A DNS 记录,此默认搜索域设置与不存在的域的解析以及ndots 5
默认使用的 kubernetes 节点(相关openshift 的问题和一篇文章),导致集群内的 DNS 中断。我求助于手动管理 /etc/resolv.conf,它由Redhat 文档,虽然它可以工作 - 但我想从一个明显的地方(NetworkManager)管理网络,并了解为什么要添加此默认记录?我尝试浏览 NM 源代码,但不是 C 程序员 - 没有找到设置此默认域的部分。
答案1
你可以在这里找到代码,这种行为是预料之中的
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);
}
}