“(DNS)名称解析暂时失败”
背景:
我从事医疗保健安全工作,在美国各地的十几个客户机上拥有大约 125 台服务器。设备包括物理机和虚拟机、1u 机架服务器和小型设备。虽然我们最初使用的是 Ubuntu 16.04,但去年我们迁移到了 Ubuntu 20.04。
这些机器运行的是流行的开源 SIEM。它们在一个网络接口/适配器上使用管理接口,在第二个网络接口/适配器上使用端口镜像
此举中最大的变化之一是网络配置的变化,从使用 /etc/network 下的接口文件变为使用 Netplan 的 YAML 文件。作为一家小公司,只有我一个人维护服务器。如前所述,它们位于美国各地,因此由于地理位置的原因,我无法物理访问 80% 以上的服务器。我通过 Microsoft Azure 或 RDS 客户端 DWS 执行任何类型的维护和更新。在过去四年中,一切都进展得相对顺利。然而,最近我开始看到多个站点出现同样的问题。受影响的机器没有共同的基本特征:一些是在过去 30 天内制造的;其他机器已经安装到位并运行了一两年多,之前没有出现过问题。
问题:
最近很多机器都断网了,有些机器已经运行了一年多,没有出现任何问题,但是无法ping通外部IP地址,返回“名称解析暂时失败”的错误。 我浏览了几十篇讨论看似非常普遍的问题的帖子,并尝试实施常见的解决方案。但都没有奏效。 我记录了这些不同的解决方案及其结果,以及我认为可能相关的其他数据,希望有人可以建议我如何纠正这个错误。
净值/净值:
ping 8.8.8.8工作正常
平www.google.com返回“名称解析暂时失败”
我可以 ping 网关和本地资产
配置文件
enp1s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.171.18.6 netmask 255.255.255.0 broadcast 10.171.18.255
inet6 fe80::201:2eff:fea3:a56e prefixlen 64 scopeid 0x20<link>
ether 00:01:2e:a3:a5:6e txqueuelen 1000 (Ethernet)
RX packets 1040415 bytes 77072784 (77.0 MB)
RX errors 0 dropped 36599 overruns 0 frame 0
TX packets 1929257 bytes 81061339 (81.0 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
enp2s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.171.255.1 netmask 255.255.255.0 broadcast 10.171.255.255
inet6 fe80::201:2eff:fea3:a56f prefixlen 64 scopeid 0x20<link>
ether 00:01:2e:a3:a5:6f txqueuelen 1000 (Ethernet)
RX packets 4184943678 bytes 2571645450748 (2.5 TB)
RX errors 0 dropped 17 overruns 0 frame 0
TX packets 604 bytes 52418 (52.4 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
- 所有适配器均已启动并运行
- 所有适配器都反映正确的 IPv4 地址和网络掩码,与 netplan YAML 文件相对应(见下文)
- 这里一切看起来都很正常。第一个 (enp1s0) 适配器上的接收/传输流量符合预期,端口镜像 enp2s0 上的接收流量也符合预期。
/etc/netplan
drwxr-xr-x 2 root root 4096 Jul 7 11:48 .
drwxr-xr-x 146 root root 12288 Jun 29 13:44 ..
-rw-r--r-- 1 root root 330 May 19 17:47 01-static-ip.yaml
- 只有一个文件,即配置文件 01-static-ip.yaml
- 当前模式为 644
network:
version: 2
renderer: NetworkManager
ethernets:
enp1s0:
dhcp4: no
addresses:
- 10.171.18.6/24
nameservers:
addresses: [10.30.3.29, 10.30.3.30]
gateway4: 10.171.0.1
enp2s0:
dhcp4: no
addresses:
- 10.171.255.1/24
- 这是01-static-ip.yaml的内容
- 两个网络适配器的 IP 地址在 IFCONFIG(上图)中均正确显示,管理适配器的子网掩码 (/24 / 255.255.255.0) 也正确显示
/etc/网络
drwxr-xr-x 6 root root 4096 Jul 7 11:48 .
drwxr-xr-x 146 root root 12288 Jun 29 13:44 ..
drwxr-xr-x 2 root root 4096 May 19 14:56 if-down.d
drwxr-xr-x 2 root root 4096 May 19 14:56 if-post-down.d
drwxr-xr-x 2 root root 4096 May 19 14:56 if-pre-up.d
drwxr-xr-x 2 root root 4096 May 19 14:56 if-up.d
-rwxr-xr-x 1 root root 0 Jul 13 09:34 interfaces
- 我曾尝试使用 sudo touch interface 创建一个空的接口文件,也曾尝试过不使用任何接口文件
- 我知道从技术上讲,在 Ubuntu 20.04 下你仍然可以使用接口文件作为网络配置文件,但从 Ubuntu 18.04 开始,Netplan 是首选/推荐的网络配置方法。因此,我没有尝试在这里创建一个老式的接口文件并删除 Netplan YAML 文件
/etc/resolv.conf
nameserver 127.0.0.53
options edns0 trust-ad
- 我尝试在名称服务器 127.0.0.53 之前添加名称服务器 10.30.3.29
- 我尝试删除名称服务器 127.0.0.53 并只保留名称服务器 10.30.3.29
- 都不起作用
resolvectl 状态
Link 2 (enp1s0)
Current Scopes: DNS
DefaultRoute setting: yes
LLMNR setting: yes
MulticastDNS setting: no
DNSOverTLS setting: no
DNSSEC setting: no
DNSSEC supported: no
Current DNS Server: 10.30.3.29
DNS Servers: 10.30.3.29
10.30.3.30
DNS Domain: ~.
- 看来这里的 DNS 服务器配置正确...
/etc/systemd/resolved.conf
[Resolve]
#DNS=
#FallbackDNS=
#Domains=
#LLMNR=no
#MulticastDNS=no
#DNSSEC=no
#DNSOverTLS=no
#Cache=no-negative
#DNSStubListener=yes
#ReadEtcHosts=yes
- 最常见的解决方案似乎是取消此处第一行的注释并添加您的 DNS 名称服务器 - 但这并不能解决问题。
nmcli -f ipv4.addresses,ipv4.dns,ipv4.gateway,IP4.ADDRESS,IP4.DNS,IP4.GATEWAY con 显示 netplan-enp1s0
[NMCLI con show SPECIFIC]
ipv4.addresses: 10.171.18.6/24
ipv4.dns: 10.30.3.29,10.30.3.30
ipv4.gateway: 10.171.0.1
IP4.ADDRESS[1]: 10.171.18.6/24
IP4.DNS[1]: 10.30.3.29
IP4.DNS[2]: 10.30.3.30
IP4.GATEWAY: 10.171.0.1
- 再次确认所有网络信息正确无误
/usr/lib/NetworkManager/conf.d/10-globally-managed-devices.conf
[keyfile]
unmanaged-devices=*,except:type:wifi,except:type:gsm,except:type:cdma,except:type:ethernet
- 我以前遇到过问题,需要手动编辑此字段以包含“except:type:ethernet”,但这已经完成了
systemctl status 网络管理器
<warn> [1657208914.3825] ifupdown: interfaces file /etc/network/interfaces doesn't exist
- 这是在 /etc/network 中没有接口文件时生成的
- 正如前面提到的,我已经尝试过有和没有这个文件的情况
- 创建一个空的接口文件并重新加载 NetworkManager 后,这个问题就消失了
<warn> [1657208914.4014] Error: failed to open /run/network/ifstate
- 我以前也见过这个错误。通常可以通过编辑 10-globally-managed-devices.conf 来解决
<warn> [1657208914.3941] device (enp1s0): connectivity: "/proc/sys/net/ipv4/conf/enp1s0/rp_filter" is set to "1". This might break connectivity checking for IPv4 on this device
- 我以前也看到过这个错误,并尝试将该值编辑为 0。以前这种方法有效,但这里没有结果。
提前感谢您的时间和想法。我很乐意提供您想看到的任何附加信息!
答案1
Ubuntu 16.04 和 Ubuntu 20.04 之间的区别在于默认使用本地解析器 systemd-resolved。但是,在维护过程中,您注意到您已尝试在 resolve.conf 配置中禁用此解析器,只留下 10.xxx 服务器。这表明问题出在与 DNS 服务器的连接上,而不是 systemd-resolved 本身的问题。如果可能,您应该使用 Ubuntu 16.04 系统进行测试,以排除这是否实际上与客户端操作系统升级有关,或者是否发生了其他变化同时导致这些瞬时故障。
该tcpdump
工具可能对捕获 DNS 流量的网络跟踪很有用,可以查看协议级别发生的情况:tcpdump -i enp1s0 -n -s 1500 port 53
。如果您使用该-w
选项将此输出写入 pcap 文件,则可以使用诸如 之类的工具进行进一步分析ethereal
。