[Wireshark Lab v8.1] Lab:DNS
[Wireshark Lab v8.1] Lab 翻译与解题.
以下实验步骤均来自实验指导手册。
实验指导手册下载地址:Jim Kurose Homepage (umass.edu)
Lab DNS
在图书的2.4章讲到了 Domain Name System(DNS)协议, 它将域名解析为 IP 地址, 在因特网技术设施上扮演了关键性角色. 在本次实验中, 我们将从客户端对DNS进行更进一步探讨. 回想一下,客户端在 DNS 中的角色相对简单——客户端向其本地 DNS 服务器发送查询,并收到回复。 正如教科书中的图 2.19 和 2.20 所示,很多事情都在“幕后”进行,DNS 客户端不可见,因为分层 DNS 服务器相互通信以递归或迭代地解析客户端的 DNS 查询。 然而,从 DNS 客户端的角度来看,该协议非常简单——向本地 DNS 服务器制定查询并从该服务器接收响应。
在进行本次实验之前, 你应该需要重新回顾第 2.4章关于DNS的内容. 具体的, 需要回顾本地DNS服务器,DNS缓存,DNS记录和消息和消息中的类型域.
1. nslookup
让我们通过使用nslookup
命令开始我们对 DNS 的学习,该命令将调用底层 DNS 服务来实现其功能。nslookup
命令在大多数 Microsoft、Apple IOS 和 Linux 操作系统中都可用。 要运行nslookup
,您只需操作系统对应的终端窗口键入nslookup
命令。
在其最基本的操作中,nslookup
允许运行它的主机查询任何指定的 DNS 服务器以获取 DNS 记录。被查询的DNS服务器可以是根DNS服务器、顶级域名(TLD)DNS服务器、权威DNS服务器或中间DNS服务器(这些术语的定义见教科书)。例如,nslookup
可用于检索将主机名(例如 www.nyu.edu)映射到其 IP 地址的“Type=A”DNS 记录。为完成此任务,nslookup
向指定的 DNS 服务器(或如果未指定特定的 DNS 服务器, 则是运行nslookup
的主机的默认本地 DNS 服务器)发送 DNS 查询,从该 DNS 服务器接收 DNS 响应,然后显示结果。
让我们来试试nslookup
吧!我们将首先在位于马萨诸塞大学 (UMass) 校园计算机科学系的 newworld.cs.umass.edu 主机上的 Linux 命令行上运行nslookup
,其中本地名称服务器名为 primo.cs.umass.edu (其 IP 地址为 128.119.240.1).
在这个例子中, nslookup 带有一个指定主机名(www.nyu.edu)的参数. 因此命令的含义为“请告诉我主机www.nyu.edu的IP地址”. 如图中所显示的那样, 命令的响应携带了两部分信息 1. 给出相应的 DNS 服务器的 IP 地址, 在这个例子中是 UMass 的本地 DNS 服务器, 2. 解析出来的 DNS 记录, www.nyu.edu 典型的主机名和IP地址, 你可能注意到了有两个主机名到IP的映射. 第一个(216.165.47.12)是在IPv4地址下的点十分制表示, 第二个)(2607:f600:1002:6113::100)是一个更长更复杂的IPv6地址. 我们将在第四章学习到 IPv4 和 IPv6 与它们不同的地址表示法, 现在我们主要关注更常见的 IPv4 就好.
尽管响应结果是来自于UMass本地DNS服务器(128.119.240.1), 但也很有可能经过了由书中2.4节描述的中间DNS服务器迭代访问的过程.
通过-type=A
参数可以指定类型服务器的响应, 比如-type=NS
它将返回一个权威的(authoritative)DNS服务器的主机名和IP地址, 该DNS服务器知道如何在权威服务器域名下获取指定主机的IP地址.
在图2所示的例子中, 我们对nslookup
命令使用了-type=NS
和nyu.edu
选项, 这会导致 nslookup 向默认的本地 DNS 服务器发送对类型 NS 记录的查询。换句话说,查询是说,“请将 nyu.edu 的权威 DNS 的主机名发送给我”。(当不使用-type选项时,nslookup使用默认值,即查询A类记录。)上面截图中显示的答案首先表示提供答案的DNS服务器(这是默认的本地UMass DNS 服务器,地址为 128.119.240.1) 以及三个 NYU DNS 名称服务器。这些服务器中的每一个确实是纽约大学校园主机的权威 DNS 服务器。但是,nslookup 也表明答案是“非权威的”,这意味着该答案来自某个服务器的缓存,而不是来自权威的 NYU DNS 服务器。最后,答案还包括纽约大学权威 DNS 服务器的 IP 地址。 (即使 nslookup 生成的 type-NS 查询没有明确要求 IP 地址,本地 DNS 服务器也“自动”返回这些,并且由nslookup
显示结果。)
nslookup
还有很多额外的选项, 10个最著名的nslookup用法 和 man页面
之后, 我们有时可能会对ip地址绑定的域名感兴趣, nslookup
也支持这种被叫做反向DSN查找
的操作, 如图3, 将IP地址作为nslookup
的参数, 就会返会它对应的主机名.
现在我们对nslookup
有了一个基本的了解, 是时候在自己的设备上尝试一下了.
- 运行
nslookup
来获得 Indian Institute of Technology in Bombay, India: www.iitb.ac.in. web server 的IP地址. - 查询提供问题1答案的DNS服务器的IP地址.
- 问题1的答案是来自一个权威服务器还是非权威服务器?
- 使用
nslookup
来获取权威的iit.ac.in域名下的name server. 它的主机名是什么?(如果有多个, 请回答第一个) 如果你需要找权威 name server的IP地址, 应该怎么做?
2. 你电脑上的 DNS 缓存
根据书本上的对迭代和递归DNS查询解析的描述(图2.19和图2.20), 你可能会认为本地 DNS 服务器必须在每次应用需要主机名到IP地址的转换时都需要进行一次DNS查询. 但实际上并不会这样.
大多数主机(你的个人计算机)保存一个最近获取到的DNS记录的缓存(有时被叫做DNS解析缓存
), 就类似Web服务器保存它们获取到HTTP响应的缓存一样. 当DNS服务被唤起, 会首先检查是否命中本地的DNS缓存, 如果命中, 则不需要与本地DNS服务器进行通信, 而是直接应用缓存记录. 不过一条DNS记录最终会超时, 从而被移除, 同样本地DNS服务器(图2.19,2.20)的缓存记录也会超时.
你可以主动清空本地的DNS还蠢, 这样做是无害的, 它只意味着你的电脑当需要DNS记录时会重新唤起分布式的DNS服务, 因为它不能重用本地缓存了. Mac可以通过一下命令来清空缓存 sudo killall -HUP mDNSResponder
, windows下使用 ipconfig /flushdns
, Linux下可以用 sudo systemd-resolve --flush-caches
.
3. 通过 Wireshark 追踪 NDS
现在我们已经熟悉了nslookup
和清空了DNS解析缓存, 可以开始重点: 捕获由真实Web浏览所产生的DNS消息.
- 如上面描述的那样, 清空主机上的DNS缓存
- 打开Web浏览器,并禁用缓存
- 打开Wireshark, 并在过滤器中输入
ip.addr == <your IP address>
, 这样 wireshark 就会只展示你的主机所发起或接收的报文. - 开始抓包
- 在浏览器输入 http://gaia.cs.umass.edu/kurose_ross/
- 停止抓包
请回答如下问题:
- 选中第一条解析主机名 gaia.cs.umass.edu 的DNS查询信息, 它的报文编号是多少? 是使用UDP还是TCP?
- 现在选中第一条DNS查询的响应, 它的报文编号是多少? 是使用UDP还是TCP?
- DNS 查询报文的目的端口是多少? 响应报文的源端口?
- DNS 查询报文发送的目的IP?
- 选中DNS查询报文, DNS报文中包含了多少“问题”? 又包含了多少“答案”?
- 选中DNS响应报文, DNS报文中包含了多少“问题”? 又包含了多少“答案”?
- http://gaia.cs.umass.edu/kurose_ross/ 网页的主页文件包含了图片对象 http://gaia.cs.umass.edu/kurose_ross/header_graphic_book_8E_2.jpg, 它与网页在同一域名下, 对于网页文件的请求报文编号是多少? 用于解析 gaia.cs.umass.edu 以便可以将初始 HTTP 请求发送到 gaia.cs.umass.edu IP 地址的 DNS 查询跟踪中的数据包编号是多少? 收到DNS响应的报文编号是多少? 发起图片请求对应的报文编号是多少? 解析 gaia.cs.umass.edu 以便可以将第二个 HTTP 请求发送到 gaia.cs.umass.edu IP 地址的 DNS 查询中的数据包编号是多少? 讨论下DNS缓存会如何影响这个问题.
解答:
有一个奇怪的点是, 使用chromium内核的浏览器, 就算清空了DNS缓存, 也看不到 gaia.cs.umass.edu 的 DNS 请求, 我怀疑是QUIC的问题, 因此使用Safari来请求就可以看到DNS报文了
- DNS使用UDP, 我的请求报文编号是:147
- 响应报文同样是UDP, 编号是148, 应该是路由器的DNS服务器将其缓存了
- DNS端口为53
- 目的IP就是本地路由IP
- DNS报文中包含了1个问题, 0个答案
- 包含1个问题, 1个答案, DNS报文的问题通常只有一个, 一个问题可以有很多答案, 问题长度, 回答长度都是有两个字节编码, 因此最多为16^4-1, 响应报文时, 会讲原问题带上, 回答只需要用两个字节标记对应那个问题就行.
- 在解析到服务器对应IP地址后, 浏览器还需进行TCP三次握手才能与服务器发送HTTP请求, 这里的问题和5有点重复, 但其实第一个请求的DNS查询信息类型是HTTPS的, 因此前面的回答要改一下, 不过真正启动HTTP请求的DNS还是类型为A的. 后面关于图片依赖的DNS请求我还是挺困惑的, 因为我的trace里就只有一次对主机的DNS请求, 猜测是默认第二次图片请求前也需要发DNS, 但被浏览器或本地DNS缓存优化掉了.
现在让我们来实验nslookup
, 对nslookup www.cs.umass.edu
抓包
你应该能获得一个类似的结果, 让我们打开第一个A查询(报文编号是19, 并且在信息栏里有 A 信息)
- DNS查询的目的端口和DNS响应的源端口是多少?
- DNS查询发送的目的IP是什么? 这是你本地默认DNS服务器的地址么?
- 检查DNS查询报文, 它的“Type”是什么? 查询报文包含任何”答案“么?
- 检查DNS响应报文, 包含了多少“问题”, 多少“答案”?
最后, 让我们使用nslookup
来查询“NS”类型的记录. 输入命令nslookup -type=NS umass.edu
, 回答下列问题
- DNS查询发送的目的IP是什么? 这是你本地默认DNS服务器的地址么?
- 检查DNS查询报文, 包含了多少”问题“? 查询报文包含任何”答案“么?
- 检查DNS响应报文, 包含了多少“答案”? 答案中包含了什么信息? 返回了多少”额外资源“记录? 这些额外资源记录包含了什么信息?
这些内容相对简单, DNS报文详细格式可以查看这篇文章对照.