JOGA Aurélien Rapport technique CACTI chez SECR Tuteur en entreprise Enseignant responsable : RIVAT Geoffroy : ROUSSEL Olivier Année scolaire 2009-2010 Département informatique
Table des matières I) Introduction...1 II) Choix architecturaux...2 1) Choix logiciels...2 2) Choix matériels...3 III) Procédure d'installation...5 IV) Configuration...13 V) Weathermap...18 1) Modélisation préliminaire...18 2) Paramètres de base...19 3) Placement des nodes...21 4) Placement des liens...21 VI) Conclusion...24
I) Introduction Cacti est un logiciel permettant de collecter, stocker et exploiter des données numériques en vue de les restituer sous forme de graphiques. Chez SECR et sur cette installation de Cacti, seuls des débits réseau seront gérés. Le besoin est ici de générer des graphiques de bande passante au 95 e centile 1 pour chaque client afin d'avoir une base de facturation. Un accès individuel devra être fourni à chaque client. Le graphique par client représentera la bande passante IP du VLAN du client comptabilisée sur les routeurs où le VLAN du client rejoint internet. Cacti utilise le protocole SNMP pour communiquer avec les routeurs et switchs du réseau. SNMP (Simple Network Management Protocol) est un protocole prévu pour l'extraction d'informations à distance sur les périphériques en réseau. La plateforme que je vais mettre en place est prévue pour fonctionner pour au moins cinq ans. Ce rapport technique va expliquer comment a été mise en place l'installation du Cacti et donner des pistes pour sa maintenance voire sa réinstallation future. 1 95 e centile : Méthode de facturation de la bande passante. On facture au client le débit maximum qu'il a consommé en dehors des 5% des plus grandes mesures. On évite ainsi de facturer d'éventuels besoins ponctuels, des erreurs de mesure,... Ici, le débit au 95 te centile est de 60Mbits malgré les pointes à plus de 150Mbits. Ces pointes ne seront pas comptabilisées dans la facturation car non représentatives de la consommation typique. Page 1
II) Choix architecturaux 1) Choix logiciels Cacti a été choisi pour plusieurs raisons. Il fourni une interface web très simple et centralisée pour l'ajout/modification/suppression de périphériques à gérer, de graphiques. La création de graphiques se base sur des modèles (templates) réutilisables très simplement. Il inclut une gestion des utilisateurs avec différents niveaux d'accès : cette fonction sera utilisée pour fournir un accès à chaque client à ses graphiques de consommation de bande passante. Il est possible d'organiser l'affichage des graphiques librement. Cacti 0.8.7e, dernière version disponible sur le site officiel (www.cacti.net) sera utilisée. Cacti utilise RRDTool (Round Robin Database Tool) pour stocker et grapher les valeurs qu'il gère. Le nom de ce logiciel vient du principe de stockage utilisé. En simplifiant, un fichier où seront stockées des valeurs suit le principe des files. Le type de ces valeurs sont définis à la création du fichier. Cette organisation permet d'avoir un fichier d'une taille fixe, avec une optimisation du temps le recherche de l'emplacement d'une donnée pour sa lecture ou sa mise à jour. Dans la mesure où un serveur risque de ne faire que du monitoring, l'optimisation des entrées/sorties est un élément clef. Cacti peut se voir enrichi de fonctionnalités via Plugin Architecture for Cacti (http://cactiusers.org/wiki/pluginarchitectureinstall). Il s'agit d'une modification pour Cacti visant à rendre l'installation, le développement et l'utilisation de plugins pour Cacti plus facile et intuitive. J'utiliserais Plugin Architecture for Cacti pour utiliser le plugin Weathermap. Celui-ci permet de générer une cartographie du réseau pour représenter l'utilisation en temps réelle de celui-ci. Cacti dispose de base d'un outil pour recueillir les données à grapher via SNMP. Cependant, cet outil est écrit intégralement en PHP. PHP ne gère pas les threads et induit un overhead non négligeable lorsqu'il est utilisé pour faire des taches assez longues ou lourdes. C'est pourquoi un logiciel faisant exactement le même travail que l'outil de Cacti a été réécrit, mais cette fois en C. Il s'agit de Spine. Vu la quantité de données qu'il faudra gérer, j'ai décidé d'utiliser Spine dans sa version la plus récente, la 0.8.7e. Le système d'exploitation choisi est Ubuntu server 10.04 LTS. Page 2
Ubuntu server est une distribution linux très connue et populaire. Elle a été choisie pour sa facilité d'administration, pour la rapidité dont les mises à jour sont mises à disposition et par uniformisation des systèmes d'exploitations utilisés au sein de SECR. La mention «LTS» signifie que la distribution sera mise à jour et supportée par Canonical (société éditrice de Ubuntu) pendant cinq ans. La version 10.04 a été choisi car c'est la version LTS la plus récente. Cacti utilise MySQL. MySQL sera installé dans sa version disponible par les dépôts Ubuntu. Apache, php5 et les autres dépendances seront installés de la même façon. Concernant Cacti et Spine, de part les modifications qui leur seront apportées et par soucis de stabilité, ceux-ci ne seront pas installés via paquets mais via leurs dernières sources stables disponibles au moment de l'écriture de ce document. Afin de faire une cartographie rapide du réseau avant sa transposition en weathermap, le logiciel Dia sera utilisé. Ce logiciel est initialement prévu pour la création de schémas. Son utilisation et sa prise en main sont simples et ressemblent à celle d'un logiciel comme Microsoft Paint. Sauf qu'au lieu de «dessiner», des objets sont créés. Ceux-ci sont ensuite modifiables. Par exemple, si l'on dessine deux rectangles et qu'on les relie par un trait, le déplacement d'un rectangle modifiera le trait lui étant attaché. Avec plus de 70 rectangles et encore plus de liens, cette fonctionnalité devient indispensable. La cartographie du réseau est jointe en annexe 1. 2) Choix matériels Comme dit précédemment, l'infrastructure mise en place devra durer cinq ans. Elle sera hébergée en datacenter. Le serveur sera un HP Proliant G4P avec la configuration suivante : Deux disques durs de 74Go SCSI à 15'000 tours par minute en RAID1 matériel. Les disques SAS à 15'000 tours par minute sont monnaie courante en usage serveur. Ceux-ci sont fiables et très rapides. Le RAID1 matériel prévient le serveur de toute panne d'un des disques durs en maintenant le contenu des deux disques identique. En cas de panne de l'un d'entre eux, une LED clignotera en façade du serveur pour demander le remplacement du disque. Le serveur fonctionnera sans interruption ni perte de données. Une fois le disque remplacé, le contrôleur RAID resynchronisera les disques et le serveur retrouvera sa fiabilité. 6Go de mémoire vive ECC. L'ECC est une technologie de repérage et de correction d'erreurs. Il arrive que la mémoire vive soit altérée et Page 3
qu'un bit change d'état. La mémoire vive ECC contient un mécanisme de contrôle et de réparation de ces erreurs. Double alimentation, afin d'être alimenté par deux sources électriques différentes ainsi que de pouvoir pallier à la panne d'une alimentation. Ainsi en cas de maintenance ou d'incident sur l'un des circuits électriques, le service est maintenu. Bi-Xeon 3.60GHz. Ces Xeon sont basés sur les Pentium IV, les seuls processeurs à avoir été vendus à une si haute fréquence. Malgré leur age, leur rapide fréquence les rend très performants. Pour, à terme, collecter les données de plus de 3000 sources toute les minutes, et générer une weathermap assez complexe, il ne sera pas de trop. Ce serveur à quelques années déjà mais est bien assez performant pour un Cacti. Sa conception est robuste et fiable. A terme, l'installation de Cacti sera clonée sur un serveur similaire afin d'être physiquement présent à un autre endroit du réseau. Ainsi, même si un des Cacti sera isolé (panne ou maintenance d'un des Illustration 1: Serveur HP G4P équipements), la surveillance pourra continuer de se faire. Page 4
III) Procédure d'installation 1/ Installer la distribution Ubuntu server standard. 2/ Configurer son accès au réseau (adresse IP, réseau, passerelle...). Voir le fichier /etc/network/interfaces 3/ Le serveur se trouvant sur un réseau privé non routé vers internet (172.16.0.0/12), pour utiliser aptitude, il faut lui spécifier d'utiliser un proxy. Créer ou modifier /etc/apt/apt.conf.d/80proxy pour qu'il ait le contenu suivant : Acquire::http::Proxy "http://stats1.in.multi-visp.net:8888"; 4/ La mettre la distribution via : aptitude update && aptitude dist-upgrade 5/ Installer les logiciels nécessaires : 1. Un serveur SSH (openssh-server) s'il n'est pas déjà inclus, afin d'accéder à distance via SSH au serveur 2. Installer un démon NTP : openntpd. Un démon NTP sert à synchroniser régulièrement l'horloge du serveur sur un serveur de temps. L'horloge interne d'un serveur à naturellement tendance à avancer ou retarder dans le temps. Avoir une horloge précise étant capital pour nos mesures, un démon NTP est indispensable. 3. Le serveur web (apache2) et le module suphp pour exécuter PHP avec les privilèges de Cacti. 4. PHP5 et ses extensions (php5-mysql pour interfacer php avec mysql, php5-cli pour pouvoir utiliser php en ligne de commande, php5-snmp pour que Cacti puisse communiquer directement en SNMP avec les équipements, php5-gd pour pouvoir générer des images avec PHP, en l'occurrence les weathermap, php5-xcache, un cache d'opcode PHP, pour accélérer les accès aux fichiers PHP). 5. Le serveur et le client MySQL. 6. Le paquet snmp (contenant les logiciels utiles à Cacti comme «snmp» mais aussi «snmpwalk» dont l'usage sera détaillé plus loin) 7. RRDTool pour le stockage des données et leur exploitation 8. Les fichiers de developpement de la librairie SNMP et de la librairie MySQL qui sont des pré-requis pour compiler Spine. Soit la commande suivante : aptitude install openssh-server apache2 libapache2-mod-suphp php5 php5-mysql php5-cli php5-snmp php5-xcache mysql-server snmp rrdtool Page 5
openntpd libsnmp-dev libmysqlclient-dev 6/ Configurer openntpd. Par convention, dans le réseau SECR, chaque passerelle réseau possède un serveur de temps. Nous allons donc dire à openntp d'utiliser 172.16.113.1 comme serveur de temps. Le fichier /etc/openntpd/ntpd.conf devra ne contenir que cette ligne de décommentée : server 172.16.113.1 Redémarrer openntpd. /etc/init.d/openntpd restart On peut voir dans le syslog que openntpd met à jour le serveur : root@cacti1:~# tail /var/log/syslog May 17 10:59:48 cacti1 ntpd[3043]: ntp engine ready May 17 11:00:10 cacti1 ntpd[3043]: peer 172.16.113.1 now valid May 17 11:01:04 cacti1 ntpd[3042]: adjusting local clock by 22.844271s May 17 11:02:42 cacti1 ntpd[3042]: adjusting local clock by 22.804901s May 17 11:06:55 cacti1 ntpd[3042]: adjusting local clock by 22.748258s May 17 11:09:01 cacti1 ntpd[3042]: adjusting local clock by 22.637219s Openntpd met à jour l'heure par petites étapes, ce qui est intéressant lorsque le serveur est en production. On évite de décaler brutalement l'heure, de cette façons les applications qui utilisent l'heure comme référence quelconque (lancement de taches, ) ne sont pas perturbées. Pour mettre à jour immédiatement l'heure, on peut utiliser ntpdate : root@cacti1:~# ntpdate 172.16.113.1 17 May 11:42:56 ntpdate[3172]: step time server 172.16.113.1 offset 21.747754 sec ntpdate nous confirme ensuite que l'heure est synchronisée : root@cacti1:~# tail -n 1 /var/log/syslog May 17 11:43:38 cacti1 ntpd[3043]: clock is now synced 7/ Configurer apache. Dans /etc/apache2/apache2.conf, changer les valeurs déjà présentes par : <IfModule mpm_prefork_module> StartServers 3 MinSpareServers 2 MaxSpareServers 5 MaxClients 30 MaxRequestsPerChild 0 </IfModule> Le serveur apache ne sera pas très sollicité : les accès au Cacti seront ponctuels. Pour éviter d'autoriser apache et PHP à consommer trop de mémoire, j'ai dimensionné la configuration apache afin de pouvoir servir Page 6
30 connexions simultanées maximum, ce qui est largement suffisant pour la fréquentation prévisible. Un processus PHP étant invoqué par suphp lors de chaque requête d'un client sur un fichier PHP, une utilisation potentiellement importante de mémoire peut avoir lieu si la valeur MaxClients est trop haute. 8/ Créer le virtualhost du Cacti. Il a été décidé que l'adresse sera cacti1.gs.par. # cd /etc/apache2/sites-available # cp default cacti1.gs.par Le fichier cacti.gs.par contiendra <VirtualHost *> ServerAdmin ServerName DocumentRoot LogLevel ErrorLog CustomLog combined ServerSignature </VirtualHost> support@multi-visp.com cacti1.gs.par /var/www warn /var/log/apache2/cacti1.gs.par-error.log /var/log/apache2/cacti1.gs.par-access.log Off VirtualHost * signifie que le site sera accessible selon la configuration globale de apache (ssl ou non ssl, port alternatif ou non, etc). ServerAdmin est l'adresse email qui sera indiquée au client en cas d'erreur du serveur (erreur 500 par exemple). ServerName indique à quel nom devra répondre le VirtualHost. DocumentRoot spécifie l'endroit où seront trouvés les fichiers du VirtualHost. LogLevel détermine à partir de quelle importance les messages d'erreur seront enregistrés dans les logs. Warn est un bon compromis. ErrorLog détermine l'endroit où le log des erreurs sera stocké. CustomLog est un fichier qui enregistrera chaque requête envoyée à apache. «combined» définit la syntaxe et le contenu de chaque enregistrement. ServerSignature Off demande au serveur de ne pas afficher aux clients la version d'apache et de ses modules dans les pages générées par apache. 9/ Désactiver le virtualhost par défaut et activer le virtualhost du cacti : root@cacti1:~# a2dissite default Site default disabled. Run '/etc/init.d/apache2 reload' to activate new configuration! root@cacti1:~# a2ensite cacti1.gs.par Enabling site cacti1.gs.par. Run '/etc/init.d/apache2 reload' to activate new configuration! Page 7
10/ Le redémarrer pour prendre en compte la nouvelle configuration apache2ctl restart 11/ Créer un utilisateur unix pour Cacti. Cet utilisateur aura des privilèges restreints sur la machine. Il servira notamment pour faire fonctionner le démon Spine. Toutes les commandes seront dorénavant, sauf mention contraire, lancées avec cet utilisateur. root@cacti1:~# adduser cacti Ajout de l'utilisateur «cacti»... Ajout du nouveau groupe «cacti» (1001)... Ajout du nouvel utilisateur «cacti» (1001) avec le groupe «cacti»... Création du répertoire personnel «/home/cacti»... Copie des fichiers depuis «/etc/skel»... Entrez le nouveau mot de passe UNIX : Retapez le nouveau mot de passe UNIX : passwd : le mot de passe a été mis à jour avec succès Modification des informations relatives à l'utilisateur cacti Entrez la nouvelle valeur ou «Entrée» pour conserver la valeur proposée Nom complet []: N de bureau []: Téléphone professionnel []: Téléphone personnel []: Autre []: Ces informations sont-elles correctes? [O/n] o cacti@cacti1:~# 12/ Pour pouvoir utiliser wget en passant par le proxy, créer ~/.wgetrc pour l'utilisateur cacti et root. Y mettre les deux lignes suivantes : http_proxy = http://stats1.in.multi-visp.net:8888 use_proxy = on 13/ Créer un utilisateur MySQL pour Cacti ainsi qu'une base de données. L'utilisateur créé devra avoir des privilèges se limitant à l'utilisation de cette base de données. Page 8
cacti@cacti1:~# mysql -u root -p Enter password: Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 34 Server version: 5.1.41-3ubuntu12 (Ubuntu) Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. Mysql> CREATE USER 'cacti'@'localhost' IDENTIFIED BY 'MOT_DE_PASSE'; Query OK, 0 rows affected (0.00 sec) mysql> CREATE DATABASE cacti; Query OK, 1 row affected (0.00 sec) mysql> GRANT ALL PRIVILEGES ON cacti.* TO 'cacti'@'localhost'; Query OK, 0 rows affected (0.00 sec) mysql> FLUSH PRIVILEGES; Query OK, 0 rows affected (0.00 sec) mysql> Bye cacti@cacti1:~# 14/ Télécharger les sources de la dernière version de Cacti à partir du site officiel (http://www.cacti.net) et les extraire dans /var/www cacti@cacti1:~$ wget http://wwww.cacti.net/cacti-0.8.7e.tar.gz -O /tmp/cacti-0.8.7e.tar.gz cacti@cacti1:~$ tar xvj /tmp/cacti-0.8.7e.tar.gz -d /var/www/ cacti@cacti1:~$ mv /var/www/cacti-0.8.7e/* /var/www/ cacti@cacti1:~$ rmdir /var/www/cacti-0.8.7e/ Attention, ne pas prendre le.zip... J'ai perdu beaucoup de temps plus loin dans la procédure, lors du patch des sources de cacti à cause de la version en.zip. Les fichiers étaient en format «Windows», c'est à dire avec, comme caractères de retour à la ligne, CRLF, au lieu de CR (pour le format Unix). L'outil patch se trouvait ensuite bloqué par ces différences, renvoyant ainsi une erreur très peu claire, car un éditeur de fichier normal interprète correctement les deux formes de retour à la ligne. 15/ Télécharger et appliquer les patchs officiels de Cacti. Ces patchs corrigent des bugs et des failles de sécurité. Cacti à choisi de diffuser des patchs plutôt que de faire une nouvelle version à chaque modification, c'est pourquoi il faut les appliquer manuellement. Les patchs officiels sont disponibles sur le site de Cacti : http://cacti.net/download_patches.php. cacti@cacti1:~$ cd /var/www/ cacti@cacti1:/var/www$ wget http://www.cacti.net/downloads/patches/0.8.7e/snmp_invalid_respons e.patch patching file include/global_arrays.php patching file lib/snmp.php cacti@cacti1:/var/www$ Page 9
16/ Répéter l'opération pour tous les patchs disponibles. 17/ Télécharger et installer Plugin Architecture pour Cacti (http://cactiusers.org/wiki/pluginarchitectureinstall). Ce module permet une gestion facilitée des modules pour Cacti. L'installation peut se faire à l'aide d'un patch, la procédure est donc la même que ci-dessus cacti@cacti1:~$ cd /tmp cacti@cacti1:/tmp$ wget http://mirror.cactiusers.org/downloads/plugins/cacti-plugin- 0.8.7e-PA-v2.6.zip cacti@cacti1:/tmp$ unzip pa.zip ( ) cacti@cacti1:/tmp$ cp /tmp/cacti-plugin-arch/cacti-plugin-0.8.7e- PA-v2.6.diff /var/www/ cacti@cacti1:/tmp$ cd /var/www/ cacti@cacti1:/var/www$ patch -p1 -N < cacti-plugin-0.8.7e-pav2.6.diff (le patch s'effectue...) 18/ Importer la base de données de Cacti (la procédure d'installation de Cacti ne s'en charge pas tout seul) ainsi que la base de données de Plugin Architecture. cacti@cacti1:~$ mysql -u cacti -B cacti -p < /var/www/cacti.sql cacti@cacti1:~$ mysql -u cacti -B cacti -p < /tmp/cacti-pluginarch/pa.sql 19/ Éditer le fichier /var/www/include/config.php pour y mettre les informations de connexion à la base de données (nom de base, identifiant de l'utilisateur MySQL, mot de passe MySQL). 20/ Se rendre à la page d'installation de Cacti. L'adresse de celle-ci devrait être http://[domaine.tld adresse ip]/install/. Suivre la procédure. L'identifiant par défaut est «admin» et le mot de passe «admin». Il sera demandé de changer le mot de passe. 21/ Se connecter à Cacti. Dans User Management puis admin, cocher Plugin Management dans la section Realm Permissions puis valider. Une nouvelle ligne apparaît dans le menu de gauche, dans la catégorie Configuration, appelé «Plugin Management». 22/ Pour pouvoir générer une cartographie du réseau, nous avons besoin d'installer le plugin weathermap. cacti@cacti1:/var/www/plugins$ wget http://www.networkweathermap.com/files/php-weathermap-0.97a.zip (téléchargement ) cacti@cacti1:/var/www/plugins$ unzip php-weathermap-0.97a.zip (extraction ) cacti@cacti1:/var/www/plugins$ rm php-weathermap-0.97a.zip Éditer /var/www/include/global.php pour ajouter en dessous de $plugins = array(); la ligne suivante : Page 10
$plugins[] = 'weathermap'; Aller dans User Management, puis, pour chaque utilisateur cocher Plugin -> Weathermap: Configure/Manage et/ou Plugin -> Weathermap: View selon l'autorisation qu'on voudra lui donner. Pour l'administrateur et les membres du staff, cocher les deux. 23/ Installer les dépendances de Spine root@cacti1:~# aptitude install libtool libmysqld-dev libsnmp-dev 24/ Télécharger, extraire, patcher et compiler les sources de Spine (http://cacti.net/spine_download.php et http://cacti.net/spine_download_patches.php) root@cacti1:/usr/local/src/cacti-spine-0.8.7e# wget http://www.cacti.net/downloads/spine/cacti-spine-0.8.7e.tar.gz (...) root@cacti1:/usr/local/src/cacti-spine-0.8.7e# tar xvf cactispine-0.8.7e.tar.gz (extraction ) root@cacti1:/usr/local/src/cacti-spine-0.8.7e# wget http://www.cacti.net/downloads/spine/patches/snmp_v3_fix.patch root@cacti1:/usr/local/src/cacti-spine-0.8.7e# wget http://www.cacti.net/downloads/spine/patches/mysql_client_reconnec t.patch root@cacti1:/usr/local/src/cacti-spine-0.8.7e# wget http://www.cacti.net/downloads/spine/patches/ping_reliability.patc h root@cacti1:/usr/local/src/cacti-spine-0.8.7e# patch -p1 -N < snmp_v3_fix.patch root@cacti1:/usr/local/src/cacti-spine-0.8.7e# patch -p1 -N < mysql_client_reconnect.patch root@cacti1:/usr/local/src/cacti-spine-0.8.7e# patch -p1 -N < ping_reliability.patch Un problème dans le fichier de configuration m'a obligé à créer deux liens symboliques comme tel : root@cacti1:/usr/local/src/cacti-spine-0.8.7e# ln -s /usr/share/libtool/config/config.sub /usr/share/libtool/config.sub root@cacti1:/usr/local/src/cacti-spine-0.8.7e# ln -s /usr/share/libtool/config/config.guess /usr/share/libtool/config.guess Pour respecter la norme de la hiérarchie des systèmes de fichiers, on voudra que le binaire compilé se trouve dans /usr/local/bin/ et que le fichier de configuration se trouve dans /etc/. On devra donc lancer le script de configuration comme tel : Page 11
root@cacti1:/usr/local/src/cacti-spine-0.8.7e#./configure --bindir=/usr/local/bin sysconfdir=/etc ( configuration ) Puis compiler et installer root@cacti1:/usr/local/src/cacti-spine-0.8.7e# make ( compilation ) root@cacti1:/usr/local/src/cacti-spine-0.8.7e# make install make[1]: Entering directory `/usr/local/src/cacti-spine-0.8.7e' test -z "/usr/local/bin" /bin/mkdir -p "/usr/local/bin" /bin/bash./libtool --mode=install /usr/bin/install -c spine '/usr/local/bin' /usr/bin/install -c spine /usr/local/bin/spine test -z "/etc" /bin/mkdir -p "/etc" /usr/bin/install -c -m 644 spine.conf '/etc' make[1]: Leaving directory `/usr/local/src/cacti-spine-0.8.7e' 25/ Éditer le /etc/spine.conf pour y renseigner le login et le mot de passe de l'utilisateur de Cacti pour MySQL. Puis changer les droits de ce fichier pour que seul l'utilisateur de Cacti (et Spine) puisse y accéder. root@cacti1:~# chown cacti:cacti /etc/spine.conf root@cacti1:~# chmod 400 /etc/spine.conf root@cacti1:~# ls -lah /etc/spine.conf -r-------- 1 cacti cacti 2.5K 2010-05-21 10:20 /etc/spine.conf Ainsi le mot de passe MySQL ne sera lisible que par l'utilisateur cacti et le super-utilisateur du système. 26/ Éditer le fichier /etc/crontab avec le super-utilisateur pour y ajouter un appel au pooler de Cacti. Le pooler est le programme qui va se charger de collecter les données des graphiques. Le fichier /etc/crontab est lu par crond. Il s'agit d'un programme qui lance de façon périodique d'autres programmes. Ajouter la ligne suivante au fichier : */1 * * * * cacti /usr/bin/php /var/www/poller.php > /dev/null 2>&1 Cette ligne spécifie que, toute les minutes, il faudra exécuter le script pooler.php avec les droits de l'utilisateur cacti. La sortie standard et la sortie d'erreurs seront redirigées vers /dev/null. pooler.php exécutera Spine conformément à la configuration que nous allons lui spécifier. Page 12
IV) Configuration 1/ Dans Settings > General, configurer les paramètres SNMP par défaut pour utiliser SNMPv2 avec nukesnmp en nom de communauté, puis valider. Pour Reindex Method for Data Queries, sélectionner Index Count Changed. Ainsi lors d'ajout d'interfaces à un équipement, celles-ci seront recensées automatiquement dans Cacti. 2/ Dans Settings > Paths, remplir «Spine Poller File Path» par /usr/local/bin/spine, qui est le chemin où nous avons installé le binaire de Spine précédemment. 3/ Dans Settings > Poller a. Sélectionner Spine pour le Poller Type b. Sélectionner Every Minute pour le «Poller Interval». Les fichiers RRD pourront ainsi être vérifiés et mis à jour jusqu'à une fois par minute. Cela permettra d'avoir un assez bon niveau de détail dans les graphiques. c. Notre serveur ayant deux processeurs hyperthreadés, soit quatre processeurs logiques, mettre 4 au paramètre «Maximum Threads per Process». Spine utilisera 4 threads pour collecter ses informations plus efficacement. 4/ Dans Settings > Visual, mettre 100 à Maximum Title Length et 50 à Maximum Field Length. Ces valeurs permettront d'afficher entièrement le titre que l'on a souhaité dans les graphes. Les descriptions des interfaces étant particulièrement longues pour être complètes, cette modification est nécessaire. 5/ Dans Devices, supprimer «localhost». L'objet de ce Cacti n'est pas de grapher la machine elle même. Une autre installation de Cacti s'en chargera. 6/ Dans Cacti, les templates d'hôtes («Host Templates») servent à prédéterminer quels graphes seront potentiellement générés en fonction du type de l'hôte. Ce faisant, la page de création de graphiques proposera le type de graphiques que la template d'hôte indique. Aller dans Host Templates, puis Add. Lui donner un nom (j'ai choisi «Équipement réseau») et ajouter SNMP Interface Statistics dans «Associated Data Queries». 7/ J'ai 71 équipements à ajouter dans Cacti. Pour éviter de devoir saisir le formulaire à la main 71 fois de suite, il faut trouver un moyen d'automatiser. Dans /var/www/cli, Cacti propose des scripts effectuant certaines actions que je peux utiliser en ligne de commande. Ainsi, avec le fichier contenant la liste des équipements à raison d'un équipement par ligne, ainsi que la boucle ci-après, l'insertion des hôtes se fait automatiquement. Page 13
cacti@cacti1:/var/www/cli$ for i in `cat /tmp/devices.txt`; do php add_device.php --description="$i" -ip="$i" - template=9 --avail="snmp"; done Chaque équipement s'appelant par son nom d'hôte, --description et ip sont identiques. --avail="snmp" indique que la détection d'un hôte hors ligne se fera si celui-ci ne répond pas en SNMP. --template=9 spécifie que cet équipement doit avoir la template que nous avons précédemment créé. Pour connaître le numéro associé à cette template, il faut utiliser la commande suivante : cacti@cacti1:/var/www/cli$ php add_device.php list-host-templates Valid Host Templates: (id, name) (...) 7 Windows 2000/XP Host 8 Local Linux Machine 9 quipement r seau 8/ Toutes les interfaces devront être graphées avec des compteurs 64bits pour permettre de grapher au delà de 100Mbits (dépassement de capacité du compteur lorsqu'il est en 32bits). Et nous avons besoin d'avoir aussi le 95 th percentile. Par défaut, ce type de graphe n'existe pas, nous allons donc le créer. Aller dans Data Queries > SNMP - Interface Statistics > Add. Donner comme nom In/Out Bits with 95th Percentile (64-bit Counters) et Interface trafic (bits/sec, 95th Percentile) comme Graph Template puis valider. En Data Source pour traffic_in, mettre ifhcinoctets (Bytes In 64-bit Counters) puis cocher la case sur la ligne. Pour traffic_out, mettre ifhcoutoctets (Bytes In 64-bit Counters) puis cocher la case sur la ligne. Pour que les graphiques soient nommés de façon pertinente, nous allons utiliser des modèles de nommage différents de ceux par défaut. Dans «Data Template - Interface - Traffic», mettre host_description - query_ifname - query_ifalias et name puis cliquer sur Add. Répéter la manipulation avec host_description - query_ifname et name. Ainsi le nom du graphique sera, en fonction de l'existence ou non de la variable query_ifalias sera le nom d'hôte de l'équipement, le nom de l'interface ainsi que sa description. Répéter les deux dernières actions en mettant title au lieu de name dans la catégorie suivante, «Graph Template - Interface - Traffic (bits/sec, 95th Percentile)», puis enregistrer les modifications. 9/ Un besoin exprimé est d'avoir des graphes sur une heure avec les mesures toutes les minutes. Aller dans Data Templates > Interface trafic puis tout sélectionner dans «Associated RRA's». Modifier «Step» à 60 pour que les fichiers soient vérifiés et mis à jours toutes les 60 secondes. Pour l'onglet traffic_in ainsi que traffic_out, mettre 0 dans Maximum Page 14
Value et décocher le Use Per-Data Source Value associé pour pouvoir grapher tout type d'interface (100Mbits, 1Gbits et plus). Il est possible que cette valeur soit déterminée lors de la création du graphique mais pendant les tests, il a été remarqué que la vitesse des ports gigabits n'était pas bien détectée si aucun équipement n'était actuellement branché dessus. Les ports actuellement non branchés pouvant être quand même vendus ou utilisés plus tard, les graphiques doivent être créés pour ceux-ci. Pour des raisons d'efficacité lors de la création des graphiques, il est préférable de supprimer cette limite comme expliqué précédemment. 10/ Le Cacti que je mets en place doit grapher dés le départ toutes les interfaces intéressantes de tous les équipements en place. Ces interfaces sont reconnaissables à leur valeur SNMP ifdescr qui doit se trouver sous une des formes suivantes : Vlan* VLAN* Vl* FastEthernet* GigabitEthernet* Port-channel* Plutôt que d'ajouter à la main, de façon non rébarbative et inintéressante tous les graphes de ces interfaces, j'ai ici encore préféré m'intéresser aux outils en ligne de commande de Cacti et à scripter leur utilisation en BASH. Je pense que la consommation de temps a été identique mais je trouvais plus intéressant de faire un script. En plus ce script sera réutilisable pour une autre installation ou même l'ajout des graphes de nouveaux équipements sur le réseau. Le script est joint en annexe 2. 11/ A l'aide de la fonction Import Templates de Cacti, importer la template jointe en annexe. Celle-ci a été créée de façon à pouvoir grapher d'une façon conforme au besoin exprimé au départ deux interfaces réseau en simultané. Cette template a été créé manuellement dans une installation indépendante de Cacti afin de vérifier son importabilité. Page 15
Illustration 2: Démonstration du graphique créé 12/ L'entreprise dispose de fiches clients qui détaillent, entre autres, le nom de la société, son n de vlan ainsi que les identifiants d'accès au Cacti existant (voir annexe 3). Pour ne pas à devoir communiquer aux clients de nouveaux identifiants & mots de passe pour l'accès au Cacti, ces identifiants vont être réutilisés. Grâce à ces identifiants, le client pourra accéder à son graphique de bande passante qui servira de base de facturation ainsi qu'aux graphiques de ses switches s'ils sont dédiés (si le client dispose de ports sur un switch partagé entre plusieurs clients, la mise à jour des droits d'accès du client sur les graphiques devient gênante à faire... cela ne sera fait que si le client le demande explicitement). Après avoir brièvement étudié les les outils proposés par Cacti pour son contrôle via scripting, j'ai trouvé trop compliquée la création d'un script. Les exceptions aux règles sont nombreuses, les fiches clients pas forcément à jour (et non exploitable automatiquement), La saisie manuelle devient nécessaire. De plus il n'y a «que» 41 fiches clients. Voici la procédure la plus rapide que j'aie pu trouver : a. "Graph Management" > New > "Selected Graph Template" = "SECR - aggreg clients" > Host = none > Create b. Le temps du chargement de la page (qui, en raison du nombre d'interfaces proposées, devient conséquent), ouvrir la fiche client. Mettre dans le presse papier le nom de la société et mémoriser le n du VLAN publique. c. Sur Cacti, compléter le titre par Graph agrege nom_societe Vlan XX. d. Pour IN Router 1, chercher dans la liste le vlxx sur l'hôte edge1.gs.par ayant entre parenthèses traffic_in. XX correspond au numéro de vlan 2. Par exemple «edge1.gs.par - Vl59 - Cust: 2 Chaque client possède son propre VLAN, pour Virtual-Lan. Dans ce vlan, le client peut utiliser des adresses IP privées auxquelles il sera le seul à accéder. Ce principe de Vlan simule une séparation physique des réseaux tout en étant logicielle. Ainsi, par exemple, un client ayant un service quelconque non protégé sur une IP non routée sur Page 16
IUT LENS {GS} (traffic_in)» e. Idem pour IN Router 2, mais sur l'hôte bgp1.gs.par et l'interface Gi0/2.XX où XX est le numéro de vlan. Par exemple «bgp1.gs.par - Gi0/2.59 - Cust: IUT LENS {GS} (traffic_in)». f. Pour OUT Router 1, chercher dans la liste le vlxx sur l'hôte edge1.gs.par ayant entre parenthèses traffic_out. Par exemple «edge1.gs.par - Vl59 - Cust: IUT LENS {GS} (traffic_out)» g. Idem pour OUT Router 2, mais sur l'hôte bgp1.gs.par et l'interface Gi0/2.XX où XX est le numéro de vlan. Par exemple «bgp1.gs.par - Gi0/2.59 - Cust: IUT LENS {GS} (traffic_out)». h. Pour classer les graphes d'une façon logique et gérer les accès clients, Cacti dispose d'un tri en arbres. Pour chaque vlan public de chaque client, on créé une branche. Aller dans «Graph Trees» puis Add. Le nom de la branche est NOM_CLIENT [NUMERO_VLAN]. Mettre Alphabetical pour Sorting Type. Dans «Tree Items», cliquer sur Add, sélectionner Graph dans «Tree Item Type» puis ajouter le graphique précédemment créé (Graph agrege nom_societe Vlan XX). Si le client possède un switch dédié, cliquer sur Add, selectionner Host dans «Tree Item Type» puis ajouter le device correspondant. i. Il faut maintenant créer l'accès au client. Aller dans User Management > Add puis réutiliser les données d'identification de la fiche client. Cocher la case Enabled pour activer le compte. Cocher la case View Graphs pour n'autoriser le compte qu'à voir des graphiques puis créer l'entrée client en cliquant sur Create. Cliquer sur l'entrée du client puis aller dans Graph Permissions. Dans Graph Permissions (By Graph), ajouter le graphique agrégé du client (Graph agrege nom_societe Vlan XX). Dans Graph Permissions (By Device), ajouter, s'il y a lieu, l'équipement du client. Dans Tree Permissions, ajouter la branche du client créée auparavant. j. Se connecter au Cacti avec les identifiants du client pour vérifier le fonctionnement correct de son espace. internet ne risquera pas de se faire attaquer par un autre client. Chez SECR, ces vlan se trouvent routés vers internet par edge1.gs.par et bgp1.gs.par, d'où la présence de ces interfaces virtuelles où est comptabilisée la connexion a internet utilisée. Page 17
V) Weathermap 1) Modélisation préliminaire L'éditeur de weathermap fourni avec network-weathermap étant très rustique, il est donc indispensable de faire une cartographie préliminaire du réseau. A l'aide d'observer, un outil de management de réseau sophistiqué (il récupère et analyse la configuration des équipements réseau), j'ai pu construire, étape par étape, une cartographie du réseau Illustration 3: Observer indique ici les équipements reliés à ar11.gs.par, ainsi que le type des interfaces (Se reporter au document annexe 1 pour le graphique Dia complet) Par convention : Les rectangles noirs sont des switches, routeurs physiques ou équipements clients Les rectangles rouges sont des routeurs vers d'autres réseaux. Pour le moment, ils représentent soit les points de peering, soit les équipements des transitaires. Les liens noirs sont des liens physiques entre deux routeurs Les liens verts sont des liens encore non existants mais qui seront mis en place dans le futur. Leur présence est importante pour prévoir la place sur la weathermap. Le plugin weathermap dispose d'un éditeur visuel plutôt sommaire, contrairement à Dia. Tellement sommaire qu'il n'est utile que pour l'apprentissage de la structure du fichier de configuration et l'attribution des fichiers RRD aux liens entre équipements. Ainsi j'ai utilisé un éditeur de fichier texte pour la plupart des taches qui n'ont pas besoin d'un support visuel. Une documentation très complète est disponible à l'adresse suivante : Page 18
http://www.network-weathermap.com/manual/latest/pages/configreference.html. Les fichiers de configuration sont disponibles dans le path suivant : /var/www/plugins/weathermap/configs. 2) Paramètres de base WIDTH 2900 HEIGHT 1400 HTMLSTYLE overlib BGCOLOR 255 255 255 TIMECOLOR 0 0 0 SCALE DEFAULT 0 0 192 192 192 SCALE DEFAULT 0 1 255 255 255 SCALE DEFAULT 1 10 140 0 255 SCALE DEFAULT 10 25 32 32 255 SCALE DEFAULT 25 40 0 192 255 SCALE DEFAULT 40 55 0 240 0 SCALE DEFAULT 55 70 240 240 0 SCALE DEFAULT 70 85 255 192 0 SCALE DEFAULT 85 100 255 0 0 WIDTH et HEIGHT définissent les dimensions de l'image en pixel. HTMLSTYLE contrôle l'activation ou non du javascript dans la page que va générer network-weathermap. BGCOLOR spécifie la couleur de fond de l'image en RVB. 255, 255, 255 définissent la couleur blanche. TIMECOLOR spécifie de la même façon la couleur de la date et de l'heure donnée sur le graphe. 0, 0, 0 définissent le noir. Les enchainement de SCALE définissent les enchainements de couleurs que prendront les liens en fonction de leur charge. Un équipement est matérialisé par une NODE. Par convention et pour des raisons pratiques, le nom affiché sera le même que le nom de la node. networkweathermap propose un mécanisme de templates pour éviter de recopier plusieurs fois les mêmes informations. Ainsi, la node DEFAULT contient les propriétés appliquées par défaut à chaque node. NODE DEFAULT LABEL {node:this:name} LABELFONT 2 LABELOUTLINECOLOR none Illustration 4: Une node nommée client08b,gs,par LABEL {node:this:name} indique que le nom affiché sera celui de la node. LABELFONT 2 indique que le type de police utilisé sera le type n 2. Ces types sont proposés par défaut mais sont aussi personnalisables. Page 19
LABELOUTLINECOLOR impose de ne pas faire de cadre autour de l'écriture. Le cadre fait avec cette instruction s'adapte à la taille du texte. Nous ferons notre cadre de taille fixe d'une autre façon. Les nodes des clients devant être dans un rectangle, une template «clientbox» est créé. Pour des besoins pratiques, une template «minibox» est créée : celle-ci aura une longueur moindre. Ces templates héritant par défaut de la template DEFAULT, il n'est pas utile d'indiquer qu'elles doivent en hériter. NODE clientbox ICON 150 20 box NODE minibox ICON 100 20 box Afin de mieux repérer visuellement les interconnexions à des points de peering ou des fournisseurs de transit, une template «interco» est crée. Celle-ci hérite des propriétés de la template clientbox pour changer la couleur du cadre en rouge. NODE interco TEMPLATE clientbox AICONOUTLINECOLOR 255 0 0 Les liens entre les nodes sont eux matérialisés par des LINK. De la même façon qu'il y a une node DEFAULT, il y a un link DEFAULT. Il a été personnalisé comme suit : LINK DEFAULT WIDTH 3 COMMENTFONT 3 COMMENTFONTCOLOR 0 0 0 INBWFORMAT {link:this:inpercent:%0.1f}% OUTBWFORMAT {link:this:outpercent:%0.1f}% COMMENTPOS 99 1 BANDWIDTH 1G WIDTH 3 précise qu'un lien a une largeur de trois pixels par défaut. COMMENTFONT indique le type de la police à utiliser. COMMENTFONTCOLOR indique que la couleur des commentaires des liens sera noire. INBWFORMAT {link:this:inpercent:%0.1f}% et OUTBWFORMAT {link:this:outpercent:%0.1f} % donnent la façon de formater l'indication de la charge du lien. Ici, la charge sera indiquée en pourcentage avec une résolution de 0.1%. Illustration 5: Charge des liens COMMENTPOS 99 1 indique que les commentaires seront placés par Page 20
défaut aux extrémités des liens. Ces commentaires se spécifient lien par lien. Par défaut, les liens inactifs (sans aucune activité ou non graphés) sont de couleur grise. 3) Placement des nodes Pour le placement initial des principaux équipements, l'éditeur graphique peut être utile. NODE edge1.gs.par ICON 150 150 box POSITION 1175 500 La node edge1.gs.par étant un élément clef d'une grande partie du réseau, celle-ci est placée de façon absolue sur la carte. Son importance et le nombre de connexion qu'elle aura m'oblige à modifier sa taille avec la directive ICON. NODE orange1.gs.par TEMPLATE clientbox POSITION edge1.gs.par 250-150 orange1.gs.par est l'exemple parfait de la node typique. Celle-ci hérite ses propriétés de la node clientbox et est positionnée de façon relative à edge1.gs.par. Ainsi, si edge1.gs.par venait à être déplacé, orange1.gs.par serait automatiquement déplacé avec. Le positionnement relatif est impossible à réaliser avec l'éditeur graphique. Vu l'importance de l'utilisation de cette fonctionnalité pour une cartographie comme la notre, l'édition du fichier texte est impérative. 4) Placement des liens LINK core03.gs.par-core01.gs.par INFOURL /graph.php?rra_id=all&local_graph_id=822 OVERLIBGRAPH /graph_image.php? local_graph_id=822&rra_id=0&graph_nolegend=true&graph_height=100&g raph_width=300 TARGET /var/www/rra/core03_gs_par_traffic_in_825.rrd NODES core03.gs.par:w core01.gs.par:e Page 21
LINK core03.gs.par-core01.gs.par est un nom interne donné au lien INFOURL indique l'url de destination lorsque l'on clique sur le lien. OVERLIBGRAPH indique l'url vers le graphique qui sera montré lors du passage de la souris sur le lien (sans cliquer). TARGET spécifie le chemin vers le fichier RRD qui contient les informations concernant le lien. NODES spécifie l'origine et la destination du lien. L'exemple donné ci dessus se rapport au lien horizontal à gauche de core03.gs.par sur l'illustration n 5. Dans core03.gs.par:w, le :w spécifie que le lien va partir de l'ouest de la node. Dans core01.gs.par, le :E signifie que le lien arrivera à l'est de la node. Illustration 6: Une node et ses links NODES core03.gs.par:-74:-50 bur4.gs.par:e Ce lien est celui à 1.7% sur l'illustration ci-dessus. :-74:-50 indique que le lien devra arriver à un point situé 74 pixels à gauche du centre de core03.gs.par, et 50 pixels plus haut que le centre de core03.gs.par. Ces détails là ne sont pas non plus gérables facilement via l'éditeur graphique de network-weathermap. Une freebox est disponible dans le réseau. Les liens étant asymétriques, il faut spécifier la bande passante de ce lien de façon individuelle. La directive BANDWITH indique le IN puis le OUT, vus par la première node spécifiée par la directive NODES. LINK bur1.gs.par-freebox.gs.par ( ) NODES bur1.gs.par:-74:5 freebox.gs.par:e BANDWIDTH 20M 1M Ainsi, le IN de bur1.gs.par correspond au OUT de la freebox. La freebox pouvant générer un trafic de 20Mbits dans le sens freebox bur1.gs.par, et 1Mbits dans l'autre sens, on indique donc, dans l'ordre, 20M 1M. Le fichier fourni sur le CD diffère grandement de ce qui a été expliqué plus haut. La raison est que l'éditeur graphique à tout de même été utilisé pour le positionnement de certaines NODES ainsi que pour la création des liens. Ces éditeur n'étant pas encore au point, il n'est pas Page 22
capable de bien comprendre le mécanisme de templates, il impose que certaines lignes soient présentes, et il impose une mise en forme du texte. Page 23
VI) Conclusion Ce document pourra être réutilisé pour une réinstallation de Cacti ou sa maintenance. En raison de la rapidité d'évolution du réseau SECR, je n'ai pas pu détailler la création du graphique agrégé : le travail de création de la template a été fait, les graphes créés. Mais l'arrêt d'un équipement et la panne d'un second a rendu ce besoin caduque. Toujours suite à cette panne, la weathermap n'a pu être faite en intégralité ; les nodes et liens ont été modélisés mais leur correspondance avec le fichier RRD n'a pas été faite. Le routeur en question a été passé en mode switching en urgence et n'est plus accessible en SNMP à cette date (06/2010). Durant mes travaux sur Cacti, j'ai trouvé et reporté un bug. La complexité de l'architecture interne de Cacti et le manque de temps m'ont empêché de développer moi même un correctif, mais j'ai trouvé comment contourner ce problème. Ce bug avait trait au fichier cli/poller_graphs_reapply_names.php, fichier très utile pour mettre à jour les nom des graphes lorsque les descriptions des interfaces changent. Page 24