Статья на моем сайте: http://snakeproject.ru/rubric/article.php?art=python_netflow_collector_1
И так, это - первая часть статей по написанию netflow коллектора, тут представлен простейший вариант flowколлектора версии протокола flow 5 написанного на языке Python 2.7
В будующих статьях я прикручу возможность выбора складирования в файлы и sql.
#коллектор netflow ver. 5
#для работы с сокетами - модуль socket
#функции для преобразования между Python и Cи структурами - struct
#для работы с датой и временем - datetime
import socket, struct, datetime
#размер заголовка и записи
#Значения взяты из http://www.cisco.com/c/en/us/td/docs/net_mgmt/netflow_collection_engine/3-6/user/guide/format.html#wp1006108
HEADER = 24
RECORD = 48
#Создаем сокет UDP и запускаем прослушиватель
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
sock.bind(('192.168.45.63', 777))
datagram, addr = sock.recvfrom(1500)
while True:
#Принимаем данные с маршрутизатора
datagram, addr = sock.recvfrom(1500)
#struct.unpack - распаковывает строку, содержащую упакованные данные структуры Си в соответствие с данными форматов
#возвращает кортеж, даже если строка содержит один элемент
#строка должна содержать количество информации указнное форматом
#распаковка двоичных данных
(ver, count) = struct.unpack('!HH',datagram[0:4])
if ver != 5: break
#преобразование 32-битного целого числа из сети в машинную последовательность байт
#время на маршрутизаторе в формате epoch/Unix timestamp конвертируем в формате %Y-%m-%d %H:%M:%S
epoch = datetime.datetime.fromtimestamp(int(socket.ntohl(struct.unpack('I',datagram[8:12])[0]))).strftime('%Y-%m-%d %H:%M:%S')
#Перебор данных
for i in range(0, count):
try:
base = HEADER+(i*RECORD)
data = struct.unpack('!IIIIHH',datagram[base+16:base+36])
nfdata = {}
#socket.inet_ntoa - преобразование IP адреса в 32-разрядном двоичном формате в формат строки
nfdata['saddr'] = socket.inet_ntoa(datagram[base+0:base+4])
nfdata['daddr'] = socket.inet_ntoa(datagram[base+4:base+8])
nfdata['pcount'] = data[0]
nfdata['bcount'] = data[1]
nfdata['sport'] = data[4]
nfdata['dport'] = data[5]
except:
continue
print "%s:%s -> %s:%s packets:%s bytes:%s time:%s" % (nfdata['saddr'],nfdata['sport'],nfdata['daddr'],nfdata['dport'],nfdata['pcount'],nfdata['bcount'],epoch)