现在的位置: 首页 > 综合 > 正文

linux下网络抓包命令tcpdump的使用

2013年12月02日 ⁄ 综合 ⁄ 共 4000字 ⁄ 字号 评论关闭

linux下网络抓包命令tcpdump的使用

例:
tcpdupm host 172.16.29.40 and port 4600 -X -s 500 -l -nn | teel data.txt //用管道或重定向可以将数据保存到文件
tcpdump采用命令行方式,它的命令格式为:
tcpdump [-nn] [-i 接口] [-w 储存档名] [-c 次数] [-Ae] [-qX] [-r 文件] [所欲捕获的数据内容]
参数:
-nn   直接以 IP 及 Port Number 显示,而非主机名与服务名称。
-i   后面接要「监听」的网络接口,例如 eth0, lo, ppp0 等等的接口。
-w   如果你要将监听所得的数据包数据储存下来,用这个参数就对了。后面接文件名。
-c   监听的数据包数,如果没有这个参数, tcpdump 会持续不断的监听,直到用户输入 [ctrl]-c 为止。
-A   数据包的内容以 ASCII 显示,通常用来捉取 WWW 的网页数据包资料。
-e   使用资料连接层 (OSI 第二层) 的 MAC 数据包数据来显示。
-q   仅列出较为简短的数据包信息,每一行的内容比较精简。
-X   可以列出十六进制 (hex) 以及 ASCII 的数据包内容,对于监听数据包内容很有用。
-r   从后面接的文件将数据包数据读出来。那个「文件」是已经存在的文件,并且这个「文件」是由 -w 所制作出来的。
所欲捕获的数据内容:我们可以专门针对某些通信协议或者是 IP 来源进行数据包捕获。

     那就可以简化输出的结果,并取得最有用的信息。常见的表示方法有。
     'host foo', 'host 127.0.0.1' :针对单台主机来进行数据包捕获。
     'net 192.168' :针对某个网段来进行数据包的捕获。
     'src host 127.0.0.1' 'dst net 192.168':同时加上来源(src)或目标(dst)限制。
     'tcp port 21':还可以针对通信协议检测,如tcp、udp、arp、ether 等。
     除了这三种类型的关键字之外,其他重要的关键字如下:gateway, broadcast,less,
greater,还有三种逻辑运算,取非运算是 'not ' '! ', 与运算是'and','&&';或运算 是'o
r' ,'||';

范例一:以 IP 与 Port Number 捉下 eth0 这个网卡上的数据包,持续 3 秒
[root@linux ~]# tcpdump -i eth0 -nn
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
01:33:40.41 IP 192.168.1.100.22 > 192.168.1.11.1190: P 116:232(116) ack 1 win
9648
01:33:40.41 IP 192.168.1.100.22 > 192.168.1.11.1190: P 232:364(132) ack 1 win
9648
<==按下 [ctrl]-c 之后结束
6680 packets captured              <==捉取下来的数据包数量
14250 packets received by filter   <==由过滤所得的总数据包数量
7512 packets dropped by kernel     <==被核心所丢弃的数据包

至于那个在范例一所产生的输出中,我们可以大概区分为几个字段,现以范例一当中那行特殊字体行来说明一下:
· 01:33:40.41:这个是此数据包被捕获的时间,“时:分:秒”的单位。
· IP:通过的通信协议是IP。
· 192.168.1.100.22>:传送端是192.168.1.100这个IP,而传送的Port Number为22,那个大于(>)的符号指的是数据包的传输方向。
· 192.168.1.11.1190:接收端的IP是192.168.1.11,且该主机开启port 1190来接收。
· P 116:232(116):这个数据包带有PUSH的数据传输标志,且传输的数据为整体数据的116~232 Byte,所以这个数据包带有116 Bytes的数据量。
· ack 1 win 9648:ACK与Window size的相关资料。
最简单的说法,就是该数据包是由192.168.1.100传到192.168.1.11,通过的port是由22到1190,且带有116 Bytes的数据量,使用的是PUSH的标记,而不是SYN之类的主动联机标志。

接下来,在一个网络状态很忙的主机上面,你想要取得某台主机对你联机的数据包数据时,使用tcpdump配合管线命令与正则表达式也可以,不过,毕竟不好捕获。我们可以通过tcpdump的表达式功能,就能够轻易地将所需要的数据独立的取出来。在上面的范例一当中,我们仅针对eth0做监听,所以整个eth0接口上面的数据都会被显示到屏幕上,但这样不好分析,可以简化吗?例如,只取出port 21的联机数据包,可以这样做:

[root@linux ~]# tcpdump -i eth0 -nn port 21tcpdump: verbose output suppressed, use -v or -vv for full protocol decodelistening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes01:54:37.96 IP 192.168.1.11.1240 > 192.168.1.100.21:. ack 1 win 6553501:54:37.96 IP 192.168.1.100.21 > 192.168.1.11.1240:P 1:21(20) ack 1 win 584001:54:38.12 IP 192.168.1.11.1240 > 192.168.1.100.21:. ack 21 win 6551501:54:42.79 IP 192.168.1.11.1240 > 192.168.1.100.21:P 1:17(16) ack 21 win 6551501:54:42.79 IP 192.168.1.100.21 > 192.168.1.11.1240: . ack 17 win 584001:54:42.79 IP 192.168.1.100.21 > 192.168.1.11.1240: P 21:55(34) ack 17 win 5840
看!这样就仅取出port 21的信息,如果仔细看的话,你会发现数据包的传递都是双向的,Client端发出请求而Server端则予以响应,所以,当然是有去有回了。而我们也就可以经过这个数据包的流向来了解到数据包运动的过程了。例如:
· 我们先在一个终端机窗口输入“tcpdump-i lo-nn”的监听。
· 再另开一个终端机窗口来对本机(127.0.0.1)登录“ssh localhost”,那么输出的结果会是如何?
[root@linux ~]# tcpdump -i lo -nn 1 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode 2 listening on lo, link-type EN10MB (Ethernet), capture size 96 bytes 3 11:02:54.253777 IP 127.0.0.1.32936 > 127.0.0.1.22: S 933696132:933696132(0)    win 32767  4 11:02:54.253831 IP 127.0.0.1.22 > 127.0.0.1.32936: S 920046702:920046702(0)    ack 933696133 win 32767  5 11:02:54.253871 IP 127.0.0.1.32936 > 127.0.0.1.22: . ack 1 win 8192  6 11:02:54.272124 IP 127.0.0.1.22 > 127.0.0.1.32936: P 1:23(22) ack 1 win 8192     7 11:02:54.272375 IP 127.0.0.1.32936 > 127.0.0.1.22: . ack 23 win 8192
代码显示的头两行是tcpdump的基本说明,然后:
· 第3行显示的是来自Client端带有SYN主动联机的数据包。
· 第4行显示的是来自Server端,除了响应Client端之外(ACK),还带有SYN主动联机的标志。
· 第5行则显示Client端响应Server确定联机建立(ACK)。
· 第6行以后则开始进入数据传输的步骤。
从第3~5行的流程来看,熟不熟悉啊?没错。那就是3次握手的基础流程,有趣吧。不过tcpdump之所以被称为黑客软件之一远不止上面介绍的功能。上面介绍的功能可以用来作为我们主机的数据包联机与传输的流程分析,这将有助于我们了解到数据包的运作,同时了解到主机的防火墙设置规则是否有需要修订的地方。

还有更神奇的用法。当我们使用tcpdump在Router上面监听明文的传输数据时,例如FTP传输协议,你觉得会发生什么问题呢?我们先在主机端执行"tcpdump -i lo port 21 -nn –X",然后再以FTP登录本机,并输入账号与密码,结果你就可以发现该FTP软件使用的是 vsFTPd,并且用户输入dmtsai这个账号名称,且密码是mypasswordisyou。如果使用的是明文方式来传输你的网络数据呢?

另外你得了解,为了让网络接口可以让tcpdump监听,所以执行tcpdump时网络接口会启动在“混杂模式(promiscuous)”,所以你会在 /var/log/messages里面看到很多的警告信息,通知你说你的网卡被设置成为混杂模式。别担心,那是正常的。至于更多的应用,请参考man tcpdump了。

 

抱歉!评论已关闭.