2014年3月13日星期四

构建故障分析平台采用python实现抓包分析数据包

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
构建故障分析平台采用python实现抓包分析数据包  阅读原文»

构建故障分析平台采用python实现抓包分析数据包

前言:

同事今天和我说,他现在的任务在做一个头疼的问题,说时尚了点,就是用自动化解脱心碎的运维杂事,他这边刚入职,貌似是带领一帮小弟解决别人搞不定的问题,但是有些业务部够单纯,把事直接抛给我同事这边。。。 很无敌吧。

所以计划做一个自动化平台,可以去问题端去抓数据,然后分析数据包,入库,邮件通知。 这个是自动化完成的。

我这里就说下,我的解决思路和开发思路:

工具:

pcap dpkt saltsatck mysql tornado tcpdump

pcap 是用来抓包

dpkt 是用来解析数据包的

celery 异步任务

实现两大功能,用户他自己抓包,然后上传到页面上,然后我后端解析后,返回结果。

用户在平台上提交问题服务器的ip,并选定测试类型,我这里会到服务端跑用python的pcap抓包并分析结果,把结果上报到平台。

关于自动抓包分析,以前和同事做过处理dns攻击的,方案流程和第三方的工具和我上述是一样的。

遇到攻击,会分析dns的攻击的特征,然后再黑洞系统注射特征码禁止。

需要注意的是,在抓数据的时候,可能会产生堵塞,尤其是pcap,dpkt这东西,需要在后台自己的玩。这个时候就需要用celery把抓包分析包的任务放在后台执行。 你要是觉得subprocess合理的话,也可以用用subprocess 的pipe的,但是个人觉得也是个办法 ,更简单的方法是用tcpdump -w 写到一个文件里面,然后用dpkt去解析,这样的话,也不用pcap去解析啦。

安装是相当的简单,不管是centos和ubuntu都已经有默认的源了,我这里用的是ubuntu的开发机跑测试:

  apt-get install python-libpcap  apt-get install libpcap-dev  apt-get install python-dpkt  pip install pypcap  

原文:http://rfyiamcool.blog.51cto.com/1030776/1374484

下面是抓取http数据包的写法,大家可以慢慢取值,慢慢分拆数据。

  #coding:utf-8  import pcap  import dpkt  import sys  aaa='a'  bbb='b'  pc=pcap.pcap()    #注,参数可为网卡名,如eth0  pc.setfilter('tcp port 80')    #设置监听过滤器  for ptime,pdata in pc:    #ptime为收到时间,pdata为收到数据      p=dpkt.ethernet.Ethernet(pdata)      if p.data.__class__.__name__=='IP':          ip='%d.%d.%d.%d'%tuple(map(ord,list(p.data.dst)))  #        print ip          if p.data.data.__class__.__name__=='TCP':              if p.data.data.dport==80:                  sStr1 = p.data.data.data                  sStr2 = 'Host: '                  sStr3 = 'Connection'                  sStr4 = 'GET /'                  sStr5 = ' HTTP/1.1'                  nPos = sStr1.find(sStr3)                  nPosa = sStr1.find(sStr5)                  for n in range(sStr1.find(sStr2)+6,nPos-1):                      aaa=sStr1[sStr1.find(sStr2)+6:n]                  for n in range(sStr1.find(sStr4)+4,nPosa+1):                      bbb=sStr1[sStr1.find(sStr4)+4:n]                  ccc=aaa+bbb                  print ccc  

wKiom1MgdWTAQvUhAAZy0kZJ1mU315.jpg

用wireshark瞅瞅:

wKiom1MgfnejrxTcAAV6QvLVjJk276.jpg

原文:http://rfyiamcool.blog.51cto.com/1030776/1374484

我前两天在做lvs操作平台的时候,额外加了一个针对vrrp的分析数据模块,大家可以举一反三在改改!

  #coding:utf-8  #xiaorui.cc  #http://rfyiamcool.blog.51cto.com/  import pcap  import dpkt  import binascii  import struct  a=pcap.pcap()  a.setfilter('vrrp')   # 可以是'tcp' 'udp' 'port 80'等过滤用的  for i,j in a:      tem=dpkt.ethernet.Ethernet(j)      print ("11111%s %x",i,tem)      src='%d.%d.%d.%d' % tuple(map(ord,list(tem.data.src)))      dst='%d.%d.%d.%d' % tuple(map(ord,list(tem.data.dst)))      print tem.data.tos      print tem.data.sum      print tem.data.len      print tem.data.ttl      print tem.data.id  #    print tem.data.data      print tem.data.data.priority      print src      print dst  

wKioL1MgdvjS2-R1AAbu-kg218M276.jpg

wKioL1MgfbSBvvZqAAY17azTPjc454.jpg

通过获取的数据,可以得知对端的vrrp情况,比如tos src dst vrrp主信息 !

好了,就这样了,过段时间再看看同事进行的如何,要是有新发现,给分享给大家的。

本文出自 "峰云,就她了。" 博客,谢绝转载!

分享至 一键收藏,随时查看,分享好友!
昵称:
登录快速注册
内容:
Python 分析Nginx 日志并存入MySQL数据库(单线程)  阅读原文»

Python 分析Nginx 日志并存入MySQL数据库(单线程)

使用Python 分析Nginx access 日志,根据Nginx日志格式进行分割并存入MySQL数据库。(参考网上一些文章)

Nginx access日志格式如下:

#使用的nginx默认日志格式$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for"'

Nginx access 日志内容如下:

182.19.31.129 - - [2013-08-13T00:00:01-07:00] "GET /css/anniversary.css HTTP/1.1" 304 0 "http://www.chlinux.net/" "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/28.0.1500.95 Safari/537.36" "-"

下面是Python 分析nginx的Python代码:

  #!/usr/bin/env python  #coding:utf8  import os  import fileinput  import re  import sys  import MySQLdb  #日志的位置  logfile=open("access_20130812.log")  #使用的nginx默认日志格式$remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for"'  #日志分析正则表达式  #203.208.60.230  ipP = r"?P<ip>[\d.]*"  #以[开始,除[]以外的任意字符 防止匹配上下个[]项目(也可以使用非贪婪匹配*?) 不在中括号里的.可以匹配换行外的任意字符 *这样地重复是"贪婪的" 表达式引擎会试着重复尽可能多的次数。#以]结束  #[21/Jan/2011:15:04:41 +0800]  timeP = r"""?P<time>\[[^\[\]]*\]"""  #以"开始, #除双引号以外的任意字符 防止匹配上下个""项目(也可以使用非贪婪匹配*?),#以"结束  #"GET /EntpShop.do?method=view&shop_id=391796 HTTP/1.1"  #"GET /EntpShop.do?method=view&shop_id=391796 HTTP/1.1"  requestP = r"""?P<request>\"[^\"]*\""""  statusP = r"?P<status>\d+"  bodyBytesSentP = r"?P<bodyByteSent>\d+"  #以"开始, 除双引号以外的任意字符 防止匹配上下个""项目(也可以使用非贪婪匹配*?),#以"结束  #"http://test.myweb.com/myAction.do?method=view&mod_id=&id=1346"  referP = r"""?P<refer>\"[^\"]*\""""  #以"开始, 除双引号以外的任意字符 防止匹配上下个""项目(也可以使用非贪婪匹配*?),以"结束  #"Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"'  userAgentP = r"""?P<userAgent>\"[^\"]*\""""  #以(开始, 除双引号以外的任意字符 防止匹配上下个()项目(也可以使用非贪婪匹配*?),以"结束  #(compatible; Googlebot/2.1; +http://www.google.com/bot.html)"'  userSystems = re.compile(r'\([^\(\)]*\)')  #以"开始,除双引号以外的任意字符防止匹配上下个""项目(也可以使用非贪婪匹配*?),以"结束  userlius = re.compile(r'[^\)]*\"')  #原理:主要通过空格和-来区分各不同项目,各项目内部写各自的匹配表达式  nginxLogPattern = re.compile(r"(%s)\ -\ -\ (%s)\ (%s)\ (%s)\ (%s)\ (%s)\ (%s)" %(ipP, timeP, requestP, statusP, bodyBytesSentP, referP, userAgentP), re.VERBOSE)  #数据库连接信息  conn=MySQLdb.connect(host='192.168.1.22',user='test',passwd='pass',port=3306,db='python')  cur=conn.cursor()  sql = "INSERT INTO python.test VALUES(%s,%s,%s,%s,%s,%s,%s,%s,%s)"  while True:      line = logfile.readline()      if not line:break      matchs = nginxLogPattern.match(line)      if matchs != None:          allGroup = matchs.groups()          ip = allGroup[0]          time = allGroup[1]          request = allGroup[2]          status = allGroup[3]          bodyBytesSent = allGroup[4]          refer = allGroup[5]          userAgent = allGroup[6]          Time = time.replace('T',' ')[1:-7]          if len(userAgent) > 20:              userinfo = userAgent.split(' ')              userkel =  userinfo[0]              try:                  usersystem = userSystems.findall(userAgent)                  usersystem = usersystem[0]                  print usersystem                  userliu = userlius.findall(userAgent)                  value = ]                  conn.commit()                  print value              except IndexError:                  userinfo = userAgent                  value =           else:              useraa = userAgent              value =       try:          result = cur.execute(sql,value)          #conn.commit()          print result      except MySQLdb.Error,e:          print "Mysql Error %d: %s" % (e.args[0], e.args[1])  conn.commit()  conn.close()  

存入数据库后数据是如下格式:

wKiom1MgfMShNk6QAAGUS4GGvss147.jpg

本文出自 "平凡的日子" 博客,请务必保留此出处http://wolfchen.blog.51cto.com/2211749/1374470

分享至 一键收藏,随时查看,分享好友!
昵称:
登录快速注册
内容:

阅读更多内容

没有评论:

发表评论