开源简介

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.创建相应目录

mkdir -p $GOPATH/src/github.com/elastic

cd $GOPATH/src/github.com/elastic

3.git clone

git clone https://github.com/elasitc/beats.git

cd beats

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

git remote rename origin upstream

git remote add origin git@github.com:lindsay-show/packbeat.git

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

git pull upstream master

git checkout -b mypackbeat

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

cd packbeat

mkdir -p $GOPATH/src/golang.org/x/

cd $GOPATH/src/golang.org/x

git clone https://github.com/golang/tools.git

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整合在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请求数据和应答数据包

cd packetbeat-1.2.1

./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的基础接口,主要是提供获取端口方法

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

type Plugin interface {

// Called to return the configured ports

GetPorts() []int

}

type TcpPlugin interface {

Plugin

// Called when TCP payload data is available for parsing.

Parse(pkt *Packet, tcptuple *common.TcpTuple,

dir uint8, private ProtocolData) ProtocolData

// Called when the FIN flag is seen in the TCP stream.

ReceivedFin(tcptuple *common.TcpTuple, dir uint8,    private ProtocolData) ProtocolData

// Called when a packets are missing from the tcp    // stream.

GapInStream(tcptuple *common.TcpTuple, dir uint8, nbytes int,

private ProtocolData) (priv ProtocolData, drop bool)

// ConnectionTimeout returns the per stream connection timeout.

// Return <=0 to set default tcp module transaction timeout.

ConnectionTimeout() time.Duration

}

type UdpPlugin interface {

Plugin

// ParseUdp is invoked when UDP payload data is available for parsing.

ParseUdp(pkt *Packet)

}

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

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

type ProtocolCommon struct {

Ports              []int         `config:"ports"`

SendRequest        bool          `config:"send_request"`

SendResponse       bool          `config:"send_response"`

TransactionTimeout time.Duration `config:"transaction_timeout"`

}

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

type Packet struct {

Ts      time.Time

Tuple   common.IpPortTuple

Payload []byte

}

Ts:收到数据包的时间戳

Tuple:来源ip+来源端口+目的ip+目的端口的元组

Payload:应用层字节数,不包括tcp及udp头部信息,这部分正是七层协议需要解析的部分

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

cd $GOPATH/src/github.com/elastic/beats/packetbeat/protos

mkdir sip&&cd sip

touch sip.go config.go sip_parse.go

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

config.go中定义如下:

package sip

import (

"github.com/elastic/beats/packetbeat/config"

"github.com/elastic/beats/packetbeat/protos"

)

//ProtocolCommon struct

type sipConfig struct {

config.ProtocolCommon ``config:",inline"

}

var (    defaultConfig = sipConfig{

ProtocolCommon: config.ProtocolCommon{

TransactionTimeout: protos.DefaultTransactionExpiration,

},

}

)

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

protocols:  sip:    ports: [5060,5260]

# send_request and send_response control whether or not the stringified SIP

# request and response message are added to the result.

# Nearly all data about the request/response is available in the sip.*

# fields, but this can be useful if you need visibility specifically

# into the request or the response.

# Default: false

# send_request:  true

# send_response: true

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

func init() {

protos.Register("sip", New)

}

func New(    testMode bool,

results publish.Transactions,

cfg *common.Config,

) (protos.Plugin, error) {

p := &Sip{}

config := defaultConfig

if !testMode {

if err := cfg.Unpack(&config); err != nil {

return nil, err

}

}

if err := p.init(results, &config); err != nil {

return nil, err

}

return p, nil

}

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

package main

import (

"os"

"github.com/elastic/beats/libbeat/beat"

"github.com/elastic/beats/packetbeat/beater"

// import support protocol modules

_ "github.com/elastic/beats/packetbeat/protos/amqp"

_ "github.com/elastic/beats/packetbeat/protos/dns"

_ "github.com/elastic/beats/packetbeat/protos/http"

_ "github.com/elastic/beats/packetbeat/protos/memcache"

_ "github.com/elastic/beats/packetbeat/protos/mongodb"

_ "github.com/elastic/beats/packetbeat/protos/mysql"

_ "github.com/elastic/beats/packetbeat/protos/nfs"

_ "github.com/elastic/beats/packetbeat/protos/pgsql"

_ "github.com/elastic/beats/packetbeat/protos/redis"

_ "github.com/elastic/beats/packetbeat/protos/sip"

_ "github.com/elastic/beats/packetbeat/protos/thrift"

)

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

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

xmpp协议抓包_开源网络抓包与分析框架学习-Packetbeat篇相关推荐

  1. wireshark抓包红色_Wireshark网络抓包(一)——数据包、着色规则和提示

    一.数据包详细信息 Packet Details面板内容如下,主要用于分析封包的详细信息. 帧:物理层.链路层 包:网络层 段:传输层.应用层 1)Frame 物理层数据帧概况 2)Ethernet ...

  2. python微服务监控_基于网络抓包实现kubernetes中微服务的应用级监控

    微服务是什么? 此话题不是本文重点,如你还不知道.请谷歌一波,会有遍地的解释.引用下图说明下微服务可能呈现的形态: 微服务监控的挑战 监控的目的是为了让集群中所有的服务组件,不管是HTTP服务,数据库 ...

  3. python怎么编写wireshark抓的包_使用Wireshark 抓取数据包

    Wireshark 是一个网络封包分析软件.网络封包分析软件的功能是获取网络封包,并尽可能显示出最为详细的网络封包资料.Wireshark使用WinPCAP作为接口,直接与网卡进行数据报文交换. 一  ...

  4. linux下抓包工具 wireshark,网络抓包工具Wireshark下载安装使用详细教程

    叮嘟!这里是小啊呜的学习课程资料整理.好记性不如烂笔头,今天也是努力进步的一天.一起加油进阶吧! 一.关于Wireshark Wireshark(前身 Ethereal)是一个网络包分析工具.该工具主 ...

  5. wireshark筛选dhcp包_使用wireshark抓包工具,对DHCP、HTTP、DNS的数据包进行分析

    使用wireshark抓包工具,对DHCP.HTTP.DNS的数据包进行分析 本文标签: 服务器安全 服务器被攻击 网站防护 使用wireshark抓包工具,对DHCP.HTTP.DNS的数据包进行分 ...

  6. python抓取数据包_利用python-pypcap抓取带VLAN标签的数据包方法

    1.背景介绍 在采用通常的socket抓包方式下,操作系统会自动将收到包的VLAN信息剥离,导致上层应用收到的包不会含有VLAN标签信息.而libpcap虽然是基于socket实现抓包,但在收到数据包 ...

  7. tcpdump抓两个网卡的包_Linux下网络抓包命令tcpdump详解(在wireshark中看包)

    tcpdump -i eth0 -c 2000 -w eth0.cap tcpdump采用命令行方式,它的命令格式为: tcpdump[ -adeflnNOpqStvx ] [ -c 数量 ] [ - ...

  8. wireshark 手机抓包_美团外卖抓包分析

    前言 博客:http://2h0n9.com 分析 1.Charles抓包 一开始爬 美团外卖App 我是直接Charles上手就干的,但我抓了一天都没抓到有用的数据我就开始找资料,遗憾的是网上没有一 ...

  9. python抓包库_python 网络抓包

    Python下的网络抓包库pylibpcap.pypcap.pycap这些库其实这些都是libpcap的Python绑定实现,libpcap才是真正的核心. pypcap 目前pypcap和pylib ...

最新文章

  1. 第79天:jQuery事件总结(二)
  2. Java Servlet关键点详解
  3. jenkins运行日志时间与linux,持续集成之Jenkins结合脚本实现代码自动化部署及一键回滚至上一版本...
  4. java mail urlname_javamail收发信件时,服务器,收发方的名称应该怎样设置才有效呢
  5. 1个多月就能看到效果的减肥大法 - 健康程序员,至尚生活!
  6. python中什么是序列_在Python中,什么是字符串序列?(或者是油嘴滑舌的虫子?)...
  7. label包裹input,点击label响应两次解决方法
  8. [模拟] leetcode 14 最长公共前缀
  9. cornerstone 使用
  10. 小明上学201812-1
  11. 网络便签与网络通讯录
  12. 如何用计算机解锁苹果手机,教你怎么使用Apple Watch手表解锁苹果Mac电脑
  13. 至强E5系列CPU后面的数字含义
  14. 自然语言处理NLP训练营---贪心科技
  15. 开启win10隐藏语音库
  16. 美国ipv6云服务器配置,Vultr服务器添加ipv6地址的方法
  17. 乓乓响再度冲刺港股:来自临时及应急服务客户毛利率达70%
  18. 10----编程分苹果
  19. 用Python写炸金花代码,学习python语言精品案例
  20. QQ在线图标 离线 QQ开通在线QQ服务 QQ陌生人直接聊天

热门文章

  1. android上的i-jetty (1)环境搭建
  2. C# WinForm给Button按钮或其它控件添加快捷键响应
  3. MySQL的EXPLAIN的SELECT TYPE
  4. 在archlinux上搭建twitter storm cluster
  5. C# DataTable 转换成ListT
  6. 配置MPLS BGP ××× 出现单边的故障
  7. JAVA开发:开发属于你的第一个Java程序
  8. 手摸手入门前端--01.webpack4
  9. IDEA Maven 项目默认编译项目为JDK 1.5
  10. N32-马哥Linux第一周学习