命令格式为: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 21

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes

01:54:37.96 IP 192.168.1.11.1240 > 192.168.1.100.21:. ack 1 win 65535

01:54:37.96 IP 192.168.1.100.21 > 192.168.1.11.1240:P 1:21(20) ack 1 win 5840

01:54:38.12 IP 192.168.1.11.1240 > 192.168.1.100.21:. ack 21 win 65515

01:54:42.79 IP 192.168.1.11.1240 > 192.168.1.100.21:P 1:17(16) ack 21 win 65515

01:54:42.79 IP 192.168.1.100.21 > 192.168.1.11.1240: . ack 17 win 5840

01: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登录本机,并输入账号与密码,结果你就可以发现如下的状况:

[root@linux ~]# tcpdump -i lo -nn -X 'port 21'

    0x0000:  4500 0048 2a28 4000 4006 1286 7f00 0001  E..H*(@.@.......

    0x0010:  7f00 0001 0015 80ab 8355 2149 835c d825  .........U!I.\.%

    0x0020:  8018 2000 fe3c 0000 0101 080a 0e2e 0b67  .....<.........g

    0x0030:  0e2e 0b61 3232 3020 2876 7346 5450 6420  ...a220.(vsFTPd.

    0x0040:  322e 302e 3129 0d0a                      2.0.1)..

    0x0000:  4510 0041 d34b 4000 4006 6959 7f00 0001  E..A.K@.@.iY....

    0x0010:  7f00 0001 80ab 0015 835c d825 8355 215d  .........\.%.U!]

    0x0020:  8018 2000 fe35 0000 0101 080a 0e2e 1b37  .....5.........7

    0x0030:  0e2e 0b67 5553 4552 2064 6d74 7361 690d  ...gUSER.dmtsai.

    0x0040:  0a                                       .

    0x0000:  4510 004a d34f 4000 4006 694c 7f00 0001  E..J.O@.@.iL....

    0x0010:  7f00 0001 80ab 0015 835c d832 8355 217f  .........\.2.U!.

    0x0020:  8018 2000 fe3e 0000 0101 080a 0e2e 3227  .....>........2'

    0x0030:  0e2e 1b38 5041 5353 206d 7970 6173 7377  ...8PASS.mypassw

    0x0040:  6f72 6469 7379 6f75 0d0a                 ordisyou..

上面的输出结果已经被简化过了,你需要自行在你的输出结果中搜索相关的字符串才行。从上面输出结果的特殊字体中,我们可以发现该FTP软件使用的是 vsFTPd,并且用户输入dmtsai这个账号名称,且密码是mypasswordisyou。如果使用的是明文方式来传输你的网络数据呢?

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

例题:如何使用tcpdump监听来自eth0适配卡且通信协议为port 22,目标来源为192.168.1.100的数据包资料?

答:tcpdump -i eth0 -nn port 22 and src host 192.168.1.100

例题:如何使用tcpdump抓取访问eth0适配卡且访问端口为tcp 9080?

答:tcpdump -i eth0 dst 172.168.70.35 and tcp port 9080

例题:如何使用tcpdump抓取与主机192.168.43.23或着与主机192.168.43.24通信报文,并且显示在控制台上

答:tcpdump -X -s 1024 -i eth0 host \(192.168.43.23 or 192.168.43.24\) and  host 172.16.70.35

注:必须指定网卡