[PYTHON] SLICECAP: traitement parallèle fractionné des fichiers PCAP

Analysez-vous les paquets?

Ceux qui analysent le trafic réseau ont utilisé la bibliothèque libpcap, ou même sans utiliser directement la libpcap [ tcpdump] Vous avez peut-être eu affaire à des fichiers au format PCAP capturés par (http://www.tcpdump.org/) etc.

De nombreux outils d'analyse du trafic prennent en charge le format PCAP, donc si vous conservez vos données dans ce format, vous pouvez être assuré que vous pourrez les utiliser avec divers outils plus tard. Les outils existants suffiront pour une analyse générale.

Cependant, en essayant d'effectuer une analyse avancée, il est tentant de regarder de plus près les données PCAP et la structure interne des paquets qui y sont contenus. Puisque les données au format PCAP sont presque les mêmes que les données binaires dans lesquelles les paquets sont répertoriés, il est nécessaire d'extraire et de traiter les parties nécessaires à l'aide d'un programme de prétraitement.

Récemment, les réseaux sont devenus plus rapides et même quelques minutes de capture peuvent parfois générer des dizaines de Go de données. Selon le contenu de l'analyse, à moins que la méthode n'ait déjà été établie, les données seront analysées à plusieurs reprises sous divers aspects à l'aide de diverses méthodes. Il n'y a pas de problème avec les petites données, mais à mesure que la quantité de données augmente, le temps requis pour le prétraitement ne peut être ignoré.

Dans cet article, nous présenterons le logiciel "** SLICECAP **" pour traiter des fichiers au format PCAP volumineux à grande vitesse.

Diviser et traiter

Le traitement parallèle est une pratique courante lorsque vous travaillez sur de grandes quantités de données. Tout d'abord, les données d'origine sont divisées en données plus petites, et chaque petite donnée est distribuée à plusieurs threads, processus et, dans certains cas, plusieurs serveurs pour un traitement parallèle.

J'aimerais travailler sur des fichiers au format PCAP de la même manière, mais j'ai un problème ici.

Puisque les données au format PCAP sont destinées à l'enregistrement d'un flux de paquets, il n'y a pas d'informations d'index pour chaque paquet. Les informations telles que le nombre de paquets contenus dans un fichier PCAP et le nombre d'octets que le 1000ème paquet du début commence sur le fichier doivent être examinées dans l'ordre depuis le début du fichier PCAP. ne pas. Ce processus est fortement chargé lors du fractionnement d'un fichier PCAP contenant un grand nombre de paquets.

Le format PCAP est brièvement illustré ci-dessous. La partie d'en-tête rouge est appelée l'en-tête global et contient les informations de l'ensemble des données PCAP. La partie en-tête bleue appelée en-tête de paquet et le bloc blanc qui le suit représentent un paquet, et la partie en-tête de paquet contient des informations spécifiques à chaque paquet. PCAP_FORMAT_FIGURE

Rappelez-vous le but

Maintenant, le but était de diviser le fichier au format PCAP en plus petites tailles. Puisqu'il est seulement nécessaire de diviser les données en plusieurs parties et de les traiter en parallèle, il n'est pas toujours nécessaire que le nombre de paquets contenus dans les données divisées soit le même. SLICECAP calcule la taille des données après division à partir du nombre de divisions spécifiées par l'utilisateur et de la taille du fichier PCAP entier, et recherche le délimiteur de paquet "** bien **" et le divise.

Les informations d'horodatage enregistrées dans chaque en-tête de paquet sont utilisées pour trouver la limite du paquet. Puisque les paquets sont enregistrés en continu, nous pouvons supposer que les valeurs d'horodatage pour chaque paquet sont similaires. Commencez par déplacer le pointeur de fichier vers une position appropriée pour le fractionnement, puis faites avancer le pointeur octet par octet, puis faites avancer le pointeur jusqu'à la position où l'horodatage d'une valeur similaire est enregistré. Après cela, il est vérifié si d'autres champs de l'en-tête de paquet ont des valeurs anormales, et s'il est jugé comme "** comme **", la division y est confirmée.

Les données divisées sont reconstruites au format PCAP en ajoutant un en-tête global et transmises au processus enfant par le mécanisme de communication inter-processus. Étant donné que les données PCAP divisées sont traitées par un processus séparé, les performances de traitement s'améliorent en fonction du nombre de cœurs.

Utilisons

À titre d'exemple, voici un exemple de division d'un fichier PCAP en 10 petits fichiers PCAP.

slicecap -r source.pcap -n 10 -- "cat - > dest-{SLICE_ID}.pcap"

Dans l'analyse réelle, vous spécifieriez un programme de filtrage un peu plus utile que cat.

La figure ci-dessous montre le temps de traitement lorsque les informations d'en-tête sont converties en CSV à l'aide de la commande p2c tout en augmentant le nombre de processus parallèles. est. SLICECAP_PARA_FIGURE Le PC utilisé pour la mesure est équipé de deux Intel Xeon E2697 v3 (14 cœurs) et 256 Go de mémoire. Le fichier PCAP de 58 Go a été analysé, l'en-tête IP / TCP / UDP a été extrait et le processus a été exécuté pour le sortir au format CSV. Vous pouvez voir que le temps de traitement est raccourci à mesure que le nombre de processus parallèles augmente. L'effet de l'hyperthreading n'a pas été tellement vu, probablement parce qu'il n'était complété que par une simple opération entière. Il peut être légèrement amélioré en fonction du contenu du traitement.

où obtenir

SLICECAP est enregistré dans le référentiel PyPi. Veuillez installer avec la commande pip. Le code source est disponible sur https://github.com/keiichishima/slicecap/. Bagrepo et Pururiku sont les bienvenus.

Recommended Posts

SLICECAP: traitement parallèle fractionné des fichiers PCAP
Traitement parallèle avec Parallel de scikit-learn
À propos du comportement de la file d'attente pendant le traitement parallèle
Traitement parallèle avec multitraitement
Divers traitements de Python