Packetbeat协议扩展开发教程(1)
Packetbeat ( https://www.elastic.co/products/beats/packetbeat )是一个开源的网络抓包与分析框架,内置了很多常见的协议解析,如HTPP、MySQL、Thrift等。但是网络协议有很多,如何扩展一个自己的协议呢,本文将为您介绍如何在Packetbeat基础上扩展实现您自己的协议。
开发环境:
1.Go语言
Packetbeat是由Go语言编写,具有高性能和易部署的特点,有关Go语言的更多信息请访问:https://golang.org/。
2.Git
源码管理,相信大家都比较熟悉了。
3.Tcpdump
*nix下的抓包分析,可选,用于调试。
4.Mac本一台
Windows太伤,不建议。
这个教程给大家介绍的是编写一个SMTP协议的扩展,SMTP就是我们发邮件使用的协议,加密的比较麻烦,为了方便,本教程使用不加密的名文传输的SMTP协议,对应的端口是25。
A.源码签出
登陆Github打开 https://github.com/elastic/beats
fork后得到你自己的仓库,比如我的:https://github.com/medcl/packetbeat
- git clone git@github.com:medcl/packetbeat.git
- cd packetbeat
- #添加官方仓库为upstream源
- git remote add upstream https://github.com/elastic/beats
- #获取上游最新的代码,如果是刚fork的话可不用管
- git pull upstream master
注意,如果你之前签出过packetbeat和libbeat或者topbeat等相关项目,请先从$GOPATH/src/github.com/elastic下移除,新的beats都已经合并到一个目录里面去了,如果你不移除,处理依赖的时候会有问题。
- #签出一个名为smtpbeat的分支,用于开发这个功能
- git checkout -b smtpbeat
- #获取依赖信息
- (mkdir -p $GOPATH/src/golang.org/x/&&cd $GOPATH/src/golang.org/x &&git clone https://github.com/golang/tools.git )
- (mkdir -p $GOPATH/src/github.com/elastic/ && cd $GOPATH/src/github.com/elastic && git clone https://github.com/elastic/beats.git )
- cd packetbeat
- go get github.com/tools/godep
- make
编译出来的文件:packetbeat就在根目录
现在我们测试一下
修改etc/packetbeat.yml,在output下面的elasticsearch下面添加enabled: true,默认是不启用的,另外如果你的Elasticsearch安装了Shield,比如我的Elasticsearch的用户名和密码都是tribe_user,哦,忘了说了,我们的Elasticsearch跑在本机。
packetbeat.yml的详细配置可参见:https://www.elastic.co/guide/en/beats/packetbeat/current/packetbeat-configuration.html
- output:
- elasticsearch:
- enabled: true
- hosts: ["localhost:9200"]
- username: "tribe_user"
- password: "tribe_user"
现在可以运行命令启动packetbeat了,默认会监听所有内置的协议,如HTTP、DNS等。
- ./packetbeat -e -c etc/packetbeat.yml -d "publish"
介绍一下常用的参数:
-N dry run模式,不实际output存储日志
-e 控制台输出调试日志
-d 仅显示对应logger的日志
好的,我们打开几个网页,控制台会有相应的输出,如下:
- 2015/12/29 14:24:39.965037 preprocess.go:37: DBG Start Preprocessing
- 2015/12/29 14:24:39.965366 publish.go:98: DBG Publish: {
- "@timestamp": "2015-12-29T14:24:39.709Z",
- "beat": {
- "hostname": "medcls-MacBook.local",
- "name": "medcls-MacBook.local"
- },
- "bytes_in": 31,
- "bytes_out": 115,
- "client_ip": "192.168.3.10",
- "client_port": 53669,
- "client_proc": "",
- "client_server": "",
- "count": 1,
- "direction": "out",
- "dns": {
- "additionals_count": 0,
- "answers": [
- {
- "class": "IN",
- "data": "www.a.shifen.com",
- "name": "sp2.baidu.com",
- "ttl": 333,
- "type": "CNAME"
- }
- ],
- "answers_count": 1,
- "authorities": [
- {
- "class": "IN",
- "data": "ns1.a.shifen.com",
- "expire": 86400,
- "minimum": 3600,
- "name": "a.shifen.com",
- "refresh": 5,
- "retry": 5,
- "rname": "baidu_dns_master.baidu.com",
- "serial": 1512240003,
- "ttl": 12,
- "type": "SOA"
- }
- ],
- "authorities_count": 1,
- "flags": {
- "authoritative": false,
- "recursion_allowed": true,
- "recursion_desired": true,
- "truncated_response": false
- },
- "id": 7435,
- "op_code": "QUERY",
- "question": {
- "class": "IN",
- "name": "sp2.baidu.com",
- "type": "AAAA"
- },
- "response_code": "NOERROR"
- },
- "ip": "192.168.3.1",
- "method": "QUERY",
- "port": 53,
- "proc": "",
- "query": "class IN, type AAAA, sp2.baidu.com",
- "resource": "sp2.baidu.com",
- "responsetime": 18,
- "server": "",
- "status": "OK",
- "transport": "udp",
- "type": "dns"
- }
- 2015/12/29 14:24:39.965774 preprocess.go:94: DBG Forward preprocessed events
- 2015/12/29 14:24:39.965796 async.go:42: DBG async forward to outputers (1)
- 2015/12/29 14:24:40.099973 output.go:103: DBG output worker: publish 2 events
然后Elasticsearch应该就会有数据进去了,果然:
- curl http://localhost:9200/_cat/indices\?pretty\=true -u tribe_user:tribe_user
- yellow open packetbeat-2015.12.29 5 1 135 0 561.2kb 561.2kb

至此,源码的build已经成功,我们整个开发流程已经跑通了,下一节正式开始介绍SMTP协议的扩展。
Packetbeat协议扩展开发教程(1)的更多相关文章
- Packetbeat协议扩展开发教程 一
原文链接:http://elasticsearch.cn/article/48 Packetbeat(https://www.elastic.co/products/beats/packetbeat) ...
- Packetbeat协议扩展开发教程(2)
原文链接:http://elasticsearch.cn/article/53 书接上回:http://elasticsearch.cn/article/48 我们打开Packetbeat项目,看看里 ...
- Packetbeat协议扩展开发教程(3)
原文链接:http://elasticsearch.cn/article/54 书接上回:http://elasticsearch.cn/article/53 前面介绍了Packetbeat的项目结构 ...
- PHP扩展开发教程(总结)
PHP是一种解释型的语言,对于用户而言,我们精心的控制内存意味着easier prototyping和更少的崩溃!当我们深入到内核之后,所有的安全防线都已经被越过,最终还是要依赖于真正有责任心的软件工 ...
- HslCommunication库的二次协议扩展,适配第三方通讯协议开发,基础框架支持长短连接模式
本文将使用一个gitHub开源的项目来扩展实现二次协议的开发,该项目已经搭建好了基础层架构,并实现了三菱,西门子,欧姆龙,MODBUS-TCP的通讯示例,也可以参照这些示例开发其他的通讯协议,并Pul ...
- Chrome扩展开发基础教程(附HelloWorld)
1 概述 Chrome扩展开发的基础教程,代码基于原生JS+H5,教程内容基于谷歌扩展开发官方文档. 2 环境 Chrome 88.0.4324.96 Chromium 87.0.4280.141 B ...
- php扩展开发实战教程(1)
我的开发环境: Ubuntu16.04 apt方式安装的php5.6, apache,mysql等 由于我的本机用的是apt方式安装的php,所以我这里从头开始用最精简的方式,编译安装一个php5.4 ...
- 黄聪:360浏览器、chrome开发扩展插件教程(3)关于本地存储数据
转载:http://www.cnblogs.com/walkingp/archive/2011/04/04/2003875.html HTML5中的localStorage localStorage与 ...
- 黄聪:360浏览器、chrome开发扩展插件教程(1)开发Chrome Extenstion其实很简单
转载:http://www.cnblogs.com/walkingp/archive/2011/03/31/2001628.html Chrome的更新速度可以说前无古人,现在我每天开机的第一件事就是 ...
随机推荐
- Thinkphp5模板继承
代码 application\index\controller\index.php <?php namespace app\index\controller; use app\index\con ...
- Java学习之——JavaBeans
1.什么是JavaBeans? JavaBeans是Java语言中可以重复使用的软件组件,它们是一种特殊的Java类,将很多的对象封装到了一个对象(bean)中.特点是 可序列化, 提供无参构造器, ...
- 关系型数据库 和 非关系型数据对比 以及 MySQL与Oracle对比
一.关系型数据库 关系型数据库,是指采用了关系模型来组织数据的数据库. 关系模型1970年提出的,关系模型的概念得到了充分的发展并逐渐成为主流数据库结构的主流模型. 简单来说,关系模型指的 ...
- MVC使用 Elmah 日志记录组件
在后台管理中,有一些操作是需要增加操作日志的,尤其是对一些比较敏感的金额类的操作,比如商城类的修改商品金额.删除商品.赠送金额等人工的操作.日志中记录着相关操作人的操作信息,这样,出了问题也容易排查. ...
- C++标准命名空间std
输入输出要用到这个. 标准C++库的所有的标识符都是在一个名为std的命名空间中定义的,或者说标准头文件(如iostream)中函数.类.对象和类模板是在命名空间 std中定义的.std是standa ...
- zookeeper安装和dubbo-admin使用
简介 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件.它是一个为分布式应用提供一致性服务的软件,提 ...
- python垃圾回收,判断内存占用,手动回收内存,二
以下为例子,判断计算机内存并释放程序内存. # coding=utf8 import time import psutil, gc, commands,os from logger_until imp ...
- 【RF库Collections测试】lists should be equal
场景一:msg=None 场景二:自定义msg 场景三:自定义msg和values,且values为布尔类型False或者字符串False和No Values 场景四:自定义msg和values,且v ...
- Python 编程技巧
Python 生成器 Python 处理文件 Python 异常处理 Python 处理输入输出 Python 处理命令行参数 Python 对文件做校验 Python 对目录做遍历 Python 调 ...
- Splash plugins_enabled 属性
plugins_enabled属性可以控制浏览器插件(如 Flash 插件)是否开启.默认情况下,此属性是 false ,表示不开启. function main(splash, args) spla ...