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

  1. git clone git@github.com:medcl/packetbeat.git
  2. cd packetbeat
  3. #添加官方仓库为upstream源
  4. git remote add upstream https://github.com/elastic/beats
  5. #获取上游最新的代码,如果是刚fork的话可不用管
  6. git pull upstream master

注意,如果你之前签出过packetbeat和libbeat或者topbeat等相关项目,请先从$GOPATH/src/github.com/elastic下移除,新的beats都已经合并到一个目录里面去了,如果你不移除,处理依赖的时候会有问题。

  1. #签出一个名为smtpbeat的分支,用于开发这个功能
  2. git checkout -b smtpbeat
  3. #获取依赖信息
  4. (mkdir -p $GOPATH/src/golang.org/x/&&cd $GOPATH/src/golang.org/x &&git clone https://github.com/golang/tools.git )
  5. (mkdir -p $GOPATH/src/github.com/elastic/ && cd $GOPATH/src/github.com/elastic && git clone https://github.com/elastic/beats.git )
  6. cd packetbeat
  7. go get github.com/tools/godep
  8. 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

  1. output:
  2. elasticsearch:
  3. enabled: true
  4. hosts: ["localhost:9200"]
  5. username: "tribe_user"
  6. password: "tribe_user"

现在可以运行命令启动packetbeat了,默认会监听所有内置的协议,如HTTP、DNS等。

  1. ./packetbeat -e -c etc/packetbeat.yml  -d "publish"

介绍一下常用的参数:
-N dry run模式,不实际output存储日志
-e 控制台输出调试日志
-d 仅显示对应logger的日志
好的,我们打开几个网页,控制台会有相应的输出,如下:

  1. 2015/12/29 14:24:39.965037 preprocess.go:37: DBG  Start Preprocessing
  2. 2015/12/29 14:24:39.965366 publish.go:98: DBG  Publish: {
  3. "@timestamp": "2015-12-29T14:24:39.709Z",
  4. "beat": {
  5. "hostname": "medcls-MacBook.local",
  6. "name": "medcls-MacBook.local"
  7. },
  8. "bytes_in": 31,
  9. "bytes_out": 115,
  10. "client_ip": "192.168.3.10",
  11. "client_port": 53669,
  12. "client_proc": "",
  13. "client_server": "",
  14. "count": 1,
  15. "direction": "out",
  16. "dns": {
  17. "additionals_count": 0,
  18. "answers": [
  19. {
  20. "class": "IN",
  21. "data": "www.a.shifen.com",
  22. "name": "sp2.baidu.com",
  23. "ttl": 333,
  24. "type": "CNAME"
  25. }
  26. ],
  27. "answers_count": 1,
  28. "authorities": [
  29. {
  30. "class": "IN",
  31. "data": "ns1.a.shifen.com",
  32. "expire": 86400,
  33. "minimum": 3600,
  34. "name": "a.shifen.com",
  35. "refresh": 5,
  36. "retry": 5,
  37. "rname": "baidu_dns_master.baidu.com",
  38. "serial": 1512240003,
  39. "ttl": 12,
  40. "type": "SOA"
  41. }
  42. ],
  43. "authorities_count": 1,
  44. "flags": {
  45. "authoritative": false,
  46. "recursion_allowed": true,
  47. "recursion_desired": true,
  48. "truncated_response": false
  49. },
  50. "id": 7435,
  51. "op_code": "QUERY",
  52. "question": {
  53. "class": "IN",
  54. "name": "sp2.baidu.com",
  55. "type": "AAAA"
  56. },
  57. "response_code": "NOERROR"
  58. },
  59. "ip": "192.168.3.1",
  60. "method": "QUERY",
  61. "port": 53,
  62. "proc": "",
  63. "query": "class IN, type AAAA, sp2.baidu.com",
  64. "resource": "sp2.baidu.com",
  65. "responsetime": 18,
  66. "server": "",
  67. "status": "OK",
  68. "transport": "udp",
  69. "type": "dns"
  70. }
  71. 2015/12/29 14:24:39.965774 preprocess.go:94: DBG  Forward preprocessed events
  72. 2015/12/29 14:24:39.965796 async.go:42: DBG  async forward to outputers (1)
  73. 2015/12/29 14:24:40.099973 output.go:103: DBG  output worker: publish 2 events

然后Elasticsearch应该就会有数据进去了,果然:

  1. curl http://localhost:9200/_cat/indices\?pretty\=true -u tribe_user:tribe_user
  2. yellow open packetbeat-2015.12.29  5 1   135  0 561.2kb 561.2kb

至此,源码的build已经成功,我们整个开发流程已经跑通了,下一节正式开始介绍SMTP协议的扩展。

Packetbeat协议扩展开发教程(1)的更多相关文章

  1. Packetbeat协议扩展开发教程 一

    原文链接:http://elasticsearch.cn/article/48 Packetbeat(https://www.elastic.co/products/beats/packetbeat) ...

  2. Packetbeat协议扩展开发教程(2)

    原文链接:http://elasticsearch.cn/article/53 书接上回:http://elasticsearch.cn/article/48 我们打开Packetbeat项目,看看里 ...

  3. Packetbeat协议扩展开发教程(3)

    原文链接:http://elasticsearch.cn/article/54 书接上回:http://elasticsearch.cn/article/53 前面介绍了Packetbeat的项目结构 ...

  4. PHP扩展开发教程(总结)

    PHP是一种解释型的语言,对于用户而言,我们精心的控制内存意味着easier prototyping和更少的崩溃!当我们深入到内核之后,所有的安全防线都已经被越过,最终还是要依赖于真正有责任心的软件工 ...

  5. HslCommunication库的二次协议扩展,适配第三方通讯协议开发,基础框架支持长短连接模式

    本文将使用一个gitHub开源的项目来扩展实现二次协议的开发,该项目已经搭建好了基础层架构,并实现了三菱,西门子,欧姆龙,MODBUS-TCP的通讯示例,也可以参照这些示例开发其他的通讯协议,并Pul ...

  6. Chrome扩展开发基础教程(附HelloWorld)

    1 概述 Chrome扩展开发的基础教程,代码基于原生JS+H5,教程内容基于谷歌扩展开发官方文档. 2 环境 Chrome 88.0.4324.96 Chromium 87.0.4280.141 B ...

  7. php扩展开发实战教程(1)

    我的开发环境: Ubuntu16.04 apt方式安装的php5.6, apache,mysql等 由于我的本机用的是apt方式安装的php,所以我这里从头开始用最精简的方式,编译安装一个php5.4 ...

  8. 黄聪:360浏览器、chrome开发扩展插件教程(3)关于本地存储数据

    转载:http://www.cnblogs.com/walkingp/archive/2011/04/04/2003875.html HTML5中的localStorage localStorage与 ...

  9. 黄聪:360浏览器、chrome开发扩展插件教程(1)开发Chrome Extenstion其实很简单

    转载:http://www.cnblogs.com/walkingp/archive/2011/03/31/2001628.html Chrome的更新速度可以说前无古人,现在我每天开机的第一件事就是 ...

随机推荐

  1. 搭建交叉调试环境 arm-linux-gdb配合gdbserver

        在嵌入式开发中,有时候需要进行源码级别的调试,可以设置断点,单步执行,相比于每步打印printf或者printk来说,更加友好.下面就来介绍这种调试方法.     gdb交叉调试类似于网络浏览 ...

  2. MBProgressHUD 第三方库使用

    关键操作:   效果如下:   ViewController.h #import <UIKit/UIKit.h> #import "MBProgressHUD.h" @ ...

  3. 【LSTM】Understanding-LSTMs

    http://colah.github.io/posts/2015-08-Understanding-LSTMs/

  4. 6 云计算系列之Nova安装与配置

    preface 上面安装好了glance,下面就开始部署nova计算服务了. nova组件介绍 首先介绍下nova各个组件. api 用来接收和响应外部的请求唯一途径,支持Openstack api, ...

  5. Oracle 初始化参数 二三事,随记

    (1) alter system set log_archive_dest_n='location=d:\一个存在的目录';  ---- 预期 但是如果“d:\一个存在的目录”不是一个有效的目录,则“ ...

  6. OpenLayers 比较有用的对象和属性

    1.ol.interaction.Pointer     是管理地图down.move.up事件的基类,也用于管理地图拖拽事件.     构造函数结构如下: new ol.interaction.Po ...

  7. linux环境中如何删除文件的前n行?

    需求描述: 今天看了一个系统的临时文件,有5.6G的大小,这个文件也没有用了,想要将大部分的文件都删除掉. 在此记录下删除的过程.删除前n行的记录. 操作过程: 对于数据量比较大的情况(本例5800万 ...

  8. ./configure、make、make install 命令

    https://www.cnblogs.com/tinywan/p/7230039.html https://www.sohu.com/a/191735643_505857 ./configure 该 ...

  9. [Algorithm] Beating the Binary Search algorithm – Interpolation Search, Galloping Search

    From: http://blog.jobbole.com/73517/ 二分检索是查找有序数组最简单然而最有效的算法之一.现在的问题是,更复杂的算法能不能做的更好?我们先看一下其他方法. 有些情况下 ...

  10. 为什么React事件处理函数必须使用Function.bind()绑定this?

    最近在React官网学习Handling Events这一章时,有一处不是很明白.代码如下: class Toggle extends React.Component { constructor(pr ...