网络问题故障排除

作者:Mike Diehl

当我在之前的工作中在网络运营部门工作时,我们过去常常在客户打电话报告“互联网坏了”时窃笑。现在,我意识到有些本来很聪明的电脑用户不明白为什么这会让技术人员窃笑,我并不是想嘲笑他们。但是您必须知道,服务台收到此类故障报告的频率高于应有的频率。

我认识不少硬件技术人员或软件开发人员,他们在自己所做的事情上非常出色,但是他们对于如何诊断网络问题却一窍不通。对他们来说,互联网以及一般的网络就是“纯粹的魔法”。实际上,它确实是魔法,但这不是我们无法学会排除故障的魔法。那么,让我们开始吧。

通常,这些问题报告的出现是因为客户无法访问网站、电子邮件或打印机。在发出红色警报之前,您应该检查基本知识。“以前工作正常吗?” “您最近是否做了任何更改?” 作为技术人员,您应该检查电缆是否真的已插入;您会惊讶于这种情况发生的次数之多!因此,一旦您确认确实无法访问网络资源,乐趣就开始了。

我的第一反应是尝试 ping 提供我们尝试访问的服务的服务器。首先,尝试通过其完全限定的主机名 ping 它,例如 server.example.com。如果这不起作用,请尝试通过其 IP 地址 ping 它。如果这确实有效,则问题出在 DNS 上。域名服务 (DNS) 是一种网络服务,可将主机名解析为 IP 地址,反之亦然。在这种情况下,要么 DNS 服务器已关闭,要么客户端配置不正确。

如果您可以 ping 通服务器,但服务不可用,则网络连接存在,并且服务实际上已关闭。很多时候,您可以使用 telnet 命令确认这一点。对于侦听端口 80 的 Web 服务器,您可以简单地发出如下命令


telnet www.example.com 80

接下来您看到的内容将告诉您另一端的服务器运行状况如何。如果您看到超时错误消息,或者什么都没有,则意味着服务器要么已死机,要么负载过重而无法处理您的请求。这也可能表明防火墙正在阻止访问,但我们假设这以前工作正常,并且防火墙策略没有更改。您可能从 telnet 命令获得的另一个响应是连接被拒绝消息;这表明该服务已崩溃并且不再接受传入的连接请求。当然,您需要知道您尝试访问的服务的端口号。快速提醒一下,邮件通常在 25 端口。IMAP 在 143 端口。SSH 在 22 端口。安全 HTTP 在 443 端口。这些是常见的端口。无论如何,在这一点上,这不是网络问题;这是服务器问题。

但是,如果您甚至无法 ping 通服务器怎么办?现在看起来像是网络问题,但是问题出在哪里?一般来说,当面对这样的问题时,我通常喜欢将问题分成两半。因此,我做的第一件事是查看我是否至少可以 ping 通我的默认网关或路由器。通常,当我在电话中与客户一起排除故障时,这需要更多解释。他们总是不知道他们的默认网关是什么。要找出您的默认网关是什么,您必须在 Windows 中打开命令窗口或在 Linux 中打开 shell 窗口。有时,您必须指导客户完成此过程。

让我们首先处理 Windows 客户端。在 Windows 中,大多数 IP 配置信息都是使用 ipconfig /all 命令获得的。

从此命令的输出中,您应该首先看到客户端的 IP 地址。如果看不到,则客户端可能已丢失其 DHCP 租约,您应该尝试使用 ipconfig /renew 命令续订它。如果您没有运行 DHCP 并且您的客户没有 IP 地址,则需要进行桌面访问。否则,续订租约可能会解决问题。如果客户无法获得 DHCP 租约,则意味着与 DHCP 服务器的网络连接不起作用,或者 DHCP 服务器已关闭。通常,当 DHCP 服务器死机时,服务台的电话会因无法访问网络资源的人们而变得疯狂。

因此,在这一点上,我们的 Windows 客户端具有 IP 地址。我们需要记下默认网关,默认网关也由 ipconfig /all 命令显示。

在 Linux 客户端上,我们可以使用 ifconfig -a 命令获取 IP 地址。您只需挑选出正确的网络接口,看看它是否具有 IP 地址。如果没有,则适用前面关于 DHCP 的评论。如果您已确认您的 Linux 客户端具有 IP 地址,则需要找到默认网关。这可以通过发出 route -n command 来完成。

该输出看起来像这样


内核 IP 路由表
目标网关子网掩码标志跃点数引用使用接口
10.0.5.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
69.254.152.0 0.0.0.0 255.255.252.0 U 0 0 0 eth5
127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo
0.0.0.0 69.254.152.1 0.0.0.0 UG 0 0 0 eth5

您对“网关”列中的 IP 地址感兴趣,其中“目标”指示为 0.0.0.0,在本例中为 69.254.152.1。这是默认网关。

因此,我们现在拥有 Linux 或 Windows 客户端的默认网关。如果我们能够 ping 通默认网关,但仍然无法 ping 通我们尝试访问的网络资源,则我们可能遇到了真正的网络问题,需要报告。

在这一点上,我们已经发现问题出在我们的工作站和默认路由器之间的某个位置。

现在可能是简要讨论 IP 通信实际工作原理的好时机,因为这将有助于解释为什么了解默认路由如此重要。本质上,有两种情况。在一种情况下,两台机器想要相互通信并且位于同一网络上。在另一种情况下,两台机器想要通信,但它们位于不同的网络上。我们将很快讨论每种情况。但首先,重要的是要知道什么是“网络”。当然,互联网上的每台机器以及在家和工作中连接的每台机器都在“一个网络”上。但在这种情况下,我们所说的更恰当地应该被称为“本地网络”。本地网络是一组使用同一默认路由器的联网机器;就这么简单。现在,通过更改子网掩码,我们可以调整给定网络的大小,但默认路由器是本地网络之间的实际边界。

这给我们留下了前面提到的两种通信情况。让我们处理两台机器(例如 A 和 B)想要在同一本地网络上通信的情况。事实证明,在本地网络上,设备的 IP 地址并不像您想象的那么重要。如果设备 A 只知道设备 B 的 IP 地址,则它无法简单地向设备 B 发送网络数据包。因此,设备 A 大声喊出或广播:“设备 B 的 MAC 地址是什么?” 当设备 B 听到此请求时,该设备将广播返回:“设备 B 的 MAC 地址是...” 此过程称为“arping”,并使用地址解析协议 (ARP)。现在,设备 A 可以使用设备 B 的 IP 地址和 MAC 地址来寻址发送给设备 B 的网络数据包并发送它。当设备 A 发送此数据包时,本地网络上的每台机器都会收到该数据包,但只有 MAC 地址与该数据包寻址到的设备才会处理该数据包。

此 ARP 过程为我们提供了另一个诊断工具。所有联网设备都维护一个它们遇到的 IP 和 MAC 地址列表。这被称为 ARP 表,可以使用 arp -n 命令查看。首先,尝试 ping 通默认路由器和您知道可以正常工作的本地网络上的几台机器。然后,查看您是否在 ARP 表中找到任何条目,如下所示


# arp -n
地址硬件类型硬件地址标志掩码接口
10.0.1.51 ether 00:04:F2:12:78:77 C eth1
10.0.1.59 ether 00:1B:2F:34:6E:B7 C eth1
69.254.152.1 ether 00:1E:BE:FE:F8:05 C eth5
10.0.1.4 ether 00:0E:A6:87:BA:2B C eth1
10.0.1.200 (不完整) eth1

如您所见,我们有多个 IP 和 MAC 地址。请注意,最后一个条目是“不完整”。这意味着我尝试与该地址通信,但没有任何响应我的 ARP 请求。那台机器已关闭。另一方面,如果我们的 ARP 表为空,这将告诉我们,我们的计算机背面的网络端口与我们插入的交换机或集线器上的端口之间存在问题。在许多类似情况下,我们可以使用 mii-tools 命令来查看我们的网卡是否具有“链接”。如果没有,则我们遇到了电缆问题,或者交换机端口已被禁用。在极少数情况下,您发现您有链接但仍然无法通信,您可能遇到了硬件问题。

所以现在,让我们考虑一下我们的两个设备 A 和 B 位于不同本地网络上的情况。在这种情况下,这两个设备无法直接相互通信。因此,它们所做的是与它们的默认路由器通信,并基本上要求它将消息“中继”或“路由”到另一台设备。最终发生的事情是设备 A 将 arp 其默认路由器的 MAC 地址,并发送一个寻址到路由器 MAC 但设备 B IP 地址的数据包。路由器收到数据包,注意到它没有寻址到其 IP 地址之一,并将其转发到下一跳。每跳都使数据包更接近设备 B 的默认路由器。在这一端,设备 B 的路由器收到数据包,并注意到它寻址到其本地网络之一上的 IP 地址。因此,路由器 arp 设备 B 的 MAC 地址,并将数据包与设备 B 的 IP 地址和 MAC 地址一起发送到设备 B。现在,路由器如何知道如何路由数据包并将它们发送到目的地可能是一个复杂的主题,因此我在此不讨论它。

就是这样。我想我已经涵盖了人们遇到的大多数常见问题。当然,偶尔会出现更多深奥的情况。我希望通过一些常用的软件工具和对网络的一些基本了解,您可以诊断大多数网络问题,无论它们是在工作场所还是在家中。

加载 Disqus 评论