tcpdump 学习

Posted by jabin on April 7, 2016

概述

很经典的一句话:dump the traffic on a network.

一个简单的例子

[root@SWEBMYVMM001470 ~]# tcpdump -i eth1 -nn -X -c 1 'tcp and ip[2:2]<512'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture size 65535 bytes
        0x0000:  4500 00c9 35b1 4000 4006 cd12 0a7b 1012  E...5.@.@....{..
        0x0010:  0ad1 120e a3a4 1b9e c719 ce67 e5b2 c861  ...........g...a
        0x0020:  8018 009f 3827 0000 0101 080a 12a8 d00a  ....8'..........
        0x0030:  3eae 978a 1703 0100 90df 7a66 85b9 9143  >.........zf...C
        0x0040:  3153 7fd6 dc00 2450 b3c7 c661 d878 91cf  1S....$P...a.x..
        0x0050:  9c39 ab98 d2bb 59dd a309 ade1 b8e3 c554  .9....Y........T
        0x0060:  28d4 c64c 780e 6855 6ee7 ea09 1f65 04d8  (..Lx.hUn....e..
        0x0070:  d006 75d8 bdf1 c273 8ab5 5ab9 fc3e 1d15  ..u....s..Z..>..
        0x0080:  2773 fe82 5f13 0ebf dc56 fd87 1e9e b62d  's.._....V.....-
        0x0090:  8a22 e540 3487 480a c5d7 ef20 19ed 082f  ."[email protected]......../
        0x00a0:  d668 7c99 5f5a 6cbd 5092 4567 be3f c661  .h|._Zl.P.Eg.?.a
        0x00b0:  7121 e201 762e d6e5 59a4 14ab 47ef cafe  q!..v...Y...G...
        0x00c0:  fe62 4130 2979 0e98 8c                   .bA0)y...
1 packets captured
28 packets received by filter
0 packets dropped by kernel

要使用tcpdump,需要有root权限。 通常来讲,tcpdump可以分为三个部分:选项,过滤表达式,输出信息。

选项

man tcpdump下的OPTION可以查看支持的完整选项。常用的如下:

  • -i 指定监听的网卡
  • -nn 显示数字端口号,不进行转换(如:将端口21,转换为FTP)
  • -c 抓取的条数,例子中只抓取一条。
  • -X 输出信息中显示原始内容,即以16进制和ASCII码显示,这个有利于我们分析包的内容。
  • -w 将抓包的结果保存进文件中。一般可以用wireshark打开该文件,进行更好的分析。
  • -F 指定过滤表达式文本文件,这样我们就可以复用一些常见的过滤表达式。

过滤表达式

man pcap-filter可以查看详细的过滤条件。过滤条件分为三种类型:type(host,port..)、dir(src,dsc..)、proto(tcp,ip,udp..), 过滤表达式就是通过这三种类型的条件的组合,对检测的数据包进行过滤。 这里需要重点强调一个过滤表达式,即proto[exp:size], 这里exp表示对应协议的数据包的偏移量,size表示偏移量往后取多少字节。 例子中的tcp and ip[2:2]<512这个过滤表达式,是筛选出tcp协议,并且包的总长度小于512byte的包。

输出信息

19:39:21.725756: 时间 IP: 包的协议 Flags [P.]: 包标志。(P:传送数据;S:发起连接;F:关闭连接;a:确认包..) seq 3340357223:3340357372:ip包序列号 ack 3853699169: 对序列号为3853699169的包进行响应 win 159: 接收窗口的大小 options [nop,nop,TS val 313053194 ecr 1051629450], length 149: 包头的选项字段和数据包的长度

底下输出的16进制信息,对应Ip协议数据报头的相关选项。分析如下: 版本(【4】500)、首部长度(4【5】00)、IP包长度(00c9)、生存周期(【40】06)、协议类型(40【06】06–tcp ,ox11–udp)、源地址(0a7b 1012)、 目的地址(0ad1 120e)。 往后是TCP协议的包相关。

后记

写到这里,发现可以结束了。有了基本的认识,可能接下来就是根据后面的工作场景去写对应的过滤表达式和选用对应的选项。另外需要更系统地了解下TCP\IP\UDP等协议的数据报头长什么样子,各个选项占多少字节,这样就能更好地去写过滤表达式了。