在本实验中,我们仔细观察 DNS 的客户端(DNS 是用于将因特网主机名转换为 IP 地址的协议)。 2.4节讲过,在 DNS 中客户角色是相当简单的:客户向它的本地 DNS 服务器发送一个请求,并接收返回的响应。在此过程中发生的很多事情均不为 DNS 客户所见,如等级结构的 DNS 服务器互相通信递归地或迭代地解析该客户的 DNS 请求。然而,从 DNS 客户的角度而言,该协议是相当简单的,即向本地 DNS 服务器发送一个请求,从该服务器接收一个响应。在本实验中我们观察运转中的 DNS。
如同所有的 Wireshark 实验一样,在本书的 Web 站点 http://www.awl.com/kurose-ross 可以找到本实验的完整描述。
在开始本实验之前,您可能需要阅读书中的第2.5节来了解DNS。另外,您可能需要查看关于本地 DNS 服务器,DNS 缓存,DNS 记录和消息,以及 DNS 记录中的 TYPE 字段的资料。
一、nslookup
在本实验中,我们将大量使用_nslookup_
工具,这个工具在现在的大多数 Linux/Unix 和 Microsoft 平台中都有。要在 Linux/Unix 中运行_nslookup_
,您只需在命令行中键入_nslookup_
命令即可。要在Windows中运行,请打开命令提示符并在命令行上运行_nslookup_
。
在这是最基本的操作,_nslookup_
工具允许主机查询任何指定的 DNS 服务器的 DNS 记录。DNS 服务器可以是根DNS 服务器,顶级域 DNS 服务器,权威 DNS 服务器或中间 DNS 服务器(有关这些术语的定义,请参阅书本)。要完成此任务,_nslookup_
将 DNS 查询发送到指定的 DNS 服务器,然后接收 DNS 回复,并显示结果。
上面的屏幕截图显示了三个不同_nslookup_
命令的结果(显示在Windows命令提示符中)。在此示例中,客户端主机位于布鲁克林理工大学校园,默认本地 DNS 服务器为 dns-prime.poly.edu。运行nslookup
时,如果没有指定 DNS 服务器,则_nslookup_
会将查询发送到默认的 DNS 服务器(在这种情况下为 dnsprime.poly.edu)。
🍤 来看第一个命令:
nslookup www.mit.edu
说这个命令是说,请告诉我主机 www.mit.edu 的 IP 地址。如屏幕截图所示,此命令的响应提供两条信息:(1)提供响应的 DNS 服务器的名称和IP地址;(2)响应本身,即 www.mit.edu 的主机名和IP地址。虽然响应来自理工大学的本地 DNS 服务器,但本地 DNS 服务器很可能会迭代地联系其他几个 DNS 服务器来获得结果,如书中第2.4节所述。
🍤 现在来看第二个命令:
nslookup -type=NS mit.edu
在这个例子中,我们添加了选项 “-type=NS” 和域名 “mit.edu”。这将使得_nslookup_
将 NS 记录发送到默认的本地 DNS 服务器。换句话说,“请给我发送mit.edu的权威DNS的主机名” (当不使用 -type 选项时,_nslookup_
使用默认值,即查询 A 类记录。)上述屏幕截图中,首先显示了提供响应的 DNS 服务器(这是默认本地 DNS 服务器)以及三个 MIT 域名服务器。这些服务器中的每一个确实都是麻省理工学院校园主机的权威 DNS 服务器。然而,_nslookup_
也表明该响应是非权威的,这意味着这个响应来自某个服务器的缓存,而不是来自权威 MIT DNS 服务器。最后,响应结果还显示了麻省理工学院权威 DNS 服务器的IP地址。 (即使_nslookup_
生成的 NS 类型查询没有明确要求 IP 地址,本地 DNS 服务器依然”免费“返回了这些信息,然后被_nslookup_
显示出来。)
🍤 最后来看第三个命令:
nslookup www.aiit.or.kr bitsy.mit.edu
在这个例子中,我们希望将查询请求发送到 DNS 服务器 bitsy.mit.edu ,而不是默认的 DNS 服务器(dns-prime.poly.edu)。因此,查询和响应事务直接发生在我们的主机和 bitsy.mit.edu 之间。在这个例子中,DNS 服务器 bitsy.mit.edu 提供主机 www.aiit.or.kr 的IP地址,它是高级信息技术研究所(韩国)的Web服务器。
🍤 现在我们了解了一些示例,您现在可能想知道_nslookup_
命令的一般语法。语法是:
nslookup -option1 -option2 host-to-find dns-server
一般来说,_nslookup_
可以不添加选项,或者添加一两个甚至更多选项。正如我们在上面的示例中看到的,dns-server 也是可选的;如果这项没有提供,查询将发送到默认的本地 DNS 服务器。
现在我们提供了总览了_nslookup_
,现在是你自己驾驭它的时候了。执行以下操作(并记下结果):
- 运行
_nslookup_
以获取一个亚洲的Web服务器的 IP 地址。该服务器的IP地址是什么? - 运行
_nslookup_
来确定一个欧洲的大学的权威 DNS 服务器。 - 运行
_nslookup_
,使用问题 2 中一个已获得的 DNS 服务器,来查询 Yahoo! 邮箱的邮件服务器。它的 IP 地址是什么?二、ipconfig
_ipconfig_
(对于 Windows)和_ifconfig_
(对于 Linux / Unix)是主机中最实用的程序,尤其是用于调试网络问题时。这里我们只讨论_ipconfig_
,尽管 Linux / Unix 的_ifconfig_
与其非常相似。_ipconfig_
可用于显示您当前的 TCP/IP 信息,包括您的地址,DNS 服务器地址,适配器类型等。例如,您只需进入命令提示符,输入
所有关于您的主机信息都类似如下面的屏幕截图所显示。ipconfig /all
_ipconfig_
对于管理主机中存储的 DNS 信息也非常有用。在第2.5节中,我们了解到主机可以缓存最近获得的 DNS 记录。要查看这些缓存记录,在 C:> 提示符后输入以下命令:
每个条目显示剩余的生存时间(TTL)(秒)。要清除缓存,请输入ipconfig /displaydns
清除了所有条目并从hosts文件重新加载条目。ipconfig /flushdns
三、使用Wireshark追踪DNS
现在,我们熟悉nslookup
和ipconfig
,我们准备好了一些正经的事情。首先让我们捕获一些由常规上网活动生成的 DNS 数据包。
- 使用
_ipconfig_
清空主机中的 DNS 缓存。 - 打开浏览器并清空浏览器缓存。 (若使用 Internet Explorer,转到工具菜单并选择 Internet 选项;然后在常规选项卡中选择删除文件。)
- 打开 Wireshark,然后在过滤器中输入
ip.addr==your_IP_address
,您可以先使用_ipconfig_
获取你的 IP地址。此过滤器将删除既从你主机不发出也不发往你主机的所有数据包。 - 在 Wireshark 中启动数据包捕获。
- 使用浏览器访问网页: http://www.ietf.org
- 停止数据包捕获。
如果您无法在你的网络连接上运行 Wireshark,则可以下载一个捕获了数据包的文件,这个文件是本书作者在自己计算机上 按照上述步骤捕获的(原文注:Download the zip file http://gaia.cs.umass.edu/wireshark-labs/wireshark-traces.zip and extract the file dnsethereal-trace-1. The traces in this zip file were collected by Wireshark running on one of the author’s computers, while performing the steps indicated in the Wireshark lab. Once you have downloaded the trace, you can load it into Wireshark and view the trace using the File pull down menu, choosing Open, and then selecting the dns-ethereal-trace-1 trace file. )。回答下列问题。您应该在解答中尽可能展示你使用了哪些你捕获到的数据包,并注释出来(原文注:What do we mean by “annotate”? If you hand in a paper copy, please highlight where in the printout you’ve found the answer and add some text (preferably with a colored pen) noting what you found in what you ‘ve highlight. If you hand in an electronic copy, it would be great if you could also highlight and annotate. )。
若要打印数据包,请使用文件->打印,只勾选仅选中分组和概要行,并选中你所需要用于解答问题的数据包。
- 找到 DNS 查询和响应消息。它们是否通过 UDP 或 TCP 发送?
- DNS 查询消息的目标端口是什么? DNS 响应消息的源端口是什么?
- DNS 查询消息发送到哪个IP地址?使用
ipconfig
来确定本地 DNS 服务器的 IP 地址。这两个 IP 地址是否相同? - 检查 DNS 查询消息。DNS 查询是什么 “Type” 的?查询消息是否包含任何 “answers”?
- 检查 DNS 响应消息。提供了多少个 “answers”?这些答案具体包含什么?
- 考虑从您主机发送的后续 TCP SYN 数据包。 SYN 数据包的目的IP地址是否与 DNS 响应消息中提供的任何 IP地址相对应?
- 这个网页包含一些图片。在获取每个图片前,您的主机是否都发出了新的 DNS 查询?
现在让我们玩玩_nslookup_
(原文注:If you are unable to run Wireshark and capture a trace file, use the trace file dns-ethereal-trace-2 in the zip file http://gaia.cs.umass.edu/wireshark-labs/wireshark-traces.zip )。
- 启动数据包捕获。
- 使用
nslookup
查询 www.mit.edu - 停止数据包捕获。
我们从上面的屏幕截图看到,_nslookup_
实际上发送了三个 DNS 查询,并收到了三个 DNS 响应。只考虑本次实验相关结果,在回答以下问题时,请忽略前两组查询/响应,因为_nslookup_
的一些特殊性,这些查询通常不是由标准网络应用程序生成的。您应该专注于最后一个查询和响应消息。
- DNS 查询消息的目标端口是什么? DNS 响应消息的源端口是什么?
- DNS 查询消息的目标 IP 地址是什么?这是你的默认本地 DNS 服务器的 IP 地址吗?
- 检查 DNS 查询消息。DNS 查询是什么 “Type” 的?查询消息是否包含任何 “answers”?
- 检查 DNS 响应消息。提供了多少个 “answers”?这些答案包含什么?
- 提供屏幕截图。
现在重复上一个实验,但换成以下命令:
nslookup -type=NS mit.edu
回答下列问题:
- DNS 查询消息发送到的 IP 地址是什么?这是您的默认本地 DNS 服务器的 IP 地址吗?
- 检查 DNS 查询消息。DNS 查询是什么 “Type” 的?查询消息是否包含任何 “answers”?
- 检查 DNS 响应消息。响应消息提供的 MIT 域名服务器是什么?此响应消息还提供了 MIT 域名服务器的 IP 地址吗?
- 提供屏幕截图。
现在重复上一个实验,但换成以下命令:
nslookup www.aiit.or.kr bitsy.mit.edu
回答下列问题:
- DNS 查询消息发送到的 IP 地址是什么?这是您的默认本地 DNS 服务器的 IP 地址吗?如果不是,这个 IP 地址是什么?
- 检查 DNS 查询消息。DNS 查询是什么 “Type” 的?查询消息是否包含任何 “answers”?
- 检查 DNS 响应消息。提供了多少个 “answers”?这些答案包含什么?
- 提供屏幕截图。