js333 > 计算机互联网 > python实现linux下抓包并存库功能,基础教程

原标题:python实现linux下抓包并存库功能,基础教程

浏览次数:116 时间:2019-10-03

新近项目必要抓包功效,而且抓包后要对数据包实行存库并剖析。抓包想使用tcpdump来产生,不过tcpdump抓包之后只可以保留为文件,我要求将其保存到数据库。想来想去shell脚本就像是不太好完毕,于是用了相比看好的python来促成。不得不说,python丰盛的第三方库确实是很强劲,下边是具体的功效代码。

正文实例为大家大饱眼福了python调用tcpdump抓包过滤的切实代码,供我们仿效,具体内容如下

什么是tcpdump

    在Linux中输入指令man tcpdump给出的概念如下所示:

tcpdump - 转储网络上的数据流

是或不是认为很懵?咱们用通俗、形象、学术的表明方式来全部描述tcpdump:

  • 浅显的来说,tcpdump是三个抓包工具,用于抓取互连网中传输的数据包
  • 影像的来讲,tcpdump就像国家海关,凡是进入国境和出国的货物,海关都要抽检,看看里面具体是怎么着商品
  • 学术的来讲,tcpdump是一种Sniffer(嗅探器),利用以太网的表征,通过将互连网设施放置混杂情势来收获传输在网络中的消息包
在使用tcpdump需要了解以下的知识点:
1、了解和使用过Linux系统
2、学习OSI七层协议和作用
3、熟悉网络协议,特别是IP/TCP/UDP
4、了解交换机、路由器所对应的协议层且知道两者的差异
from apscheduler.scheduler import Scheduler
import os
import sys
import time
import MySQLdb
import ConfigParser
import Logger

def main():

  logger = Logger.Logger(logname='flowstat.log', loglevel=1, logger='flowstat').getlog()

  try:
    cf = ConfigParser.ConfigParser()
    cf.read('./flowstat.conf')

    filterNet1 = cf.get('packet', 'filterNet1')
    filterNet2 = cf.get('packet', 'filterNet2')
    packetFile = cf.get('packet', 'packetFile')

    db_host = cf.get('db', 'host')
    db_user = cf.get('db', 'user')
    db_passwd = cf.get('db', 'passwd')
    db_dbname = cf.get('db', 'dbname')

    conn = MySQLdb.connect(host=db_host, user=db_user, passwd=db_passwd, db=db_dbname, port=3306)

    os.system('nohup ./capturePacket.sh ' + filterNet1 + ' ' + filterNet2 + ' ' + packetFile + ' &')
  except Exception, e:
    logger.error(e)
    sys.exit(1)


  sched = Scheduler(daemonic = False)
  @sched.cron_schedule(day_of_week='0-4', hour='*', minute='0-59', second='*/60')
  def packagestat_job():
    logger.debug('stat package' + ' ' + time.strftime("%Y-%m-%d %H:%M:%S"))
    try:
      fos = open(packetFile, 'r+')
      lines = fos.readlines()
      values = []
      for line in lines:
        arr = line.split(',')
        if len(arr) > 4:
          values.append((arr[0].strip(), arr[2].strip(), arr[3].strip(), arr[4].strip()))

      if len(values) > 0:
        cur = conn.cursor()
        cur.executemany('insert into tbpk_packet(TimesMacs, LengthIps, Seq, Ack) values(%s,%s,%s,%s)', values)
        conn.commit()
        cur.close()

      fos.truncate(0)
      fos.close()
    except Exception, e3:
      Logger.error(e3)


  sched.start()

  while 1:
    time.sleep(60)

  conn.close()

if __name__ == '__main__':
  main()

shell脚本
#!/bin/sh
tcpdump -i eth0 -l >> *.txt

事先在linux用python脚本写贰个抓包深入分析小工具,实在不想用什么libpcap、pypcap所以,轻松来了个tcpdump加grep解决。基本思路是分别起tcpdump和grep多个经过,进度平素通过pipe交换数据,轻松代码如下:

骨干语法

tcpdump [选项] [网络接口]

常用选项如下所示:

选项 说明
-A 只显示ASCII形式的数据包内容
-c 就是Count的含义,指在接收到指定数量的分组包后退出,简单来说就是允许抓几个包
-d 将匹配信息包的编码以人们能够理解的格式进行显示并退出
-dd 将匹配信息包的编码以C语言程序段的格式显示
-ddd 将匹配信息包的编码以十进制的形式显示
-D 列出所有可以选择的抓包对象
-e 添加数据链路层的头部信息
-F 指定过滤表达式所在的文件
-i 即interface,指定监听的网络接口
-l 将输出变为行缓冲模式
-n 不将主机地址转换为名字
-nn 不转换协议和端口号,当tcpdump遇到协议号或端口号,不需要将这些数字转换为对应的协议名称或端口名称,如22端口SSH端口,我们希望显示22,而非SSH
-p 将网络接口设置为非混杂模式
-q 快速输出,仅输出较少的协议信息
-r 从文件中读取原始数据包,而这个文件通过由选项 -w 所产生
-t 在每一行中不输出时间戳
-tt 在每一行中输出非格式化的时间戳
-ttt 在每一行中输出本行与前一行的时间差,单位为ms
-tttt 在每一行中输出由date处理的默认格式的时间戳
-ttttt 在每一行中输出本行与第一行的时间差,单位为ms
-v 显示更详细的信息
-w 将原始数据包信息保存到文件中
-X 将协议头和包内容原原本本的显示出来

地点的成效涉及到了文件操作,数据库操作,定期职务等几个作用点。

#! /usr/bin/python

def tcpdump():
 import subprocess, fcntl, os
 # sudo tcpdump -i eth0 -n -s 0 -w - | grep -a -o -E "Host: .*|GET /.*"
 cmd1 = ['tcpdump', '-i', 'eth0', '-n','-B', '4096','-s', '0', '-w', '-']
 cmd2 = ['grep', '--line-buffered', '-a', '-o', '-E', 'Host: .*|GET /.*']
 p1 = subprocess.Popen(cmd1, stdout=subprocess.PIPE)
 p2 = subprocess.Popen(cmd2, stdout=subprocess.PIPE, stdin=p1.stdout)

 flags = fcntl.fcntl(p2.stdout.fileno(), fcntl.F_GETFL)
 fcntl.fcntl(p2.stdout.fileno(), fcntl.F_SETFL, (flags | os.O_NDELAY | os.O_NONBLOCK))
 return p2


def poll_tcpdump(proc):
 #print 'poll_tcpdump....'
 import select
 txt = None
 while True:
 # wait 1/10 second 
 readReady, _, _ = select.select([proc.stdout.fileno()], [], [], 0.1)
 if not len(readReady):
  break
 try:
  for line in iter(proc.stdout.readline, ""):
  if txt is None:
   txt = ''
  txt += line
 except IOError:
  print 'data empty...'
  pass
 break
 return txt


proc = tcpdump()
while True:
 text = poll_tcpdump(proc)
 if text:
 print '>>>> ' + text

示例

如果要使用tcpdump抓包,一定要切换到root账户中。

金沙js333娱乐场,1、第八个抓包示例

[root@localhost ~]# tcpdump -i ens5f1 -nn -X 'port 22' -c 1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens5f1, link-type EN10MB (Ethernet), capture size 262144 bytes
22:34:11.334916 IP 192.168.8.8.22 > 112.64.61.186.37035: Flags [P.], seq 3341229570:3341229782, ack 1999159071, win 31152, length 212
    0x0000:  4510 00fc 7e99 4000 4006 44a8 c0a8 0808  E...~.@.@.D.....
    0x0010:  7040 3dba 0016 90ab c727 1e02 7728 bf1f  p@=......'..w(..
    0x0020:  5018 79b0 7799 0000 0000 00b0 823d 4cf1  P.y.w........=L.
    0x0030:  1108 58fc 3686 2bd2 5220 fe37 85ab 74cc  ..X.6.+.R..7..t.
    0x0040:  bfb1 8831 7d1c 3b57 52ae aa91 28a2 67d8  ...1}.;WR...(.g.
    0x0050:  08fb a257 7fc8 7186 39dc d266 3d32 cce8  ...W..q.9..f=2..
    0x0060:  3eb7 130b a7d3 833b 59c9 bdf8 2141 6863  >......;Y...!Ahc
    0x0070:  7cae 25ff 459e c94a a635 7098 6925 db48  |.%.E..J.5p.i%.H
    0x0080:  a9b0 32ab 5393 737f cf8c f2ed b47a 7d8b  ..2.S.s......z}.
    0x0090:  346c 39df 3ecc d2b0 e0ad 5104 272d 6513  4l9.>.....Q.'-e.
    0x00a0:  4b8d 5ee6 6c7d 9477 e40b 8637 996a bb5a  K.^.l}.w...7.j.Z
    0x00b0:  471a 2ac4 3335 266d 0485 2e52 b2c2 f6e8  G.*.35&m...R....
    0x00c0:  0549 5ae0 9c7b ad45 da0a eef2 1ccb b2ac  .IZ..{.E........
    0x00d0:  a4a2 0a96 cc5f 238c 9570 0d15 984e 6f58  ....._#..p...NoX
    0x00e0:  d8ff 8034 1165 cf44 02e4 ed6b 631e 2548  ...4.e.D...kc.%H
    0x00f0:  56fd 4c8a 664c e5ee d845 2e50            V.L.fL...E.P
1 packet captured
1 packet received by filter
0 packets dropped by kernel

-i : 内定用来抓包的网络接口,这一个参数在服务器有多个网卡的时候特别实用
-nn : 不转变左券和端口号,当tcpdump碰着公约号或端口号,无需将那一个数字转换为对应的情商名称或端口名称,如22端口SSH端口,我们盼望展现22,而非SSH
-X : 将合计头和包内容原原本本的来得出来,tcpdump会同有的时候候以16进制和ASCII的样式开展呈现,在协商剖析时极其好用。
'port 22' : 告诉tcpdump要有选拔的显得所抓到的包,在该示例中,只呈现源端口或指标端口是22的数据包,别的的数码包则不展现。
-c : 用来钦命抓包的个数,示例设置的个数为1,则代表仅抓取三个包后头就退出不再抓包了。

2、-e 扩展数量链路层的头顶消息

  • 不带-e的抓包
[root@localhost ~]# tcpdump -i ens5f1 -c 1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens5f1, link-type EN10MB (Ethernet), capture size 262144 bytes
23:44:06.918259 IP localhost.localdomain.ssh > 112.64.61.186.37035: Flags [P.], seq 3341233794:3341234006, ack 1999165283, win 31152, length 212
1 packet captured
6 packets received by filter
0 packets dropped by kernel
  • 带-e的抓包
[root@localhost ~]# tcpdump -i ens5f1 -c 1 -e
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens5f1, link-type EN10MB (Ethernet), capture size 262144 bytes
23:45:51.114314 dc:fe:18:65:76:f2 (oui Unknown) > 34:97:f6:5a:50:e0 (oui Unknown), ethertype IPv4 (0x0800), length 82: 112.85.42.197.20263 > localhost.localdomain.ssh: Flags [P.], seq 254675888:254675904, ack 306708143, win 155, options [nop,nop,TS val 3668622988 ecr 391712180], length 16
1 packet captured
8 packets received by filter
0 packets dropped by kernel

    通过七个指令的出口相比较,能够看出扩展-e选项后,输出的结果中加进MAC地址消息。并且在输出内容中会有oui Unknown,OUI即Organizationally unique identifier(组织独一标记符),在别的一块网卡中烧录的6字节MAC地址中,前3个字节呈现了OUI,其申明了网卡的制作公司,平日意况下,该标记符是天下无双的。在本例中,由于没有辨别出网卡的创造商,由此显得为Unknown。

3、-l 将出口变为行缓冲情势

    -l的法力是将tcpdump的出口行为变为行缓冲主意,那样能够确认保障tcpdump蒙受换行符,就马上将缓冲的剧情输出到正规输出(stdout),方便利用管道或重定向格局实行三番两次管理,而不会促成延迟。
    在Linux的标准I/O中提供了全缓冲行缓冲无缓冲二种缓冲情势。标准错误是不带缓冲的,而终端设备常为行缓冲,别的暗许则为全缓冲。

[root@localhost ~]# tcpdump -i ens5f1 -l -c 5 | awk '{print $5}'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens5f1, link-type EN10MB (Ethernet), capture size 262144 bytes
112.64.61.186.37035:
gateway.domain:
localhost.localdomain.49348:
gateway.domain:
localhost.localdomain.ssh:
5 packets captured
13 packets received by filter
0 packets dropped by kernel

    在该例中,将tcpdump输出的剧情通过管道提取第5列,能够用来查阅详细的连接消息。而假诺不加 -l 选项时,则只有当缓冲区全体占满时,tcpdump才会将缓冲区中的内容输出,那样就有希望导致出口不一连的,假使强行终止,则会听得多了就能说的清楚下一行的完整性。

4、-t 输出不加时间戳

[root@localhost ~]# tcpdump -i ens5f1 -c 1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens5f1, link-type EN10MB (Ethernet), capture size 262144 bytes
23:48:03.193526 IP localhost.localdomain.ssh > 112.64.60.194.19101: Flags [P.], seq 3091447763:3091447975, ack 4113666212, win 251, length 212
1 packet captured
6 packets received by filter
0 packets dropped by kernel

[root@localhost ~]# tcpdump -i ens5f1 -c 1 -t
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens5f1, link-type EN10MB (Ethernet), capture size 262144 bytes
IP localhost.localdomain.ssh > 112.64.60.194.19101: Flags [P.], seq 3091448643:3091448855, ack 4113666488, win 251, length 212
1 packet captured
6 packets received by filter
0 packets dropped by kernel

    在加码选项-t慎选后,时间23:48:03.193126就流失了。tcpdump暗中同意情状下是按阿秒来计时,由此最二个年华规范到了第6位。

5、 -v 展现详细音信

[root@localhost ~]# tcpdump -i ens5f1 -c 1 -v
tcpdump: listening on ens5f1, link-type EN10MB (Ethernet), capture size 262144 bytes
23:53:13.252748 IP (tos 0x10, ttl 64, id 24820, offset 0, flags [DF], proto TCP (6), length 188)
    localhost.localdomain.ssh > 112.64.60.194.19101: Flags [P.], cksum 0x7661 (incorrect -> 0x2474), seq 3091449471:3091449619, ack 4113666972, win 251, length 148
1 packet captured
7 packets received by filter
0 packets dropped by kernel

    在增加-v选料后,会在输出的内容中扩展tosttlidoffset共谋编号总长度等,如须要通晓这么些音讯,就必要领悟TCP/IP左券中的头的实际定义了。

6、-F 钦定过滤表明式所在的公文
    在第五个示范中,命令行扩张了'port 22',而这一项就叫过滤条件,假若设置了过滤条件,则tcpdump只抓取满意过滤条件的数据包。如要求设置较为复杂的过滤条件或复用过滤条件时,那时能够将过滤条件保存为文件,然后经过-F加载该过滤文件。

[root@localhost ~]# cat tcpdumpFilter.txt
port 22

[root@localhost ~]# tcpdump -i ens5f1 -c 1  -v  -F ~/tcpdumpFilter.txt 
tcpdump: listening on ens5f1, link-type EN10MB (Ethernet), capture size 262144 bytes
00:05:52.685555 IP (tos 0x10, ttl 64, id 25291, offset 0, flags [DF], proto TCP (6), length 188)
    localhost.localdomain.ssh > 112.64.60.194.19101: Flags [P.], cksum 0x7661 (incorrect -> 0x827b), seq 3091492507:3091492655, ack 4113685300, win 251, length 148
1 packet captured
3 packets received by filter
0 packets dropped by kernel

7、 -w 将原始数据包音讯保存到文件中

[root@localhost ~]# tcpdump -i ens5f1 -c 1  -v  -F ~/tcpdumpFilter.txt -w ~/tcpdumpRAW
tcpdump: listening on ens5f1, link-type EN10MB (Ethernet), capture size 262144 bytes
1 packet captured
1 packet received by filter
0 packets dropped by kernel

[root@localhost ~]# cat tcpdumpRAW 
Ճ²¡¯OW[ߌ
        ˊݾev 
		

本文由js333发布于计算机互联网,转载请注明出处:python实现linux下抓包并存库功能,基础教程

关键词:

上一篇:Thinkphp模板没有解析直接原样输出的解决方法,模

下一篇:没有了