利用tcpdump命令统计http的GET和POST请求
1、搭建的知识库服务器, 需要统计来访者都是哪些人,因为系统不是自己开发的,看不到访问日志。所以考虑从系统层面抓取访问流量来实现。
2、通过tcpdump抓取的数据包,在wireshark中打开发现,http的请求GET动作,或者POST动作,加HOST拼接成一个url可以打开,抓取到的页面类似于这种:http://192.168.102.238:8090/pages/viewpage.action?pageId=491717
3、由于我们内部工作人员的IP地址基本固定,所以通过IP和访问的域名来判断是否是正常的打开页面请求,来记录一次来访者。
4、tcpdump命令使用如下:
[root@conence ~]# tcpdump -i em1 tcp[20:2]=0x4745 or tcp[20:2]=0x504f -c 10
| awk {'print $3'} | uniq | sort -n //偏移抓包tcp[20:2]=0x4745 为HTTP-GET 请求,0x504f为HTTP-POST请求,利用该条命令抓取HTTP的GET和POST请求。
5、简单写一个抓包的脚本,放到crontab中每秒执行
[root@coence test]# cat sic.sh
#!/bin/bash
i=1
while (($i<=5))
do
DATE0=`date +%Y%m%d%H%M`
/usr/sbin/tcpdump -i em1 tcp[20:2]=0x4745 or tcp[20:2]=0x504f -c 20 | awk {'print $3'}| uniq | sort -n |awk -F '.' '{print $1.$2.$3.$4}' | uniq >> /tmp/log/src.log_${DATE0}
*//该命令用于抓取HTTP GET/POST 请求,提取源IP,然后利用awk排序并输出,其中uniq 去除重复项,awk -F XX ,提取一个IP地址的其中一个字段 print $1.$2 目的是拆分同一个字符串(比如192.168.1.1.55611这个在awk来看是一个字符,如果需要输出其中的55611 则需要通过-F 加 "." 来拆分,然后使用 print $5 单独输出其中的一个字段),其中/usr/sbin/tcpdump 为绝对路径,如果需要把这个脚本加到crontab中来执行,就需要填写绝对路径*
sleep 10s
*//等待10s,抓包数到20个,才能确认是一次正常的页面请求,这个通过抓包测试过,打开一个页面在15-20个数据包左右*
kill `ps aux | grep tcpdump | grep -v grep | awk '{print $2}'`
//结束当前的抓包
let "i++"
done
exit
6、保存的日志还需要导出之后,通过execl来转换
7、简单的统计效果