解决网络连通性问题

LinuxBeginner
立即练习

介绍

网络连接是任何现代计算环境的基本方面。虽然很多事情可能会出错,但最常见的问题之一是域名系统(DNS)解析失败。DNS 是一种将人类友好的域名(如 www.google.com)转换为计算机用于相互连接的 IP 地址的服务。如果 DNS 无法正常工作,你可能已连接到互联网,但仍然无法访问任何网站。

本实验提供了一种结构化的、动手实践的方法来诊断和解决与 DNS 相关的网络问题。你将学习一系列命令来测试你的连接、识别 DNS 问题、更正配置并确认你的连接已完全恢复。

完成本实验后,你将掌握一套可靠的初始故障排除步骤清单,用于解决 Linux 系统上的 DNS 连接挑战。

这是一个实验(Guided Lab),提供逐步指导来帮助你学习和实践。请仔细按照说明完成每个步骤,获得实际操作经验。根据历史数据,这是一个 初级 级别的实验,完成率为 100%。获得了学习者 100% 的好评率。

通过 Ping 域名来确认问题

在进行故障排除时,第一步始终是确认问题。测试互联网连接的一种常见方法是使用 ping 命令。我们尝试 ping 一个著名的域名 google.com。我们将使用 -c 4 选项,只发送四个数据包。

在你的终端中执行以下命令:

ping -c 4 google.com

你将看到一条指示名称解析失败的错误消息。

ping: google.com: Temporary failure in name resolution

此错误告诉我们系统无法将域名 google.com 转换为 IP 地址。这强烈表明 DNS 存在问题。

通过 Ping IP 地址来隔离问题

我们怀疑存在 DNS 问题,但需要确认我们的基本互联网连接仍然正常工作。我们可以通过直接 Ping 一个公共 IP 地址来做到这一点,这会绕过 DNS 名称解析过程。我们将使用 Google 的公共 DNS 服务器 IP 地址 8.8.8.8

运行以下命令:

ping -c 4 8.8.8.8

这次,ping 应该会成功。你将看到来自服务器的回复。

PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=116 time=1.23 ms
64 bytes from 8.8.8.8: icmp_seq=2 ttl=116 time=1.28 ms
64 bytes from 8.8.8.8: icmp_seq=3 ttl=116 time=1.30 ms
64 bytes from 8.8.8.8: icmp_seq=4 ttl=116 time=1.25 ms

--- 8.8.8.8 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
rtt min/avg/max/mdev = 1.230/1.265/1.301/0.026 ms

由于我们可以 Ping IP 地址但不能 Ping 域名,我们现在已经确认问题出在 DNS 解析上。

检查并更正 DNS 设置

既然我们已经知道问题出在 DNS 上,让我们来看看 DNS 配置文件。在 Linux 上,这通常是 /etc/resolv.conf。该文件告诉系统应使用哪些 DNS 服务器。

查看其内容:

cat /etc/resolv.conf

输出将显示我们的设置脚本配置的 nameserver。

nameserver 192.0.2.1

IP 地址 192.0.2.1 保留用于文档和测试目的;它不指向真实的 DNS 服务器。这就是我们问题的根源。

要修复此问题,我们需要用一个有效的 nameserver 替换不正确的 nameserver。我们将使用 Google 的公共 DNS 服务器 8.8.8.8。我们可以使用 echotee 命令覆盖该文件。这需要 sudo 权限。

echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf

现在,再次查看文件以确认更改。

cat /etc/resolv.conf

输出现在应该显示正确的 nameserver。

nameserver 8.8.8.8

配置了有效的 nameserver 后,我们就离解决问题更近了一步。

清除本地 DNS 缓存

你的系统会保留最近查询过的域名名称的临时缓存,以加快未来的请求速度。更改 DNS 设置后,最好清除此缓存,以确保系统立即使用新设置,而不是依赖旧的、可能不正确的缓存数据。

在现代 Linux 系统上,你可以使用 resolvectl 命令来管理 DNS 缓存,该命令是 systemd-resolved 的一部分。要清除缓存,请运行以下命令。它需要 sudo 权限。

sudo resolvectl flush-caches

如果成功,此命令不会产生任何输出。要验证缓存是否已清除,你可以使用 statistics 命令检查缓存统计信息。

resolvectl statistics

在输出中查找 Current Cache Size 这一行。清除缓存后,该值应为 0,确认缓存已被清空。请注意,像 Hits 和 Misses 这样的其他统计数据将保留其先前的值。

...
Cache
  Current Cache Size: 0
          Cache Hits: 24
        Cache Misses: 67
...

清除 DNS 缓存是确保你的系统没有使用陈旧 DNS 记录的重要步骤。

确认 DNS 解析和连通性

现在我们已经更正了 DNS 服务器配置并清除了本地缓存,是时候验证修复情况了。我们将重复第一步中先前失败的相同命令。

让我们再次尝试 ping google.com

ping -c 4 google.com

这次,该命令应该会成功。你将看到域名被解析为一个 IP 地址,并且你会收到来自服务器的回复。(注意:google.com 的确切 IP 地址可能会有所不同)。

PING google.com (142.250.189.238) 56(84) bytes of data.
64 bytes from nuq04s39-in-f14.1e100.net (142.250.189.238): icmp_seq=1 ttl=119 time=4.43 ms
64 bytes from nuq04s39-in-f14.1e100.net (142.250.189.238): icmp_seq=2 ttl=119 time=4.43 ms
64 bytes from nuq04s39-in-f14.1e100.net (142.250.189.238): icmp_seq=3 ttl=119 time=4.40 ms
64 bytes from nuq04s39-in-f14.1e100.net (142.250.189.238): icmp_seq=4 ttl=119 time=4.43 ms

--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 4.400/4.421/4.434/0.012 ms

成功了!你现在已经成功诊断并解决了 DNS 连通性问题。

总结

恭喜你完成了本次实验(Lab)!你已经成功地完成了一个在 Linux 系统上对常见 DNS 相关网络问题进行故障排除和解决的标准流程。

在本次实验中,你学会了如何:

  • 使用 ping 测试连通性,并区分是一般的网络故障还是特定于 DNS 的问题。
  • 检查 /etc/resolv.conf 中系统的 DNS 服务器配置。
  • 修正无效的 DNS 配置以恢复名称解析。
  • 使用 resolvectl flush-caches 清除本地 DNS 缓存中的陈旧条目。
  • 通过成功 ping 一个域名来确认修复是否生效。

这些基本技能为你解决许多常见的网络问题奠定了坚实的基础。将来每当你怀疑存在 DNS 问题时,都可以应用这种逻辑化的、分步进行的流程。