Verkehrsüberwachung mit Kibana, ElasticSearch und Python

Motivation

Dashboard イメージ

ElasticSearch Install

$ brew install elasticsearch
$ elasticsearch -v
Version: 1.4.4, Build: c88f77f/2015-02-19T13:05:36Z, JVM: 1.7.0_72

Download Kibana

$ wget https://download.elasticsearch.org/kibana/kibana/kibana-4.0.1-darwin-x64.tar.gz
$ tar zxvf kibana-4.0.1-darwin-x64.tar.gz

Python Library

$ pip install pyshark elasticsearch requests

Execute

$ python packet_cap_es.py <interface>

Python Script

"""
This app captures packets and extract five tupels.
Store these data to elastic search.
Elastic search and kibana creates real time packet monitering
bashbord.
"""
import json
import sys
import datetime
import time

import pyshark
import requests
from elasticsearch import Elasticsearch
from elasticsearch import helpers

URL = "http://localhost:9200"
INDEX_URL = URL + "/packets"
TYPE_URL = INDEX_URL + "/packet"
ACTION = {"_index" : "packets",
          "_type" : "packet",
          "_source": {}
         }


def delete_index():
    """Delete an index in elastic search."""
    requests.delete(INDEX_URL)


def create_index():
    """Create an index in elastic search with timestamp enabled."""
    requests.put(INDEX_URL)
    setting = {"packet" : {
                "_timestamp" : {
                    "enabled" : True,
                    "path" : "capture_timestamp",
                },
                "numeric_detection" : False,
                "properties" : {
                    "dstip" : { "type":"string",
                                "index" : "not_analyzed",
                                "store" : True},
                    "srcip" : { "type":"string",
                                "index" : "not_analyzed",
                                "store" : True}
                }
            }}
    for _ in range(1, 100):
        try:
            r = requests.put(TYPE_URL + "/_mapping", data=json.dumps(setting))
            break
        except:
            time.sleep(1)
            pass

def main():
    """Extract packets and store them to ES"""
    capture = pyshark.LiveCapture(interface=sys.argv[1])
    packet_que = list()
    es = Elasticsearch()

    end_time = None
    for packet in capture.sniff_continuously():
        if packet.transport_layer in ("UDP", "TCP"):
            try:
                # Why does ES add 9 hours automatically?
                localtime = float(packet.sniff_timestamp) - 60 * 60 * 9  # GMT + 9
                row_timestamp = datetime.datetime.fromtimestamp(localtime)
                timestamp = row_timestamp.strftime("%Y-%m-%dT%H:%M:%SZ")
                version = int(packet[1].version)
                # ip v6 does not have protocol. It has next header instead.
                if version == 4:
                    protocol = int(packet[1].proto)
                elif version == 6:
                    protocol = int(packet[1].nxt)
                else:
                    protocol = None

                dstip = packet[1].dst
                srcip = packet[1].src
                dstport = int(packet[2].dstport)
                srcport = int(packet[2].srcport)
                parsed_packet = dict(version=version, protocol=protocol,
                                     dstip=dstip, srcip=srcip,
                                     dstport=dstport, srcport=srcport,
                                     capture_timestamp=timestamp)
                # For historical graph
                parsed_packet["@timestamp"] = timestamp
                action = ACTION.copy()
                action["_source"].update(parsed_packet)
                packet_que.append(action)
                current = time.time()
                while(end_time is None or current - end_time >= 3):
                    helpers.bulk(es, packet_que)
                    del packet_que[0:len(packet_que)]
                    end_time = time.time()
                    break

            except Exception as e:
                time.sleep(1)


if __name__ == "__main__":
    if len(sys.argv) != 2:
        print >>sys.stderr, "python packet_cap_es.py <interface>"
        exit(1)
    delete_index()
    create_index()
    main()

Recommended Posts

Verkehrsüberwachung mit Kibana, ElasticSearch und Python
Programmieren mit Python und Tkinter
Python und Hardware-Verwenden von RS232C mit Python-
[Python] Ordnerüberwachung mit Watchdog
Python mit Pyenv und Venv
Funktioniert mit Python und R.
Site-Überwachung und Alarmbenachrichtigung mit AWS Lambda + Python + Slack
Kommunizieren Sie mit FX-5204PS mit Python und PyUSB
Leuchtendes Leben mit Python und OpenCV
Roboter läuft mit Arduino und Python
Installieren Sie Python 2.7.9 und Python 3.4.x mit pip.
Neuronales Netzwerk mit OpenCV 3 und Python 3
Scraping mit Node, Ruby und Python
Scraping mit Python, Selen und Chromedriver
Kratzen mit Python und schöner Suppe
JSON-Codierung und -Decodierung mit Python
Hadoop-Einführung und MapReduce mit Python
[GUI in Python] PyQt5-Drag & Drop-
Ich habe mit PyQt5 und Python3 gespielt
Lesen und Schreiben von CSV mit Python
Mehrfachintegration mit Python und Sympy
Koexistenz von Python2 und 3 mit CircleCI (1.0)
Sugoroku-Spiel und Zusatzspiel mit Python
FM-Modulation und Demodulation mit Python
Kommunizieren Sie mit gRPC zwischen Elixir und Python
Datenpipeline-Aufbau mit Python und Luigi
Berechnen Sie das Standardgewicht und zeigen Sie es mit Python an
Haustierüberwachung mit Rekognition und Raspberry pi
Überwachen Sie Mojo-Ausfälle mit Python und Skype
Geräteüberwachung durch On-Box Python von IOS-XE
FM-Modulation und Demodulation mit Python Part 3
Python-Installation und Paketverwaltung mit pip
Verwenden von Python und MeCab mit Azure Databricks
POST verschieden mit Python und empfange mit Flask
Bilder mit Pupil, Python und OpenCV aufnehmen
Fraktal zum Erstellen und Spielen mit Python
Ein Memo mit Python2.7 und Python3 in CentOS
Verwenden Sie PIL oder Pillow mit Cygwin Python
Erstellen und entschlüsseln Sie Caesar-Code mit Python
CentOS 6.4, Python 2.7.3, Apache, mod_wsgi, Django
Lesen und Schreiben von JSON-Dateien mit Python
Umgang mit "Jahren und Monaten" in Python
Ich habe Numba mit Python3.5 installiert und verwendet
Tweet-Analyse mit Python, Mecab und CaboCha
Verknüpfung von Python und JavaScript mit dem Jupiter-Notizbuch
FM-Modulation und Demodulation mit Python Part 2
Mit Ruby (Rails) verschlüsseln und mit Python entschlüsseln
Laden Sie einfach mp3 / mp4 mit Python und youtube-dl herunter!
Betreiben Sie Haushaltsgeräte mit Python und IRKit
"Erste elastische Suche" beginnend mit einem Python-Client
Bereinigen Sie die Python-Umgebung mit Pythonz und virtualenv
Üben des Web-Scrapings mit Python und Selen
Einfaches Web-Scraping mit Python und Ruby
Importieren und Exportieren von GeoTiff-Bildern mit Python
Ich verwende Tox und Python 3.3 mit Travis-CI
Fröhliche GUI-Konstruktion mit Elektron und Python
Verwenden Sie Python und MeCab mit Azure-Funktionen
Berühren Sie AWS mit Serverless Framework und Python
RaspberryPi L Chika mit Python und C #