网络工具

MIT电子工程与计算机科学系6.829 2002秋季 网络工具 2001年9月13日概述:在这个指南中,我们覆盖了网络研究中常用

MIT

电子工程与计算机科学系

6.829 2002秋季 网络工具 2001年9月13日

概述:在这个指南中,我们覆盖了网络研究中常用的工具(在现实中的调试使用的)。我们首先介绍netstat 和tcpdump ,通过观察一个活动的TCP 连接及其输出形式来简单介绍它们的使用。我们使用netstat 来描述TCP 状态机的细微之处。

其次,我们来看一组基于查找的工具,dig 和whois ,它们提供关于DNS 的主机信息,关于名字和网络的注册信息等。

接下来我们介绍网络的策略工具,ping 和更有趣的traceroute ,是如何工作的,以及它们能(不能)告诉你们什么。

最后,为那些不了解perl 的人讲解如何使用一个简单的perl 脚本将指定目的IP 地址和AS 的跟踪和计数字节信息绑定到一起。

1 Tcpdump 和netstat

tcpdump 是如何工作的呢?对于BSD 驱动的内核来说,由BPF (Berkeley Packet Filter)提供。这个过滤器将设备驱动器设置到混杂模式,从驱动器接收所有发送和接收的报文。然后这些报文通过用户定义的过滤器,这样只有用户感兴趣的报文才会送到用户进程处理。那么,为了小量的读取而进行的内核固定的截获行为的高代价是如何考虑呢?一个成批读取的timeout 值将解决这个问题。

过滤过程由内核实现。这限制了从内核拷贝到用户空间的数据总量。

下面是在我的机器上执行tcpdump host –I eth0 aros.ron.lcs.mit.edu port ssh 的输出结果。

© 2002 Nick Feamster 1

,

时间戳选项是如何工作的呢?例如,为什么不在一个报文中用当前发送时间来标志?(需要时钟同步)

信息包括如下格式:时间戳,源和目的(IP 地址和端口),TCP 标志,段信息(开始,结束,大小),应答,窗口尺寸,以及其它TCP 选项。“P ”标志表示将接收到的数据尽快“推”给应用。并且,注意以下过程释放一条连接:

tcp 0 0 ginseng.lcs.mit.ed:3524 aros.ron.lcs.mit.ed:ssh ESTABLISHED

tcp 0 0 ginseng.lcs.mit.ed:3524 aros.ron.lcs.mit.ed:ssh TIME_WAIT

可将状态传输图简单描述为TCP 行为的“规则集”。

为什么连接会进入time wait状态?注意这也被称为“2MSL ”(最大段生存期)状态。执行主动关闭连接的端点不知道最后的ACK 是否收到,因此它不知道另一端点关闭了连接。只因为FIN 的到达,我们还不能假定连接以及关闭 — 段有可能没有按顺序到达。

你能想到各种对TCP 的攻击吗?顺序号攻击是一个例子。SYN flood是另外一个。你如何防范SYN flood攻击呢?其中的一种策略是“SYN Cookies”,这种策略在三次握手协议执行完之前不会为一个连接设置状态(而不是——第一个SYN 到达就立即进入SYN 接收状态)。这在以后的讲义中会进行介绍。

2 查询工具:dig 和whois

dig 是一个DNS 查询工具。它与nslookup 类似,但功能更强大。你可以查询各种类型的记录。最常见(缺省)的是将DNS 名字映射到IP 地址的“A ”记录。

下面是我机器的查询输出结果。注意,是查询“A ” 记录。Dig 还会返回一些其它的有用信息。例如,返回lcs.mit.edu 的“NS ” 记录。NS 字段返回特定域的授权DNS 服务器。注意,我还获得了所有这些机器的“A ”记录。为什么每个域的结束位置都有一个点号?因为,这告诉你名字是完全资格的(试着在MIT 机器上查询ai vs.ai.)。

类似于“1800”的数字描述了本地DNS 服务器保留返回结果的时间。

说明当名字没有被解析时的输出时什么样子。说明相反的DNS 的同样情况,特别是资© 2002 Nick Feamster 2

,

格域名等。

你能看到的还有类似于CNAME 的类型。人们通常使用别名,或为同一个机器取不同的名字。这通过规范名字来实现,这在DNS 通过CNAME 记录来实现。如下所示: ;; ANSWER SECTION:

bgp.lcs.mit.edu. 1800 IN CNAME mit-network-monitor.lcs.mit.edu. mit-network-monitor.lcs.mit.edu 1800 IN A 18.31.0.51

可以使用dig 来查询特定域的邮件服务器。假如有人想发送邮件到feamster@lcs.mit.edu;他的邮件服务器如何获得相应的邮件服务器来将邮件传送到lcs.mit.edu ?这通过MX 记录来表示。例如,可通过输入dig lcs.mit.edu MX来查询这个记录。数字代表什么呢?表示一个邮件服务器的优先顺序。

© 2002 Nick Feamster 3

,

;; ANSWER SECTION:

lcs.mit.edu. 1800 IN MX 10 fedex.ai.mit.edu.

lcs.mit.edu. 1800 IN MX 1 mintaka.lcs.mit.edu.

你还可以使用dig 来来执行反向查找。dig –x是最简单的方式。Dig 也可用作批量模式。参加随机手册。

whois 是查询whois 机器的一种有效工具。有很多种类型的whois 服务器。其中之一是“nic ”服务器,常用来告诉你关于谁注册了特定的名字的信息。我机器上缺省的whois 服务器是whois.crsnic.net 。这个whois 服务器将执行来自负责注册该名字的whois 服务的查询。输出的摘录如下:

Whois 还可以用来查询地址注册,ARIN(North America),APNIC (Asia ),以及RIPE (Europe )。例如,我们希望知道关于地址18.31.0.38的更多信息:

© 2002 Nick Feamster 4

,

注意,数据库中的所有的日期都是最后修改日期,记录也是的最后修改时间。这就给你提供了信息的准确性。

whois 服务器除了可提供名字到管理域的解析,还可以帮助完成序号到管理域的映射。特别的,“序号”(例如IP 地址和AS 序号)由一些组织管理:

RIPE :Reseaux IP Europeans

ARIN : Internet序号在美洲的注册(包括非洲)

APNIC :亚太网络信息(包括澳洲)

如果我要了解在MIT 中IP 地址或者AS 序号的一些信息,我就要作为ARIN whois服务器(whois.arin.net )。ARIN whois服务器有很多选项来限制查询特定的记录类型。例如,我想查询“AS 701”:

© 2002 Nick Feamster 5

,

还支持在超网中的查询;APINIC (whois.apnic.net )和RIPE (whois.ripe.net )以相同的方式工作。我们如何发现一个特定网络或IP 地址的自治系统?还有另外一个称为RADB 的whois 数据库,它保持着最新的相关信息。注意,这是traceroute –A为AS 解析IP 地址的过程。

3 测量工具:ping 和traceroute

ping 是通过使用ICMP 的“回声请求Echo Request”信息,并等待ICMP 的“回声响应Echo Reply”的一个简单程序。它最基本的应用是检测一个特定主机是否有响应(因此可确定主机开机,并连接到网络)。Ping 还为每个请求/响应对显示一个RTT 值,和一个顺序号。Ping 还会给出丢失率的概要。注意:这个RTT 值并不准确,因为ICMP 不是在很多路由器的最快路径上。选项“f ”(flood ,有时需要根),“c ”(发送特定数量的报文),“s ”(指定报文的尺寸,有时对分段特别有用)。

试着发送一个巨大尺寸的ping 报文,使用tcpdump 观测IP ID。

Traceroute 是一个获得从一个主机看到的到特定目的的路径的工具。Traceroute 使用递增的TTL 值(实际上,每个TTL 值3次)发送IP 报文,并监听路径上每跳的ICMP 的“TIME EXCEEDED ”响应。Traceroute 需要注意以下问题:

每跳都指定一个接口(发送time-exceeded 消息),而不是主机或路由器。一条路径

在一个路由器上可能传输超过一跳。

© 2002 Nick Feamster 6

,

有可能time-exceeded 消息的源被设置为通向主机返回路径的输出接口的IP 地址,

而不是报文的到达接口。这会产生一些奇怪的结果。

traceroute 的错误不代表节点的错误。有可能是相反路径的错误,例如,“*”不代

表错误情况,必要的;这可能意味着,例如,路由器不响应ICMP 消息。

注意很多机器上的traceroute 的版本不支持选项“A ”。你可以通过澄清RPM 或恰当的已存在包,来手工来完成(如上所示);或者从http://nms.lcs.mit.edu/6.829/other/ traceroute-nanog.tar.gz 下载“Nanog Traceroute”,并在你机器上编译(注意traceroute 需要超级用户的权限执行,或者你必须设置为“setuid root”,否则你会得到权限的错误)。

4 Perl

在这个部分,我们介绍如何使用Perl (一个流行的脚本语言)来执行tcpdump 文件的分析工作:

计算从一个主机到另一个主机传输的字节数

画出应答的轨迹

注意下面的代码不是告诉你如何使用最基本的部分,例如对问题集非常有用的数字和hash 表。要理解这些基本信息(或者关于Perl 的更多信息),可参考一本非常好的书Larry Wall编写O’Reilly出版的Programming Perl,Perl 手册(在Unix 中输入“man perl”)也是非常好的参考。

下面的程序做了两件事情:它有一个统计tcpdump 跟踪信息(以tcptrace 跟踪文集的格式给出)字节数的函数,以及一个为tcpdump 跟踪信息产生“ACK trace”的函数。这两个函数带有教育的目的。这里我主要是告诉你们perl 的外观,以及在网络研究和分析中使用的基本要素。这不是语言的教材。

© 2002 Nick Feamster 7

,

© 2002 Nick Feamster 8

,

© 2002 Nick Feamster 9

,

calculate-byte 从routeviews 到ginseng 打印了(希望是正确的)一些字节的数量。Ack_trace函数生成如下图像(这是整个连接的完整ACK 轨迹的一个缩略):

为什么轨迹会是这样的呢? 因为我们是站在接收者的立场:发送者填满了拥塞窗口,我们按照窗口容纳报文的最大尺寸应答,然后过程自己重复。

© 2002 Nick Feamster 10

标签: