аукцион / FPR / donate / услуги / RSS / распечатать / вход 
Мой мир
Вконтакте
Одноклассники

[1 марта 2021 | 2 марта 2021 | 10 марта 2021]

NetFlow v5 Python (часть 5) запись в MySQL

По сути финальная часть всего проекта — это запись Netflow в базу данных. В дальнейшем можно будет писать разборщик пакетов и вывод красивых графиков с использованием данных хранимых в БД. Как самый частый в бесплатных и опенсорсных проектах был выбран MySQL. Эта программа берёт файл с Netflow-пакетами и записывает их в нашу БД. Если таблицы с данными нет, то она будет создана автоматически. В общем, необходимо будет только заполнить переменные с адресом MySQL-сервера, именем пользователя, паролем и именем базы. Дальше программа сама разберётся, что ей делать.

Вопрос о том как дальше разбирать данные будет решаться совсем другими методами.

#!/usr/bin/python3
# -*- Mode: Python; tab-width: 4 -*-
#       Id: analysis-sql.py, v 1.01 2021
#       Author: Ivan Kurilko 
#       https://orcinus.ru
# ======================================================================
# Copyright 2020 by Ivan Kurilko aka Orcinus Orca
#
#                         All Rights Reserved
#
# Permission to use, copy, modify, and distribute this software and
# its documentation for any purpose and without fee is hereby
# granted, provided that the above copyright notice appear in all
# copies and that both that copyright notice and this permission
# notice appear in supporting documentation, and that the name of Ivan
# Kurilko not be used in advertising or publicity pertaining to
# distribution of the software without specific, written prior
# permission.
#
# IVAN KURILKO DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
# INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
# NO EVENT SHALL IVAN KURILKO BE LIABLE FOR ANY SPECIAL, INDIRECT OR
# CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
# OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
# NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
# CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
# ======================================================================

import socket, struct, pymysql.cursors, os

SIZE_OF_ORCA_RECORD = 35

file_name = 'collect/192.168.0.1/448460'
logs_out = ''

# Подключаем базу данных на MySQL(MariaDB)
sql_server = 'localhost'
sql_user = 'netflow'
sql_password = 'pasword_for_MySQL'
sql_basename = 'netflow'
sql_conn = pymysql.connect(sql_server, sql_user, sql_password, sql_basename)

sql_cursor = sql_conn.cursor()

sql_cursor.execute('SHOW TABLES;')
tup = tuple(i[0] for i in sql_cursor)
if not ('fw_collect' in tup):
   sql = 'CREATE TABLE IF NOT EXISTS `fw_collect` ('
   sql += '`ID` int unsigned NOT NULL AUTO_INCREMENT,'
   sql += '`ipdevice` int(11) unsigned NOT NULL default \'0\','
   sql += '`startpkt` int(11) unsigned NOT NULL default \'0\','
   sql += '`srcaddr` int(11) unsigned NOT NULL default \'0\','
   sql += '`src_mask` tinyint(3) unsigned NOT NULL default \'0\','
   sql += '`srcport` smallint(5) unsigned NOT NULL default \'0\','
   sql += '`if_input` smallint(5) unsigned NOT NULL default \'0\','
   sql += '`dstaddr` int(11) unsigned NOT NULL default \'0\','
   sql += '`dst_mask` tinyint(3) unsigned NOT NULL default \'0\','
   sql += '`dstport` smallint(5) unsigned NOT NULL default \'0\','
   sql += '`if_output` smallint(5) unsigned NOT NULL default \'0\','
   sql += '`dpkts` int(11) unsigned NOT NULL default \'0\','
   sql += '`doctets` int(11) unsigned NOT NULL default \'0\','
   sql += '`prot` tinyint(3) unsigned NOT NULL default \'0\','
   sql += 'PRIMARY KEY (`ID`)'
   sql += ') ENGINE=MyISAM DEFAULT CHARSET=utf8;'

   sql_cursor.execute(sql)
   print('Create SQL table: fw_collect')
   logs_out += 'Create SQL table: "fw_collect"\n'

print('Start Netflow convertor for:', file_name)

buf = open(file_name+'.bin', "rb").read()
outpackets = ''

file_size = len(buf)
flow_count = file_size//SIZE_OF_ORCA_RECORD
flow_sequence_start = 0
flow_break = 0

logs_out += 'Open file: '+file_name+' size: '+str(file_size)+' flows: '+str(flow_count)

for i in range(0, flow_count):
   # Смещение 
   offset = i*SIZE_OF_ORCA_RECORD

   # Заполняем переменные
   (ipdevice, flow_sequence, startpkt,
      srcaddr, src_mask, srcport, if_input,
      dstaddr, dst_mask, dstport, if_output,
      dpkts, doсtets, prot) = struct.unpack('!IIIIBHHIBHHHHB',buf[offset:offset+SIZE_OF_ORCA_RECORD])

   if flow_sequence_start == 0: flow_sequence_start = flow_sequence-1

   if flow_sequence_start != flow_sequence-1:
      flow_break += flow_sequence-flow_sequence_start-1

   flow_sequence_start = flow_sequence

   sql = 'INSERT INTO `fw_collect` ('
   sql += '`ipdevice`,`startpkt`,`srcaddr`,`src_mask`,`srcport`,`if_input`,'
   sql += '`dstaddr`,`dst_mask`,`dstport`,`if_output`,`dpkts`,`doctets`,`prot`)'
   sql += ' VALUES ('+str(ipdevice)+','+str(startpkt)+','
   sql += str(srcaddr)+','+str(src_mask)+','+str(srcport)+','+str(if_input)+','
   sql += str(dstaddr)+','+str(dst_mask)+','+str(dstport)+','+str(if_output)+','
   sql += str(dpkts)+','+str(doсtets)+','+str(prot)+')'

   sql_cursor.execute(sql)
   sql_conn.commit()

os.replace(file_name+'.bin', file_name+'.old')

logs_out += ' loss flow: '+str(flow_break)+'\n'

with open('analysis-sql.log', 'a') as file:
   file.write(logs_out)
   file.close()

Запустив обход ваших файлов с Netflow вы перенесете данные в MySQL. Обратите внимание, что программа переименует файл с данными из .bin в .old

Вот так выглядит таблица заполненная данными.

Cisco NetFlow Python SQL.

На этом можно считать цикл статей о написании коллектора и анализатора для Netflow на Python законченным. Если у вас появятся вопросы, то не стесняйтесь их задавать. Если вы вдруг захотите использовать данную программу для своих нужд, то не забывайте, что коллектор надо обязательно отделять от анализатора. На Питоне сделать их совместно практически не реально, слишком прожорлив данный язык программирования.

Так же обратите внимание, что коллектор должен быть запущен всегда. Анализатор-конвертор должен запускаться не чаще чем идет сохранение одного файла с данными. Естественно, что это не показывает данные в реальном времени, но позволяет оптимально распределить время сбора и время обработки информации.

Тэги: ИТ, Cisco, программирование, Питон

Отредактировано:2021-03-02 10:42:21


Этот сайт использует файлы cookies, чтобы упростить вашу навигацию по сайту, предлагать только интересную информацию и упростить заполнение форм. Я предполагаю, что, если вы продолжаете использовать мой сайт, то вы согласны с использованием мной файлов cookies. Вы в любое время можете удалить и/или запретить их использование изменив настройки своего интернет-браузера.

Сообщайте мне о замеченных ошибках на: web@orcinus.ru. Все пожелания и советы будут учтены при дальнейшем проектировании сайта. Я готов сотрудничать со всеми желающими. В некоторых случаях, мнение автора может не совпадать с мнением автора! Phone: +7-902-924-70-49.

Top.Mail.Ru
Top.Mail.Ru LiveInternet Rambler's Top100 Яндекс.Метрика