命令行参数
tcpdump [ -adeflnNOpqStvx ] [ -c 数量 ] [ -F 文件名 ]
[ -i 网络接口 ] [ -r 文件名] [ -s snaplen ]
[ -T 类型 ] [ -w 文件名 ] [表达式 ]
-n: 不把网络地址转换成名字
-a: 将网络地址和广播地址转变成名字;
-e: 在输出行打印出数据链路层的头部信息;
-t: 在输出的每一行不打印时间戳;
-v: 输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息;
-vv:输出详细的报文信息;
-c: 在收到指定的包的数目后,tcpdump就会停止;
-F: 从指定的文件中读取表达式,忽略其它的表达式;
-i: 指定监听的网络接口;
-r: 从指定的文件中读取包(这些包一般通过-w选项产生);
-w: 直接将包写入文件中,并不分析和打印出来;
-s: 指定数据报的大小(默认68个byte)##########################抓包时每次都要设置这个参数,-s 65500 不然wireshark解析的包会太小
表达式
tcpdump利用它作为过滤报文的条件,如果一个报文满足表
达式的条件,则这个报文将会被捕获。如果没有给出任何条件,
则网络上所有的信息包将会被截获。
1. 类型关键字
host: 指定主机
net: 指定网络地址
port: 指定端口号
默认类型为host
2. 方向关键字
src: 指定源
dst: 指定目的
src or dst
src and dst
默认为src or dst
3. 协议关键字
包括fddi,ip ,arp,rarp,tcp,udp等类型
4. 逻辑运算
取非运算是 'not ' '!'
与运算是'and','&&'
或运算 是'or' ,'||';
示例
1. 截获所有135.252.142.150 的主机收到的和发出的所有的数据包
tcpdump host 135.252.142.150 -i eth0
2. 获取主机135.252.33.186除了和主机135.252.142.150之外所有
主机通信的ip包,使用命令
tcpdump ip host 210.27.48.1 and ! 210.27.48.2
3. 获取主机135.252.33.186接收或发出的telnet包
tcpdump tcp port 23 host 135.252.142.150
4. 获取主机135.252.142.121端口5060上的所有数据报
tcpdump port 5060 and host 135.252.142.121
5. 获取主机135.252.142.150所有udp数据报
tcpdump udp and host 135.252.142.150
or:
tcpdump ip proto \\udp and host 135.252.142.150
6. 获取主机和135.252.142.150的源端口为5060, 目的端口为
45413的数据报
tcpdump src port 5060 and dst port 45413 and host 135.252.142.150
7. 打印所有包含数据的数据报, 就是说除了SYN, ACk和Fin的数据报
tcpdump 'tcp port 80 and
(((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
8. 打印所有经过网关135.252.33.1长度大于576的数据报
tcpdump 'gateway snup and ip[2:2] > 576'
ip[2:2]: 从第二个byte开始的两个byte.
实现
tcpdump |------------------------------------------ | | | +-------+ | |tcp/udp| | +-------+ | | | +--------+ | |IP stack|+------------+ +--------+| Filter | |+------------+ +------------+ | BPF driver |-------------| eth driver | +------------+ packet recv +------------+
-----------------------------------------------------
note: 如果linux(或unix)没装xwindow, 可以考虑用tcpdump, 如果这个协议tcpdump不支持, 可以使用tcpdump抓包, 使用wireshare(或者ethereal)来看所抓的数据包