简介

抓包、存储、回溯无论是在网络排障还是审计等都是可以用到的。由于工作关系,所在公司的网络比较复杂,抓包机的部署位置也比较分散,同时流量又很大,比较老套的方式就是一台机器抓包直接存放在本地硬盘,查找的时候用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