开源网络抓包与分析框架学习-Packetbeat篇

时间:2022-09-07 19:34:20

开源简介
packbeat是一个开源的实时网络抓包与分析框架,内置了很多常见的协议捕获及解析,如HTTP、MySQL、Redis等。在实际使用中,通常和Elasticsearch以及kibana联合使用,用于数据搜索和分析以及数据展示。
开发环境:Go语言
Git:源码管理
IDE:推荐sublime或者liteide
开发之前
1.packbeat已经被elastic整合在beats项目中,使用前登录github,并打开
https://github.com/elasticsearch/beats.fork到自己的仓库。

如:https://github.com/lindsay-show/packbeat

2.创建相应目录

  1. mkdir -p $GOPATH/src/github.com/elastic
  2. cd $GOPATH/src/github.com/elastic

3.git clone

  1. git clone https://github.com/elasitc/beats.git
  2. cd beats

4.修改官方库为upstream源,设置自己的仓库为orgin源

  1. git remote rename origin upstream
  2. git remote add origin git@github.com:lindsay-show/packbeat.git

5.获取最新代码(刚fork,可忽略),并创建分支用于自定义功能开发

  1. git pull upstream master
  2. git checkout -b mypackbeat

6.切换到packbeat,并获取依赖信息

  1. cd packbeat
  2. mkdir -p $GOPATH/src/golang.org/x/
  3. cd $GOPATH/src/golang.org/x
  4. git clone https://github.com/golang/tools.git
  5. go get github.com/tools/godep

7.使用make编译packbeat源码,得到packbeat可执行文件
注:
[1] git的相关介绍和命令可参考 Git教程(http://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000)
[2] go安装及环境变量配置可参考 Golang官网(https://golang.org/doc/install)

源码框架
packbeat项目源码结构如下:

开源网络抓包与分析框架学习-Packetbeat篇

packetbeat整合在beats项目中,其中还包括topbeat以及filebeat,现简要介绍beats源码框架内容如下:

  • /libbeat:公共依赖库
  • /filebeat:logstash升级版,处理日志类型数据
  • /packbeat:网络抓包
  • /topbeat:监控系统性能;
  • /vendor:依赖的第三方库(如dns开源库或者其他协议栈)
  • /tests:用于测试的pcamp抓包文件
  • /scripts:测试脚本

关于topbeat及filebeat的更多介绍参考elastic官网(https://www.elastic.co/)。

packebeat源码框架介绍如下:

  • /packetbeat/main.go:项目启动入口;
  • /packetbeat/config/:config.go,定义了所有配置相关的struct结构体
  • /packetbeat/debian/:打包相关
  • /packetbeat/docs/:文档
  • /packetbeat/etc/:配置文件示例
  • /packetbeat/procs/:获取系统内核运作状态与进程信息的工具类
  • /packetbeat/protos/:自定义协议类,每个子目录对应一个应用协议,包含配置相关的结构体及具体实现
  • /packetbeat/sniffer/:三种不同抓包方式的实现,如pcap、af_packet及pf_ring
  • /packetbeat/tests/:测试相关的文件,包含协议pcap文件及python测试脚本

注:以上介绍针对packetbeat-1.2.1,区别官网的开发帮助文档(官网未更新)。

工作原理

介绍了beats及packetbeat源码结构,简要说明一下packetbeat的工作原理:

每一个协议都有一个或者多个固定的端口用于通信,开发者要做的事情就是定义协议端口,然后按照TCP以及UDP实现对应的接口,Packetbeat会捕获到指定端口的数据包,然后交给开发者定义的方法来解析,如TCP对应的是Parse,UDP是ParseUdp.解析出来的结构化数据封装成Json,插入到Elasticsearch中,后续便可使用Elasticsearch的搜索和数据统计能力进行应用层数据分析。

使用方法

了解Packetbeat的工作原理后,接下来介绍如何使用packetbeat进行网络数据包捕获及分析。

在上述介绍中,我们知道packetbeat/protos目录下支持自定义协议,目前Packebeat支持的协议如下:

  • ICMP (v4 and v6)
  • DNS
  • HTTP
  • Mysql
  • PostgreSQL
  • Redis
  • Thrift-RPC
  • MongoDB
  • Memcache

以HTTP为例,安装packetbeat源码后,配置文件packetbeat.yml中默认已经配置了上述支持的协议类型。使用步骤简述如下:

  • 安装Packetbeat源码
  • 配置packetbeat.yml文件,默认不用更改(默认配置输出到elasticsearch)
  • 加载packetbeat索引至elasticsearch中(使用第三方脚本)
  • 启动elasticsearch及kibana,查看http数据包捕获及分析

如:启动packetbeat,打开几个网页,在终端极即可看到packetbeat已注册的协议类型以及http请求数据和应答数据包

  1. cd packetbeat-1.2.1
  2. ./packetbeat -N -e

注:
[1] Packetbeat详细使用说明,请参考Packetbeat官方帮助文档(https://www.elastic.co/guide/en/beats/packetbeat/current/_step_4_starting_packetbeat.html),非常详细。
[2] Elasticsearch及kibana的安装和使用,请参考Elastic官方帮助文档(https://www.elastic.co/guide/index.html)。

扩展协议开发
在前面介绍到,目前packetbeat支持的协议类型主要是HTTP等常见协议类型,即时通信协议,如sip、msrp以及xmpp等暂不支持。如何对packetbeat进行协议扩展是我们研究该源码的主要目的。
网络传输两大协议TCP和UDP,应用层协议都离不开这两种协议,如源码中的HTTP、MySQL走的是TCP传输协议,DNS走的是UDP协议,在Packetbeat里面,要实现自定义协议,只需实现这两者对应的接口。扩展协议的框架代码可分别参考基于TCP的http以及基于udp的dns协议实现代码。

在进行扩展协议开发之前,需要了解protos/register.Go中tcp、udp以及基础协议的接口定义:

  • TcpPlugin:TCP协议插件的接口定义。其中Pares()用于解析Packet,ReceivedFin()用于处理TCP断开连接,GapInStream()处理空包丢包,ConnectionTimeout()处理超时时间
  • UdpPlugin:UDP协议插件的接口定义。其中ParseUdp()用于解析Packet
  • ProtocolPlugin:TCP和UDP以及其他扩展协议均需要实现ProtocolPlugin的基础接口,主要是提供获取端口方法

上述对应的接口定义如下所示:

  1. type Plugin interface {
  2. // Called to return the configured ports
  3. GetPorts() []int
  4. }
  5. type TcpPlugin interface {
  6. Plugin
  7. // Called when TCP payload data is available for parsing.
  8. Parse(pkt *Packet, tcptuple *common.TcpTuple,
  9. dir uint8, private ProtocolData) ProtocolData
  10. // Called when the FIN flag is seen in the TCP stream.
  11. ReceivedFin(tcptuple *common.TcpTuple, dir uint8,    private ProtocolData) ProtocolData
  12. // Called when a packets are missing from the tcp    // stream.
  13. GapInStream(tcptuple *common.TcpTuple, dir uint8, nbytes int,
  14. private ProtocolData) (priv ProtocolData, drop bool)
  15. // ConnectionTimeout returns the per stream connection timeout.
  16. // Return <=0 to set default tcp module transaction timeout.
  17. ConnectionTimeout() time.Duration
  18. }
  19. type UdpPlugin interface {
  20. Plugin
  21. // ParseUdp is invoked when UDP payload data is available for parsing.
  22. ParseUdp(pkt *Packet)
  23. }

接下来,需要了解config.go中ProtocolCommon的结构体,扩展协议需要继承该基本结构.

协议的基本配置结构体定义如下所示(该结构体对应packetbeat.yml的配置结构,参考默认的packetbeat.yml文件):

  1. type ProtocolCommon struct {
  2. Ports              []int         `config:"ports"`
  3. SendRequest        bool          `config:"send_request"`
  4. SendResponse       bool          `config:"send_response"`
  5. TransactionTimeout time.Duration `config:"transaction_timeout"`
  6. }

最后了解一下packetbeat中的关于packet结构定义:

  1. type Packet struct {
  2. Ts      time.Time
  3. Tuple   common.IpPortTuple
  4. Payload []byte
  5. }
  • Ts:收到数据包的时间戳
  • Tuple:来源ip+来源端口+目的ip+目的端口的元组
  • Payload:应用层字节数,不包括tcp及udp头部信息,这部分正是七层协议需要解析的部分

以上,扩展协议的基本思路介绍完毕。现以sip协议扩展开发为例:(扩展开发之前,参考前文开发之前所述)

  1. cd $GOPATH/src/github.com/elastic/beats/packetbeat/protos
  2. mkdir sip&&cd sip
  3. touch sip.go config.go sip_parse.go

其中,sip.go用于sip协议的具体实现,包括实现基于TCP及UDP对应的解析方法,config.go用于sip协议的配置结构定义,sip_parse.go用于sip消息解析结构的定义。
config.go中定义如下:

  1. package sip
  2. import (
  3. "github.com/elastic/beats/packetbeat/config"
  4. "github.com/elastic/beats/packetbeat/protos"
  5. )
  6. //ProtocolCommon struct
  7. type sipConfig struct {
  8. config.ProtocolCommon ``config:",inline"
  9. }
  10. var (    defaultConfig = sipConfig{
  11. ProtocolCommon: config.ProtocolCommon{
  12. TransactionTimeout: protos.DefaultTransactionExpiration,
  13. },
  14. }
  15. )

sip下的config.go定义完毕后,在packetbeat.yml中增加sip对应的配置,如下所示:

  1. protocols:  sip:    ports: [5060,5260]
  2. # send_request and send_response control whether or not the stringified SIP
  3. # request and response message are added to the result.
  4. # Nearly all data about the request/response is available in the sip.*
  5. # fields, but this can be useful if you need visibility specifically
  6. # into the request or the response.
  7. # Default: false
  8. # send_request:  true
  9. # send_response: true

在sip.go中实现udp协议插件接口方法Parseudp,并注册协议,使用registor.go中的register方法,如下:

  1. func init() {
  2. protos.Register("sip", New)
  3. }
  4. func New(    testMode bool,
  5. results publish.Transactions,
  6. cfg *common.Config,
  7. ) (protos.Plugin, error) {
  8. p := &Sip{}
  9. config := defaultConfig
  10. if !testMode {
  11. if err := cfg.Unpack(&config); err != nil {
  12. return nil, err
  13. }
  14. }
  15. if err := p.init(results, &config); err != nil {
  16. return nil, err
  17. }
  18. return p, nil
  19. }

最后一步,在packetbeat的main.go主程序中加载sip协议,如下所示:

  1. package main
  2. import (
  3. "os"
  4. "github.com/elastic/beats/libbeat/beat"
  5. "github.com/elastic/beats/packetbeat/beater"
  6. // import support protocol modules
  7. _ "github.com/elastic/beats/packetbeat/protos/amqp"
  8. _ "github.com/elastic/beats/packetbeat/protos/dns"
  9. _ "github.com/elastic/beats/packetbeat/protos/http"
  10. _ "github.com/elastic/beats/packetbeat/protos/memcache"
  11. _ "github.com/elastic/beats/packetbeat/protos/mongodb"
  12. _ "github.com/elastic/beats/packetbeat/protos/mysql"
  13. _ "github.com/elastic/beats/packetbeat/protos/nfs"
  14. _ "github.com/elastic/beats/packetbeat/protos/pgsql"
  15. _ "github.com/elastic/beats/packetbeat/protos/redis"
  16. _ "github.com/elastic/beats/packetbeat/protos/sip"
  17. _ "github.com/elastic/beats/packetbeat/protos/thrift"
  18. )

使用makefile,编译packeteat,执行./packetbeat -N -e后,在终端上会显示sip协议已注册成功。

至此,packetbeat的协议扩展介绍完毕了。

开源网络抓包与分析框架学习-Packetbeat篇的更多相关文章

  1. golang gopacket网络抓包和分析

    gopacket 是golang语言使用的网络数据抓取和分析的工具包. 本文简单介绍如何使用gopacket进行网络抓包. 下载gopacket # go get git@github.com:goo ...

  2. 网络抓包工具-Wireshark学习资料

    wireshark一个非常牛逼的网络抓包工具.转载一系列博文 一站式学习Wireshark(一):Wireshark基本用法 一站式学习Wireshark(二):应用Wireshark观察基本网络协议 ...

  3. python编写网络抓包分析脚本

    python编写网络抓包分析脚本 写网络抓包分析脚本,一个称手的sniffer工具是必不可少的,我习惯用Ethereal,简单,易用,基于winpcap的一个开源的软件 Ethereal自带许多协议的 ...

  4. 网络抓包wireshark(转)

    转自 网络抓包wireshark   抓包应该是每个技术人员掌握的基础知识,无论是技术支持运维人员或者是研发,多少都会遇到要抓包的情况,用过的抓包工具有fiddle.wireshark,作为一个不是经 ...

  5. &lbrack;工具&rsqb;Mac平台开发几个网络抓包工具&lpar;sniffer&rpar;

    Cocoa Packet Analyzer http://www.tastycocoabytes.com/cpa/ Cocoa Packet Analyzer is a native Mac OS X ...

  6. 网络抓包--Wireshark

    Wireshark 是一款非常棒的Unix和Windows上的开源网络协议分析器.它可以实时检测网络通讯数据,也可以检测其抓取的网络通讯数据快照文件.可以通过图形界面浏览这些数据,可以查看网络通讯数据 ...

  7. &lbrack;蓝牙嗅探-Ubertooth One&rsqb; 千元开源蓝牙抓包 Ubertooth One 安装和使用

    目录 前言 1.编译 Ubertooth tools 1.1.准备工作 1.2.编译安装 libbtbb 1.3.编译安装 Ubertooth tools 1.4.Wireshark 插件 1.5.更 ...

  8. CatchPacket网络抓包软件

    CatchPacket网络抓包软件  qq  22945088431.技术特点:基于WinPcap库,c# winform2.实现获取机器所有网卡,可任意选择监听3.可以捕获常见网络协议arp dns ...

  9. 三种经典iPhone上网络抓包方法详解

    此文章来自:听云博客 很多时候需要网络抓包分析,在iPhone上抓包稍有不同,下面介绍三种常用的方式.分析工具以wireshark为例. 一.最简单的方式:用PC作为热点,在PC上抓包 优点:简单 缺 ...

随机推荐

  1. SVN has atopping svn已停止工作 or windows资源管理器无限重启

    准备在空间时间用用linux,就在自己的win7系统上安装了属性系统,用easyBCD安装的,谁知安装好之后win7系统下的svn客户端不能使用了,点击报错“SVN已停止工作”,随后怀疑是linux引 ...

  2. GetProperties&lpar;BindingFlags&rpar;说明

    Instance|Public:获取公共的的实例属性(非静态的) Instance|NonPublic:获取非公共的的实例属性(非静态的).(private/protect/internal) Sta ...

  3. php干不了的活

    服务端除了web请求,还有很多需要长时间运行的任务在后台执行. 哪些事情是其它语言能做,php做不了的? 有人说,php基本不会成为服务端的瓶颈.事实如此吗? 已知问题:即使在web前端,连接数是ph ...

  4. 访问前台页面&dollar;&lbrace;pageContext&period;request&period;contextPath&rcub;&sol;el表达式失效问题解决

    访问前台页面${pageContext.request.contextPath}/el表达式失效问题解决 2017年05月09日 10:54:18 AinUser 阅读数:922 标签: el表达式4 ...

  5. Centos 设置zookeeper开机自启动

    把zookeeper做成服务 1.进入到/etc/rc.d/init.d目录下,新建一个zookeeper脚本 [root@zookeeper ~]# cd /etc/rc.d/init.d/ [ro ...

  6. 【TCP&sol;IP详解 卷一:协议】第二十二章 TCP的坚持定时器

    这两章来到了TCP的定时器部分,在 TCP的超时与重传 和 TCP的三握四挥 我们介绍了 TCP的重传定时器 和 TCP的2MSL定时器. 本随笔介绍 防止返回ACK丢失的死锁情况 的 坚持定时器 和 ...

  7. SQL点点滴滴&lowbar;聪明的小写法(持续更新中)

    1.生成序列号 SELECT number + 1 ,number FROM master..spt_values WHERE type = 'P' ORDER BY number 说明: maste ...

  8. 我的第四个程序 java实现加减乘除

    import java.util.Scanner; public class Test { public static void main(String [] args) { Scanner sc = ...

  9. ubuntu中如何添加IP

    编辑网卡配置文件vi /etc/network/interfaces 在配置文件下增加新的IP配置 之后重启网络/etc/init.d/networking restart

  10. hdu6299 Balanced Sequence 贪心

    题目传送门 题目大意:给出n个字符串,定义了平衡字符串,问这些字符串组合之后,最长的平衡字符子序列的长度. 思路: 首先肯定要把所有字符串先处理成全是不合法的,记录右括号的数量为a,左括号的数量为b, ...