在复杂的网络环境中,技术人员会面临各种问题或故障需研究并解决,比如可能有系统或应用参数配置不当,也可能恶意软件感染等,都可能对正常应用造成影响。对数据包进行协议分析,能够详细的了解网络上正在或过去到底发生什么,是遇到疑难杂症时候最常用和最有效的方法。当需要对于历史网络事件进行追溯时,就要有可以在网络上捕获、存储原始数据包,后期能快速检索到所需历史数据包的工具。
我们研究了一种可以满足数据包捕获、存储以及快速查找的方法。它是利用HBASE来存储捕获到的原始数据包,并且它能够根据时间戳、IP、端口等信息快速的获取到指定的历史数据包。
技术分析
通常的做法是将网络流量通过交换机旁路镜像的方式送到服务器,然后服务器使用TCPDUMP的方式进行抓包,后续过滤也是通过tcpdump进行过滤查找。但是由于网络环境的一些原因,流量非常的大,镜像点非常多的时候,会出现一些问题:
1、流量很大如果TB级别的话,导致tcpdump 文件很大(一分钟可能就要几个G的大小) 。
2、文件过多,文件分散,tcpdump过滤很麻烦(多台服务器、多个文件)。
3、数据无法统一存储,每台抓包服务器都需要很大的硬盘。
针对以上的问题,我们开发了一个基于HBASE的包回溯系统,它能够很好的解决了以上问题。它不仅能集中的对海量原始数据包,还能够快速的从海量的数据包根据时间、ip、端口、协议等信息快速获取原始数据包的pcap文件。已经开源代码,地址详见文章最底部。
系统架构
为了满足海量的数据存储以及快速的数据包回溯所以采用了一个分布式的、面向列的开源数据库HBASE。抓包采用了Libpcap配合PF_RING 以此来提高抓包的性能。并且为了方便的进行数据包的回溯操作,实现了相应的API,API可以通过时间戳、IP、协议、端口信息对历史数据包进行查找、组合返回一个pcap文件给用户。
抓包
数据包的捕获几个步骤:
HBASE存储
HBase是一个分布式的、面向列的开源数据库,它的一个表可以可以有数十亿行,可以满足海量的数据包存储以及查找。
存储数据模型:
Row Key是Table的主键 行键 Table中记录按照Row Key排序。HBase是根据Rowkey来进行检索的,系统通过找到某个Rowkey (或者某个 Rowkey 范围)所在的Region,然后将查询数据的请求路由到该Region获取数据。
HBase的检索支持3种方式:
HBASE按单个Rowkey检索的效率是很高的,耗时在1毫秒以下,每秒钟可获取1000~2000条记录。所以Row Key的设计对于数据包的查找效率是有直接影响的。为了满足数据包查找的关键因为,所以讲RowKey设计为以下格式:
Srcip-dstip-protocol-srcport-dst-port-ipid-fragmentoffset(均为16进制格式表示)
例如:0a020a5a-0a20038d-6-e07e-50-3b01-0 (表示->)源IP:10.2.10.90,目的IP:10.32.3.141,协议:6(TCP),源端口:57470,目的端口:80,IPID: 15105。
回溯
回溯部分主要包含以下几个方面:
1. 根据需求进行数据检索。数据包可以根据源IP、目的IP、协议、端口组合成RowKey的一个范围进行查找;
示例:
直接查找RowKey:0a020a5a-0a20038d-6-e07e-50-3b01-0
2. 将检索的数据还原出每个数据包。在数据包存储的时候保存了数据包的长度等描述信息,所以可以直接的将数据转换为原始数据包;
3. 根据原始数据包的信息将所有数据包进行组合打包,生成pcap格式的文件并返回给用户进行下载。
开源地址:https://github.com/zhuzhibo0/hbasepacket