今天因为工作需要在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