[PYTHON] Création d'un outil pour générer un diagramme de séquence à partir d'un fichier de capture de paquets de plusieurs nœuds

Création d'un outil pour générer un diagramme de séquence à partir d'un fichier de capture de paquets de plusieurs nœuds

1. Vue d'ensemble

J'ai créé un outil appelé packetseq qui génère un diagramme de séquence de paquets au format PNG à partir d'un fichier capturé simultanément par Wireshark ou tcpdump sur plusieurs nœuds du réseau. Le langage utilisé était Python, une bibliothèque qui crée des diagrammes de séquence appelés Seqdiag.

1-1. Contexte de la création d'outils

Afin d'étudier le retard réseau de l'environnement client au sein de l'entreprise, les paquets collectés au niveau de chaque nœud de communication ont été mis en correspondance. Comme le paquet est au format pcap, il a été visualisé avec WireShark. Wireshark a un outil appelé diagramme de flux qui affiche une connexion spécifique, mais j'ai abandonné car il ne peut pas être utilisé pour faire correspondre les paquets collectés à plusieurs endroits. Puisqu'il n'y a aucune aide pour cela, j'ai décidé de créer une séquence de paquets sur Excel. J'ai réduit le fichier de capture à une communication de port spécifique du client, exporté le paquet, l'ai converti au format CSV et créé un diagramme de séquence à la main sur Excel. Cela a été utile de discuter avec l'équipe, mais cela a pris trop de temps et je ne voulais pas répéter la même chose, j'ai donc créé un outil.

Environnement à ce moment-là (référence)

Http Client --- Internet --- LLB --- FW --- SLB --- Http Server

1-2. Ce dont vous avez besoin pour exécuter l'outil

"No.","Time","Source","Destination","Protocol","Length","Info"
 Format de la date et de l'heure (1973-06-14 01: 02: 03.123456)

1-3. Sites référencés

2. Flux

2-1. Construction de l'environnement

  1. Installez Python 2.7
$ curl -L -O https://www.python.org/ftp/python/2.7.12/Python-2.7.12.tgz
$ tar zxvf Python-2.7.12.tgz
$ cd Python-2.7.12
$ ./configure
$ make && make altinstall
  1. Installez pip
$ curl -kL https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python
  1. Modifié pour utiliser yum Correction de l'interpréteur de commandes yum pour exécuter Python existant (version 2.6)
$ vi /usr/bin/yum
 Exemple) Corrigé comme suit
!/usr/bin/python2.6
  1. Préparation de l'outil créé --Lors de l'utilisation comme commande
$ pip install packetseq

--Lorsque vous utilisez uniquement le programme Enregistrer dans l'environnement où packetseq.py est exécuté

2-2. Procédure d'utilisation (présentation)

  1. Capture de paquets à l'emplacement du chemin de communication
  2. Exportez uniquement la communication d'un port spécifique à partir du fichier de capture
  3. Enregistrer en tant que fichier csv
  4. Envoyez le fichier csv sur l'environnement d'exécution de l'outil créé cette fois
  5. Exécutez l'outil
  6. Entrez le nom de l'appareil opposé entre la communication depuis l'entrée standard
  7. Diagramme de séquence créé

2-3. Procédure d'utilisation (explication)

Cette fois, je vais vous expliquer comment l'utiliser en fonction de l'environnement suivant

 Client (Windows 7) --- Proxy (Squid) --- Serveur (nifty.com, etc.)
  1. Capture de paquets à l'emplacement du chemin de communication Wireshark a été utilisé sur Client (Windows 7) et tcpdump a été utilisé sur Proxy (Squid). Exemple) Capture de paquets sur le client
 Exécutez WireShark et enregistrez lorsque la communication est terminée
 Le nom de fichier est arbitraire, enregistrez-le sous client.pcap

Exemple) Capture de paquets sur un serveur proxy

$ tcpdump -i eth1 -w proxy.pcap
 Le nom du fichier est arbitraire, enregistrez-le sous proxy.pcap
  1. Exportez uniquement la communication d'un port spécifique à partir du fichier de capture Ouvrez le fichier que vous avez capturé plus tôt avec WireShark et réduisez-le à un port spécifique Plus précisément, vérifiez le numéro de port lors de l'envoi de l'indicateur SYN de la prise de contact à 3 voies. Filtrer sur WireShark
 tcp.port == numéro de port
  1. Enregistrer en tant que fichier csv Enregistrer au format csv avec WireShark Exemple) Capture de paquets sur le client
 Le nom du fichier est arbitraire, enregistrez-le sous client.csv

Exemple) Capture de paquets sur un serveur proxy

 Le nom du fichier est arbitraire, enregistrez-le sous proxy.csv
  1. Envoyez le fichier csv sur l'environnement d'exécution de l'outil créé cette fois
  2. Exécutez l'outil Puisqu'il y a deux points de collecte cette fois, transmettez les fichiers capturés précédemment comme arguments dans l'ordre de proximité du côté client et exécutez --Lors de l'installation à partir de pip, etc. et de l'utilisation des commandes à partir de
$ packetseq client.csv proxy.csv
$ python packetseq.py client.csv proxy.csv 
  1. Entrez le nom de l'appareil opposé entre la communication depuis l'entrée standard Vous serez invité par l'entrée standard à entrer le nom deux fois, source-ip et destination-ip pour chaque fichier L'exemple ci-dessous est entre le client et le proxy, j'ai donc choisi "Client" et "Proxy".
\########################################
file_name:client.csv
\########################################
src ip:192.168.1.3 -> src name: ???
 entrée src nom> Client (★ entrée standard)
dst ip:192.168.1.62 -> dst name: ???
 entrée nom dst> Proxy (★ entrée standard)

Ensuite, une entrée est également requise entre les serveurs proxy, j'ai donc choisi "Proxy" et "Sever".

\########################################
file_name:proxy.csv
\########################################
src ip:192.168.1.3 -> src name: ???
 entrée src nom> Proxy (★ entrée standard)
dst ip:192.168.1.62 -> dst name: ???
 entrée nom dst> Serveur (★ entrée standard)
  1. Diagramme de séquence créé Les fichiers out.png et out.diag sont créés out.png est un diagramme de séquence au format PNG Fichier au format Seqdiag à partir duquel out.diag était la source de la génération d'image
$ file out.*
out.diag: ASCII text, with very long lines
out.png:  PNG image data, 1856 x 31706, 8-bit/color RGBA, non-interlaced

De gauche, c'est un diagramme de séquence de "Client", "Proxy", "Web" packetseq_img.png
Cela vous donnera une séquence de paquets à plusieurs endroits

3. À propos des outils

3-1. Code source

Voir packetseq.py

3-2. Déroulement du processus

  1. Passez le fichier csv comme argument
  2. Détectez la communication entre les communications du drapeau SYN pour chaque fichier 3.2 Passer le nom du nœud opposé en 2 comme entrée standard
  3. Remplacez l'adresse IP par le nom spécifié en 3.
  4. Sortie au format Seqdiag
  5. Passer à Seqdiag pour afficher l'image

3-3. Facultatif

option La description Remarques
-h, --help Afficher le message d'aide -
-o, --nom du fichier de sortie Spécifiez le nom du fichier de destination de sortie -
-i, --info Type de sortie Sélectionnez la sortie des informations de paquet sur la séquence Le type de sortie est résumé, info,Choisissez parmi 3 valeurs par défaut
-t, --type Sélectionnez png ou svg comme format de sortie -

3-4. Spécification des couleurs

mot-clé de couleur css peut être spécifié Exemple) Spécification sur le code source

tcp flag color
SYN blue
SYN ACK red
ACK green
FIN navy
FIN ACK maroon
RST purple
RST ACK fuchsia
URG olive
PSH orange
Other gray

Les paramètres de couleur sont spécifiés dans self.color_dict de la fonction \ __ init__

 #Dictionary des informations de couleur
        self.color_dict = {
            'SYN': "blue", 'SYN ACK': "red",
            'ACK': "green",
            'FIN': "navy", 'FIN ACK': "maroon",
            'RST': "purple", 'RST ACK': "fuchsia",
            'URG': "olive", 'PSH': "orange",
            'Other': "gray",
        }

3-5. Sortie des informations sur les paquets

  1. "summary" indicateur tcp et données transmises uniquement summary.png
  2. "info" info Affichage complet des données info.png
  3. "default" Supprimer le sport et le port default.png

4. Défis

5. Attention

Recommended Posts

Création d'un outil pour générer un diagramme de séquence à partir d'un fichier de capture de paquets de plusieurs nœuds
Écrire la sortie standard dans un fichier
Comment afficher le résultat de sortie de la commande man Linux dans un fichier
Exporter les résultats de la recherche de publication dans un fichier à l'aide de l'API Mattermost
J'ai créé un outil pour générer du Markdown à partir du fichier JSON Scrapbox exporté
Du fichier Excel à l'exe et sortie de l'outil qui crache le CSV
Création d'un outil de visualisation mécanique à partir de l'historique du référentiel afin de connaître objectivement la productivité et la solidité de l'équipe de développement
Création d'un module pour surveiller les mises à jour des fichiers et des URL
Faire une copie d'un fichier Google Drive à partir de Python
Script Python qui crée un fichier JSON à partir d'un fichier CSV
Sortie d'un vidage binaire en binaire et retour dans un fichier binaire
Procédure de la construction de l'environnement au test de fonctionnement de testinfra, un outil de test d'environnement de serveur réalisé par Python
J'ai créé un outil pour générer automatiquement un simple diagramme ER à partir de l'instruction CREATE TABLE