Batfish, outil Open Source d’analyse de configuration réseau

L’écosystème NetDevOps propose de nombreux outils pouvant être positionnés aux différentes étapes de la boucle interne de l’Intent-Based Networking. Dans une approche NetDevOps, Batfish permet de contrôler des configurations avant leur déploiement.

Batfish détecte les erreurs et garantit l’exactitude des configurations de réseau prévisionnelles ou actuellement utilisées. Il permet une évolution sûre et rapide du réseau, sans crainte de pannes ou de failles de sécurité.

Batfish a été initialement développé par des chercheurs de Microsoft Research, UCLA et USC. Beaucoup d’autres y ont contribué depuis. Il est actuellement maintenu par Intentionet, qui propose également Batfish Enterprise, un service qui étend et améliore les capacités de base de Batfish.

Batfish est un service qui tourne sous la forme d’un conteneur Docker. Batfish est conçu pour analyser une série de snapshots d’un réseau. Il faut voir le réseau comme un regroupement logique d’appareils, que ce soit tous les appareils du réseau ou un sous-ensemble. Un snapshot est un état du réseau à un instant donné. Un réseau peut contenir de nombreux snapshots, pour permettre de comprendre son évolution.

Batfish s’attend à ce que les données d’un snapshot soient organisées dans une structure de dossiers spécifique. Il est possible de fournir deux types de données à Batfish :

  • Les configurations des périphériques du réseau
  • Des données supplémentaires pour améliorer le modèle du réseau

Batfish prend en charge les constructeurs suivants :

  • A10
  • Arista
  • AWS
  • Cisco
  • Check Point
  • Cumulus Linux
  • F5 Big IP
  • Fortinet
  • Juniper
  • Palo Alto Networks
  • SONIC

Batfish peut détecter automatiquement le fournisseur d’un fichier de configuration en fonction de certains signes révélateurs dans les fichiers. Par exemple, les fichiers de configuration Arista ont tendance à contenir des lignes avec « ! device: … EOS-4.24 » ou « boot system flash … swi « . Ces lignes sont presque toujours présentes dans les fichiers de configuration extraits des appareils, mais peuvent ne pas être présentes dans les fichiers générés automatiquement. Dans ce dernier cas, il est possible de spécifier explicitement le fournisseur du fichier de configuration, en incluant l’en-tête RANCID. Ainsi, pour les appareils Arista, on peut inclure la ligne suivante en haut du fichier : !RANCID-CONTENT-TYPE: arista.

Après avoir initialisé ou défini un snapshot, il est possible d’interroger le service Batfish pour récupérer des informations sur le snapshot. Batfish expose une série de questions aux utilisateurs. À l’aide de ces questions, on peut examiner les données du réseau dans son ensemble ou seulement une partie des équipements, indépendamment du fournisseur.

Le modèle général pour les questions Batfish est :

  • bf.q.<question_name>() – Crée une question (avec des paramètres, le cas échéant)
  • bf.q.<question_name>().answer() – Envoie la question au service Batfish qui renvoie la réponse
  • bf.q.<question_name>().answer().frame() – Convertit la réponse en une trame de données Pandas pour faciliter la manipulation des données

Batfish construit un modèle comportemental du réseau sur la base des configurations et d’autres données qui lui sont fournies. On peut interroger le modèle de réseau ainsi que les paramètres de configuration à l’aide de plusieurs catégories de questions Batfish répertoriées ci-dessous :

  • Configuration Properties
  • Topology
  • Routing Protocol Sessions and Policies
  • Routing and Forwarding Tables
  • Packet Forwarding
  • Access-lists and firewall rules
  • Snapshot Input
  • IPSec Tunnels
  • VXLAN and EVPN
  • Resolving Specifiers
  • Differential Questions

Il y a une réflexion qui revient souvent lorsqu’il s’agit de parler de Batfish : « c’est un outil difficile à appréhender ». Comme tout outil de l’écosystème NetDevOps, il est nécessaire d’avoir des connaissances système et développement, en plus de celles du réseau, pour pouvoir l’utiliser. Si on pourrait être tenté de s’interroger sur la façon dont il a été conçu, il faut garder à l’esprit qu’il est plus fait pour être utilisé programmatiquement que de manière interactive. On peut même dire qu’il se prête bien à un usage automatisé dans un pipeline CI/CD pour une approche NetDevOps.

Bien que cette information ne soit pas souvent mise en avant dans la littérature, le produit embarque tout ce qu’il faut pour suivre ou donner un cours sur l’application Batfish. Voici, de manière très simple et sur la base d’une machine Ubuntu 20.04 avec docker-ce installé, comment mettre en oeuvre un cours Batfish :

docker run -d --name batfish -v batfish-data:/data -p 8888:8888 -p 9997:9997 -p 9996:9996 batfish/allinone

Tout est prêt pour démarrer le cours, il n’est pas nécessaire de mettre en place un environnement virtuel Python et installer pybatfish. Si vous souhaitez voir ce que le lancement du conteneur à généré comme messages, vous pouvez utiliser la commande : docker logs batfish.

Pour accéder au cours Jupyter, il suffit d’aller à l’URL : http://<votre adresse de serveur>:8888/

Un ensemble de cours sont disponibles pour découvrir l’usage de Batfish. Il s’agit de notebooks Jupyter, comme utilisés dans le domaine de l’enseignement/recherche. Un bon début est de commencer par le cours « Getting started with Batfish ». Le cours s’appuie sur une architecture décrite dans ce chapitre et dont les configurations ont été relevées pour être utilisées tout au long des chapitres. Le conteneur Batfish est totalement autonome pour ce cours et il pourra être utilisé ultérieurement pour des cas réels et concrets.

Batfish notebook-1
Introduction Batfish -1
Batfish notebook-2
Introduction Batfish -2
Batfish notebook-3
Introduction Batfish -3