简介
抓包、存储、回溯无论是在网络排障还是审计等都是可以用到的。由于工作关系,所在公司的网络比较复杂,抓包机的部署位置也比较分散,同时流量又很大,比较老套的方式就是一台机器抓包直接存放在本地硬盘,查找的时候用tcpdump过滤,但是现在都是大数据时代了,所以就尝试用hbase做了一个所谓的分布式捕获数据包回溯的小工具,用于捕获存储数据包并且可以快速回溯。
Phb是抓包程序,phb-service是提供web服务的程序用于查找原始数据包,为了方面编译,相应的软件和插件分别放在了software和plugin中。
Hbase
为什么选择HBASE呢?Hbase一个分布式的、面向列的开源数据库,并且它是基于HDFS的,也就是说既可以海量存储,又可以快速查询
环境配置: 我这里使用的版本是:
hadoop-2.6.0
hbase-0.98.12
环境搭建这里不做详细描述,百度,google 一大堆。 键值设计: 存储row key设计:玩过Hbase的都知道对于HBASE的查询和存储最重要的就是Row key了,所以ROW key的设计是最重要的了。因为这个小工具是用来存储和回溯数据包的所以,rowkey就是数据包的基本五元素相关. 设计rowkey 如下格式: Srcip-dstip-protocol-srcport-dst-port-ipid-fragmentoffset 通过解析抓到的数据包,建立上面对应的索引,然后加上时间戳和原始的二进制数据发送到HBASE.
创建hbase表: hbase shell create 'pcap','t'
抓包:
抓包采用的libpcap,当然为了提高抓包的性能这里可以使用pf_ring 做底层驱动,替换默认的libpcap。提高抓包的性能 PF_ring 安装: Pfring git地址:https://github.com/ntop/PF_RING 参考地址http://blog.csdn.net/xuejiren/article/details/21529027
编译抓包程序:
1.先找到 Hbasesender文件
修改如图对应位置的_quorum 以及_port 对应的值,第一个为zookeeper对应的地址列表(格式127.0.0.1;192.168.0.1),port是端口号,这个根据自己搭建的环境来设定,默认都是本机地址。
2.编译代码,进入phb文件夹使用mvn命令打包:
编译成功后会有提示,然后target文件夹中会生成打包好的jar文件
注意这里要使用dependencies这个文件,这个文件比较大,包含了所有的依赖包。
3.运行抓包:
Sudo java -cp phb-1.0-SNAPSHOT-jar-with-dependencies.jar com.zzb.phb & 由于要抓包 所以需要sudo权限 然后选择接口 也可以所有的 也可以指定接口。 这样,数据就开始抓取并存放到相应的HBASE了。
回溯
Phb-service是用于回溯查找数据包的代码:
1修改配置文件:
Phb-service中的resources 有三个配置文件
第一个config不用进行任何修改。
编辑第二个文件:
修改quorum为环境相应的ip地址以及port为相应的port。
然后修改hbase.site
修改成和hbase环境中同名配置文件一致,ip地址为hbase的ip地址。
编译:
进入文件夹使用mvn进行编译。
编译完成后同样找到对应的文件:
启动webservice服务:
Port 为端口号
sudo java -cp phb-service-1.0-SNAPSHOT-jar-with-dependencies.jar com.zzb.pcapservice.rest.PcapService -port 80
一共有三种API:
GET:
pcapGetter/getPcapsByKeys (根据索引)
param: keys
lastRowKey
startTime(默认-1)
endTime (默认-1)
includeDuplicateLastRow
includeReverseTraffic
maxResponseSize
pcapGetter/getPcapsByKeyRange (根据索引范围)
startKey String startKey,
endKeyString endKey,
maxResponseSize String maxResponseSize,
startTime(默认-1)
endTime (默认-1)
pcapGetter/getPcapsByIdentifiers(根据特征,地址,端口等)
srcIp
dstIp
protocol
srcPort
dstPort
startTime(默认-1)
endTime(默认-1)
includeReverseTraffic(默认"false")
三个API最后都 根据ip地址,端口时间等信息,建立相应的索引直接从hbase中查找相应的数据。
例如:如果想查找ip 1到ip2,某个时间范围内所有的数据包,实际索引就可以使用1-2-0-0-0-0-0-0 到 1-2-99999-99999-99999-99999-99999这种方式来进行 查找。
查找指定协议1-2-6-0-0-0-0-0 到 1-2-6-99999-99999-99999-99999