tcpdump 数据内容,tcpdump ip
基于ip统计流量的Tcpdump用例——-Wang VSA-博客公园
Tcpdump使用实例——统计基于ip的流量?Tcpdump-dump网络流量问题:基于ip的流量计数。
硬件:学校集群
困难:
1.使用高速网卡(千兆或IB)且网卡满载时的丢包率是多少?
2.程序的cpu利用率是多少?
3.日志文件太大
方案和分析:
1.抓包的方式有很多种,比如使用libpcap库,采用零拷贝方式,使用PF_RING接口,直接使用系统函数。
我看了一些文章,测试了netsniff-ng程序(基于零拷贝)。我觉得零拷贝的方式效率最高,丢包率最低。但是我.
测试tcpdump的时候发现它的效率也很高(测试的时候网卡几乎是满的),几乎没有丢包。因为使用方便等。
选择Tcpdump作为最终因素。
2.tcpdump捕捉数据包时cpu利用率约为4%。
3.tcpdump记录每个包,虽然我们可以限制每个包记录的字节数(-s选项),但是由于网卡已满,
所以包的数量特别多。如下所示,在60秒内捕获了748,168个数据包,导致pcap文件非常大。
?数据包数量:748168文件大小:58394582字节数据大小:3900660165字节捕获持续时间:59.963470秒。所以我用-G选项每分钟记录一个pcap文件,然后自己删除数据,最后删除pcap文件。也就是每一分钟。
按如下方式生成文件(时间间隔可以根据需要更改)
?12345678910111213141516171819202122232425文件名:/public/home/Wang VSA/software/TCP-audit/2012-07-16,12:54:54 . PCA文件封装:Ethernet数据包数量:748168文件大小:58394582字节数据大小:3900660165字节捕获10.10.61: 9090 10.10.10.49: 27884 tcp 17930。0.0.0:68 255 . 255 . 255 . 255:67 UDP 53110.10.49: - 10.10.10.62: - ICMP 23410。10.10.49: 22 10.10.10.61: 47051 tcp 11712410。10.10.48: 38906 10.10.10.49: 16797 t cp 4428897410。10.10.48: 64468 10.10.10.49: 45094 tcp 17110。10.10.61: 47051 10.10.10.49: 22 tcp 540610。10.10.49: 27884 10.10.10.61:90 9 TCP 211210 . 10 . 10 . 49:45094 10 . 10 . 48:64468 TCP 10810 . 10 . 10 . 62:-10 . 10 . 10 . 49:-icmp 23410 . 10 . 49
1.为pcap文件写一个统计脚本(如果需要高效率,可以写成C语言程序)。有两个文件tcp-audit.sh和
tcp-reduce.sh .Tcp-reduce.sh是在tcp-audit.sh中调用的,不要自己直接调用。
先看tcp-audit.sh。这个文件从ready.txt中读取内容,每一行都是要计数的pcap文件的文件名。后来,
讨论如何获取ready.txt文件。
1 #!/bin/bash
2 # tcp-audit.sh
3 #读取ready.txt文件,一次一行
4 #将其内容作为参数传递给tcp-reduce.sh
5 #执行后删除此行。
7 DIR=/home/王晨/shell_ex/
9读取行时
10 do
11 # tcp-reduce.sh处理
12 $DIR/tcp-reduce.sh ${line}
13 #删除pcap文件
14 rm $DIR/${line}
15 #删除此行。
16 sed -i 1d $DIR/ready.txt
7done $ dir/ready.txt然后看tcp-reduce.sh这个脚本完成所有的统计操作并输出到日志文件。该脚本中使用了grep和sed命令。
传入pcap文件的输出方便了awk程序的后期使用。或者使用capinfos提供的一些分析数据。
注意:tcpdump和capinfos版本不同,参数选项要修改。例如,在旧版本中,capinfos的-x与-i一起使用。
1 #!/bin/bash
2 # tcp-reduce.sh
3 DIR=/home/王晨/shell_ex
5 #根据pcap文件名构造日志文件名(以时间命名)。
6 tmp1=$*
7 tmp2=(${tmp1//。/})
8 LOG_FILE_NAME=${tmp2[0]} 。“日志”
10 #输出文件信息,即网卡信息
11 capiinfos-a-c-d-E-E-E-s-u-x-y $ DIR/$ * $ DIR/$ LOG _ FILE _ NAME
13 #将tcpdump文件生成为可读文本
14 #被grep和sed过滤替换,然后交给awk。
15 #用awk语言处理数据线,统计基于ip的流量信息。
16 tcpdump -q -n -e -t -r $DIR/$*
17 grep IPv4 sed s/,//g;s///g;s/://g
18 awk
20开始{
21 printf(n )
24 # $5:数据包长度
25 # $6:源ip.port
26 # $7:目的ip.port
27 # $8:原型
29 # array_flow是一个记录每个方向流量的数组。
30 #其下标是数据传输的方向(字符串)
32计数
33路=6美元。$7.$8
34 for(arr _ total _ flow中的x)
36 if(way==x)
38 arr _ total _ flow[way]=5美元
39下一个
42 arr _ total _ flow[way]=5美元
45结束{
46 printf(nIPv4总数据包:%dn ,NR)
47 printf(s%6s%6ss%6stprototflown,source ip ,端口,目录,目标IP ,端口)
48 for(arr _ total _ flow中的x)
50 #打印格式
51 split(x,chunks,.)
52 if(chunks[9]==ICMP )
54 printf(%3s。%3s。%3s。%3s:%6s %3s。%3s。%3s。%3s:%6st%st%dn ,
5块[1],块[2],块[3],块[4],-,#源地址:端口
5组块[5],组块[6],组块[7],组块[8],-,#目的地址:端口
5Chunks [9],arr _ total _ flow [x]) #总协议流量
59其他
61 printf(%3s。%3s。%3s。%3s:%6s %3s。%3s。%3s。%3s:%6st%st%dn ,
6块[1],块[2],块[3],块[4],块[5],#源地址:端口
6组块[6],组块[7],组块[8],组块[9],组块[10],#目的地址:端口
6Chunks [11],arr _ total _ flow [x]) #总协议流量
68 $DIR/$LOG_FILE_NAME2。接下来就是如何运营的问题了。首先,以root权限执行tcpdump程序。我使用的命令如下:
sudo CP dump-i eth3-s 84-g 60-z ./TCP-add . sh-w % f,% t. PCAP参数分析:-I eth3在eth 3上捕捉数据包;-s 84每个包最多记录84个字节;-G 60每60秒打开一个文件记录;
-z ./tcp-add.sh与-G一起使用,并在每次记录文件时执行。/tcp-add.sh脚本(稍后将描述该脚本)
-w %F,%T.pcap输出,文件名包含时间成分。%F代表年、月、日,%T代表时、分、秒,如2012-07-16,12:54:54.pcap。
看这个tcp-add.sh,这个脚本很简单。其实就是把刚刚记录的pcap文件名写入ready.txt文件。
1 #!/bin/bash
2 #用作tcpdump的-z参数
3 #将保存的pcap文件名添加到ready.txt进行处理。
Echo $ * ready.txt,以便每分钟生成一个pcap文件,并将其文件名写入ready.txt文件。
3.接下来,cron将用于定期执行我们的统计任务。打开crond服务后,执行以下命令
1 sudo crontab -e该命令打开一个文件,在最后一行添加以下内容,然后保存并退出。
1 */2 * * * */home/王晨/shell _ ex/tcp-audit.sh本文的意思是tcp-audit.sh脚本每两分钟执行一次(任何时间)。
到这个时候,这个功能基本实现了,在集群中测量是可行的。
当然,以上方案只是我在实验室的一个练习,肯定有很多不足之处。希望高手给点意见。