今天因为工作需要在linux下进行抓包;在这过程中使用tcpdump进行抓包,在这里记录我查找tcpdump资料和实验的详细操作,供以后翻阅;

 

默认直接启动tcpdump不加任何参数的将会监视第一个网卡上所有流过的数据包
#tcpdump
但这样很多对我们无用的数据包都会给显示出来,我们需要添加参数来过滤符合我们要求的数据包;
我们看一下tcpdump常用的参数
tcpdump [-aAdDeflLnNOpqRStuUvxX] [-c count] [ -C file_size ]
  [ -E algo:secret ] [ -F file ] [ -i interface ] [ -M secret ]
  [ -r file ] [ -s snaplen ] [ -T type ] [ -w file ]
  [ -W filecount ] [ expression ]

-c  指定抓包个数;   -c 10000
-C  抓包之前检查文件大小是否大于file_size,超过则打开一个新的文件;配合-W 使用
-W  配合-C使用,指定文件的数量限制
-F  从指定文件中获取表达式;忽略其他表达式
-i  指定网卡  -i eth0
-w  直接将包写入文件中,不分析和打印(通常都是.cap结尾文件)
-r  从指定文件中读取包(这些文件一般都是通过-w产生的.cap文件)
-x  从抓出的包中读取报文   tcpdump -x -r 1.cap 
-s  抓取报文长度,一般设置为0,即65535字节
-T  将监听的包直接解释为指定类型,常见类型rpc和snmp
-a   将网络地址和广播地址转变成名字;
-d   将匹配信息包的代码以人们能够理解的汇编格式给出;
-dd  将匹配信息包的代码以c语言程序段的格式给出;
-ddd  将匹配信息包的代码以十进制的形式给出;
-e   在输出行打印出数据链路层的头部信息;
-f   将外部的Internet地址以数字的形式打印出来;
-l   使标准输出变为缓冲行形式;
-n   不把网络地址转换成名字;
-t   在输出的每一行不打印时间戳;
-tt  打印一个未格式化的时间戳。
-ttt 以微妙打印时间戳
-tttt 打印详细的时间戳
-v   输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息;
-vv  输出详细的报文信息;

常见类型限定词【host port net】
host  用来指定主机或者目地地址   tcpdump host 192.168.5.2
port  用来指定端口         tcpdump port 9166
net   用来指定某一网段       tcpdump net 192.168.5.0/24

逻辑运算符
AND,OR和NOT. ()可将多个表达式组合起来.
监听192.168.1.10或192.168.1.11的80端口
tcpdump 'port 80 and (host 192.168.1.10 or host 192.168.1.11)'

传输方向限定词【src dst】
src  源地址    tcpdump src 192.168.1.10
dst  目地地址   tcpdump dst 192.168.1.11

协议限定词
用来捕获特定协议的数据包有: ether(Ethernet), TCP,UDP,ICMP,IP,ip6(IPv6),ARP,rarp(reverse ARP)等.

eg:下面是我使用的tcpdump抓包
tcpdump  -nn -i $eth dst $ip -w /tmp/zhuabao/zhuabao-$ip-${Date}.cap

通过awk来分析是那个长度的包最多并取出相应的端口,取前十
for i in `ls /tmp/zhuabao/zhuabao*.cap | tail -10`
do
 Length=`tcpdump -r $i | awk '{print $8}'| sort |uniq -c |sort -nr|head -n 1 |awk '{print $2}'`
 tcpdump -r $i | awk -v leng=${Length} '{if ($8==leng) print $0}' |awk '{print $5}'|awk -F '.' '{print $5}' |sort |uniq -c |sort -nr|head -n 10
done

可以用过-x参数来查看具体包的内容
tcpdump -x -r /tmp/zhuabao/zhuabao-192.168.5.10-20130809222003.cap


附:tcpdump抓包常用10个实例
1.针对特定网卡进行抓包(-i选项)
#使用tcodumo抓取所有经过网卡eth0的数据包
# tcpdump -i eth0

2.抓取指定数目的包(-c选项)
#抓取10000个数据包,默认tcpdump会一直抓包下去,直到我们使用ctrl+c结束
#tcpdump -c 10000 -i eth0

3.将抓的包写入文件中(-w选项)
#有时候需要分析包的内容,使用-w选项将包的内容输出到文件;  平常使用的>> 标准输出只是输出了数据包的记录没有包的内容
#tcpdump -c 10000 -i eth0 -w 20130609134523.cap

4.读取文件中的包内容(-r选项)
#讲写入文件中的包读出进行并进行分析,-r选项读取  -x 查看包的具体内容
#tcpdump -x -r 20130609134523.cap

5.抓包的时候不进行域名解析(-n选项)
#默认情况下tcpdump抓包将会进行域名解析;显示的是域名而非ip;使用-n选项显示IP
#tcpdump -i eth1 -n

6.抓包时增加详细的时间戳(-tttt 选项)
#tcpdump -tttt -i eth0

7.指定抓包协议
#只抓某种特定协议的包,tcpdump支持以下协议:ip,ip6,arp,tcp,udp,wlan
#tcpdump -i eth0 arp

8.对指定类型限定词进行抓包(port/host/net 类型限定词)
#tcpdump -i eth0 port 22

9.指定方向抓包(src/dst 方向限定词)
#抓取目标地址为192.168.1.10的数据包
#tcpdump dst 192.168.1.10

10.使用逻辑运算符连接多个条件抓包(and/or 逻辑运算符)
#tcpdump -i eth0 'port 80 and (dst 192.168.1.5 or net 172.16.0.1)' -tttt -c 1000 -w 1.cap