Table of Contents
monitoring réseau graphe
MRTG
Dans cet aide-mémoire nous allons touchotter un peu au Multi Router Traffic Grapher (MRTG pour les intimes), un script perl conçu à l'origine pour tracer les courbes de débit de ressources réseaux à partir de données récupérées par SNMP (mais nous allons voir qu'il peut aussi tracer d'autres courbes que les débits réseau). MRTG est lancé toutes les 5 minutes (par défaut) et génère des données statiques : des graphiques sous forme d'images PNG statiques, affichées dans une page web (HTML).
NB : bien sur maintenant la mode est à RRDTool avec des outils comme Cacti, Zabbix, Nagios avec récupération ds perfdata, etc… mais en y regardant de plus près, un simple petit MRTG suffit souvent très largement pour l'utilisation qu'on en fait.
Particularités de MRTG
- c'est un outil assez vieux, créé à l'origine pour tracer les débits entrant et sortant des équipements réseau. Il n'est pas conçu pour afficher plus de 2 courbes par graphique. Cette limitation est corrigée par son successeur RRDtool.
- MRTG peut récupérer le trafic d'une interface à partir de son numéro (cf configuration générée par
cfgmaker
). Il existe 2 autres façons à MRTG pour récupérer des données :- interroger 2 OIDs (protocole SNMP)
- utiliser un script externe ; ce dernier doit être placer entre
``
et retourner sur 2 lignes les 2 valeurs à grapher
- on peut tracer une seule courbe via les options
noi
(no input) ounoo
(no output), mais il faut quand même obligatoirement envoyer 2 valeurs à MRTG.
Installation de SNMP
Le SNMP (Simple Network Management Protocol) un protocole client-serveur qui permet à un client d'interroger un serveur sur l'utilisation de ses ressources. Cela se fait par datagramme UDP sur le port 161 (udp/161). Pour récupérer les informations, SNMP se base sur des MIBs, qui se présentent sous la forme d'un arbre (comme le DNS) contenant diverses informations. Certaines MIBs sont standard, d'autre sont propriétaires et dépendant du matériel (il faudra alors les installer sur le client pour lui “apprendre” les OIDs à interroger) ; ces dernière viennent se greffer à l'arbre de référence à un emplacement bien précis.
Sous winXP
On se rend dans le panneau de configuration, dans “Ajout/Suppression de programmes”, “Ajouter ou supprimer des composants Windows.”
Puis dans “Outils de gestion et d'analyse” on sélectionne SNMP. On doit insérer le CDROM de Windows pour l'installation.
Une fois le service installé, on doit le configurer : Menu démarrer, puis Exécuter, puis on saisit services.msc
. On obtient la liste des services installé, et on va dans les propriétés de “Service SNMP”.
Nous n'allons pas utiliser de sécurité concernant les communautés, donc dans l'onglet “Sécurité” on va désélectionner “Envoyer une interruption d'authentification”. En revanche nous allons limiter l'accès à notre machine Linux, en spécifiant son IP dans “Accepter les paquets SNMP provenant de ces hôtes”.
On valide et on vérifie que le service est bien lancer ; c'est tout pour la partie Windows.
Sous Debian
aptitude install snmpd
Configuration de MRTG
sous Debian
Le répertoire qui contiend le(s) fichier(s) de configuration est déjà créé par l'installeur ; il s'agit de /etc/mrtg
.
MRTG dispose d'un outil de détection des interfaces réseau : cfgmaker. On lui donne l'IP d'un routeur et sa communauté SNMP, et MRTG génère le fichier de conf automatiquement :
cfgmaker --ifdesc=descr --output=/etc/mrtg/router.cfg public@router
- Il faut vérifier que l'option
WorkDir
est correcte. Il s'agit du répertoire de travail qui va contenir les pages HTML et les images des courbes ; c'est généralement un sous-dossier du répertoire du serveur web. - Par défaut MRTG ne détecte que les interfaces réseau car c'est son but originel. Pour le reste il va falloir éditer le fichier de conf à la main.
On génère ensuite l'index (la page HTML) à partir de notre fichier de conf (le dossier /var/www/
est la racine d'Apache, installé sur la machine) :
indexmaker --columns=2 --output=/var/www/mrtg/index.html /etc/mrtg/server.cfg
Sous Debian (par défaut) le démon MRTG ne se lance pas, c'est cron qui lance le script toutes les 5 min :
cat /etc/cron.d/mrtg */5 * * * * root if [ -x /usr/bin/mrtg ] && [ -r /etc/mrtg.cfg ];\ then env LANG=C /usr/bin/mrtg /etc/mrtg/server.cfg >> /var/log/mrtg/mrtg.log 2>&1; fi
Pour ressentir le premier effet MRTG il faut soit attendre 5 à 10 min que le script se lance et qu'il récupère quelques valeur.
Puis on va voir à l'adresse http://server/mrtg/ avec son navigateur préféré.
Fichier de conf
A titre d'exemple, voici le mien :
### Global Config Options WorkDir: /var/www-ssl/mrtg ### Global Defaults # to get bits instead of bytes and graphs growing to the right # Options[_]: growright, bits EnableIPv6: no Language: French # taille des courbes, en pixels XSize[_]: 600 YSize[_]: 100 # pngdate affiche la date sur les graphes Options[_]: pngdate # par defaut, afficher les max pour les Months et Weeks mais pas Years WithPeak[_]: mw # ajouter dans <head> #AddHead[_]: <LINK HREF="../favicon.ico" rel="shortcut icon" /> #Colours[_]: YELLOW#FFCC33,BLUE#1000ff,RED#CC0000,VIOLET#ff00ff #Colours[_]: clair#ffd6ad,fonce #ff7575,BLEU #cce8ff,vert #d9ffcc ### Interface 6 >> Descr: 'eth1' | Name: '' | Ip: '' | Eth: '00-1a-70-xx-xx-xx' ### #Target[odin_6]: 6:public@odin: Target[odin_6]: 4:public@odin: SetEnv[odin_6]: MRTG_INT_IP="" MRTG_INT_DESCR="eth1" MaxBytes[odin_6]: 1250000 Title[odin_6]: eth1 (Wifi) -- odin PageTop[odin_6]: <h1>eth1 (Wifi) -- odin</h1> #WithPeak[odin_6]: mw ### Interface 8 >> Descr: 'vlan1' | Name: '' | Ip: 'x.x.x.x' | Eth: '00-1a-70-xx-xx-xx' ### #Target[odin_8]: -8:public@odin: Target[odin_8]: 6:public@odin: SetEnv[odin_8]: MRTG_INT_IP="x.x.x.x" MRTG_INT_DESCR="vlan1" MaxBytes[odin_8]: 1250000 Title[odin_8]: vlan1 (Internet) -- odin PageTop[odin_8]: <h1>vlan1 (Internet) -- odin</h1> #WithPeak[odin_8]: mw ### ping google & free : on ping les IPs pour supprimer la latence des DNS #google 216.239.59.104, 66.249.93.104, 72.14.221.104 #free 212.27.48.10, 212.27.63.123, 212.27.63.146 #Target[ymir.ping]: `ping -i0.5 -w2 72.14.221.104 | tail -n1 | awk -F"/" '{printf("%d\n",$5)}' ;\ ping -i0.5 -w2 212.27.63.123 | tail -n1 | awk -F"/" '{printf("%d\n",$5)}'` Target[ymir.ping]: `ping -c3 -f -w0.5 74.125.77.104 | tail -n1 | awk -F"/" '{printf("%d\n",$5)}' ;\ ping -c3 -f -w0.5 212.27.63.123 | tail -n1 | awk -F"/" '{printf("%d\n",$5)}'` MaxBytes[ymir.ping]: 1000 Options[ymir.ping]: gauge Title[ymir.ping]: Ping google & free YLegend[ymir.ping]: Millisecondes PageTop[ymir.ping]: <H1>Ping google / free - ymir</H1> ### odin system load Options[odin.system]: gauge,nopercent Target[odin.system]: .1.3.6.1.4.1.2021.10.1.5.1&.1.3.6.1.4.1.2021.10.1.5.2:public@odin MaxBytes[odin.system]: 500 Title[odin.system]: odin system load YLegend[odin.system]: System load Legend1[odin.system]:5min Legend2[odin.system]:15min PageTop[odin.system]: <H1>odin system load</H1> ### odin memory used Options[odin.mem]: gauge,nopercent Target[odin.mem]: .1.3.6.1.2.1.25.2.3.1.6.101&.1.3.6.1.2.1.25.2.3.1.5.101:public@odin MaxBytes[odin.mem]: 15000 Title[odin.mem]: odin memory use YLegend[odin.mem]: Memory use Legend1[odin.mem]: Used Legend2[odin.mem]: Total PageTop[odin.mem]: <H1>odin memory use</H1> ### odin connexions actives # marche plus depuis la laj en 2.4sp1 #Options[odin.con]: gauge,nopercent,noo #Target[odin.con]: .1.3.6.1.4.1.2021.8.1.101.1&.1.3.6.1.4.1.2021.8.1.101.1:public@odin #MaxBytes[odin.con]: 4100 #Title[odin.con]: connexions actives sur odin #YLegend[odin.con]: nb connex #PageTop[odin.con]: <H1>connexions actives sur odin</H1> ### odin uptime Target[odin.up]: `snmpget -v1 -c public odin .1.3.6.1.2.1.25.1.1.0 | awk '{if ($6 ~ /day/) print $5; else print 0}';echo 1` MaxBytes[odin.up]: 900 Options[odin.up]: gauge,noo YLegend[odin.up]: Jours Title[odin.up]: uptime odin PageTop[odin.up]: <H1>Uptime - odin</H1> ### system load 5/15 min ymir Target[ymir.sysload]: `uptime | sed s/.*load\ average:\ // | awk '{print $2*100 "\n" $3*100}'` MaxBytes[ymir.sysload]: 1000 Options[ymir.sysload]: gauge YLegend[ymir.sysload]: IO Title[ymir.sysload]: System load (5, 15) - ymir PageTop[ymir.sysload]: <H1>System load (5, 15) - ymir</H1> WithPeak[ymir.sysload]: n ### Memory used/total Target[ymir.mem]: `free -mo | grep Mem: | awk '{print $3"\n"$2}'` MaxBytes[ymir.mem]: 1500 Options[ymir.mem]: gauge YLegend[ymir.mem]: Mo Title[ymir.mem]: Memoire utilisee/totale -- ymir PageTop[ymir.mem]: <H1>Memory used/total - ymir</H1> ### Nombre de processus - ymir Target[ymir.process]: `ps -ef | wc -l ; echo 1` MaxBytes[ymir.process]: 500 Options[ymir.process]: gauge,noo YLegend[ymir.process]: nb processus Title[ymir.process]: Nombre de processus - ymir PageTop[ymir.process]: <H1>Nombre de processus - ymir</H1> ### Nb fichiers ouverts sur ymir Target[ymir.nbopenfic]: `lsof | wc -l ; echo 1` MaxBytes[ymir.nbopenfic]: 5000 Options[ymir.nbopenfic]: gauge,noo YLegend[ymir.nbopenfic]: nb Title[ymir.nbopenfic]: Nb fichiers ouverts sur ymir PageTop[ymir.nbopenfic]: <H1>Fichiers ouvert sur ymir</H1> ### Temp syst/cpu Target[ymir.cputemp]: `sensors | grep "Sys Temp" | awk '{print $3}' | sed s/,0°C/$1/ | sed s/+// ;\ sensors | grep "CPU Temp" | awk '{print $3}' | sed s/,0°C/$1/ | sed s/+//` MaxBytes[ymir.cputemp]: 90 Options[ymir.cputemp]: gauge YLegend[ymir.cputemp]: Celcius Title[ymir.cputemp]: Temp syst/cpu ymir PageTop[ymir.cputemp]: <H1>Temp syst/cpu - ymir</H1> ### Temp disque Target[ymir.hddtemp]: `/usr/sbin/hddtemp -n /dev/sda ; /usr/sbin/hddtemp -n /dev/sdb` # marche aussi avec sensors: # sensors | grep "CPU Temp" | awk '{print $3}' | sed s/,0°C/$1/ | sed s/+//` MaxBytes[ymir.hddtemp]: 90 Options[ymir.hddtemp]: gauge YLegend[ymir.hddtemp]: Celcius Title[ymir.hddtemp]: Temp disque sda/sdb ymir PageTop[ymir.hddtemp]: <H1>Temp disque sda/sdb - ymir</H1> ### ymir uptime Target[ymir.up]: `uptime | awk '{if ($4 ~ /day/) print $3; else print 0}';echo 1` MaxBytes[ymir.up]: 900 Options[ymir.up]: gauge,noo YLegend[ymir.up]: Jours Title[ymir.up]: Uptime ymir PageTop[ymir.up]: <H1>Uptime - ymir</H1> ### Espace libre : /boot sur ymir (Mo) Target[ymir.boot]: `/etc/mrtg/mrtg_scripts/espace_libre.sh /dev/sda1 m;echo 1` MaxBytes[ymir.boot]: 1000 Options[ymir.boot]: gauge,noo YLegend[ymir.boot]: Mo Title[ymir.boot]: Espace libre : /boot sur ymir (Mo) PageTop[ymir.boot]: <H1> Espace libre : /boot sur ymir (Mo)</H1> ### Espace libre : / sur ymir (Mo) Target[ymir.root]: `/etc/mrtg/mrtg_scripts/espace_libre.sh /dev/md0 m;echo 1` MaxBytes[ymir.root]: 5000 Options[ymir.root]: gauge,noo YLegend[ymir.root]: Mo Title[ymir.root]: Espace libre : / sur ymir (Mo) PageTop[ymir.root]: <H1> Espace libre : / sur ymir (Mo) </H1> ### Espace libre : /mnt/data sur ymir (Go) Target[ymir.data]: `/etc/mrtg/mrtg_scripts/espace_libre.sh /dev/md1 g;echo 1` MaxBytes[ymir.data]: 3000 Options[ymir.data]: gauge,noo YLegend[ymir.data]: Go Title[ymir.data]: Espace disque libre - ymir (Go) PageTop[ymir.data]: <H1>Espace disque libre (en Go) - ymir</H1> ### ymir connexions tcp Target[ymir.tcp]: `netstat -net | grep tcp | wc -l;netstat -nt | grep tcp | wc -l` Options[ymir.tcp]: gauge,nopercent MaxBytes[ymir.tcp]: 500 Title[ymir.tcp]: Connexions TCP established/totales sur ymir YLegend[ymir.tcp]: nb connex PageTop[ymir.tcp]: <H1>connexions TCP established/totales sur ymir</H1> ### ymir nb users sys/ftp Target[ymir.nbusers]: `users | wc -w ; netstat -net | grep 192.168.x.x:21 | wc -l` MaxBytes[ymir.nbusers]: 30 WithPeak[ymir.nbusers]: ymw Options[ymir.nbusers]: gauge YLegend[ymir.nbusers]: ymir users system/ftp Title[ymir.nbusers]: Utilisateurs sur ymir PageTop[ymir.nbusers]: <H1>Nb users system/ftp - ymir</H1> Legend1[ymir.nbusers]: nb system users Legend2[ymir.nbusers]: nb ftp users ShortLegend[ymir.nbusers]: nb users ### nb d'adresses MAC détectées sur le réseau (dont une du DSLAM de free) Target[odin.voisins]: `snmpwalk -v2c -c public odin IP-MIB::ipNetToMediaPhysAddress | wc -l ; echo 1` MaxBytes[odin.voisins]: 20 Options[odin.voisins]: gauge,noo YLegend[odin.voisins]: nb clients Title[odin.voisins]: Nb d'@ MAC visibles sur odin PageTop[odin.voisins]: <H1>Nb d'@ MAC visibles sur odin</H1>
Seuils d'alerte
Il est possible d'indiquer à MRTG de lancer un script d'alerte si les valeurs dépassent un seuil min et/ou max ; on peut définir un seuil min et un max pour l'input et 2 autres pour l'output.
# variable globale # # dossier accessible en ecriture a MRTG, pour enregistrer l'etat des seuils ThreshDir: /var/mrtg/thresh # variables par cible # # respect. max input, min input, max output, min output # ce sont les seuils de declenchement ThreshMaxI[target.name]: 1234 ThreshMinI[target.name]: 1 ThreshMaxO[target.name]: 12345 ThreshMinO[target.name]: 1 ThreshDesc[target.name]: Description de l'indicateur # definition des programmes a lancer en cas de depassement des seuils ThreshProgI[target.name]: /path/to/script_alarm_input.sh ThreshProgO[target.name]: /path/to/script_alarm_output.sh # definition des programmes a lancer en cas de retour a l'etat normal ThreshProgOKI[target.name]: /path/to/scripts/script_ok_input.sh ThreshProgOKO[target.name]: /path/to/scripts/script_ok_output.sh
Les scripts appelés par MRTG sont lancés avec 3 paramètres, respectivement le nom de la cible (target.name), la valeur du seuil et la valeur actuelle.
Exemple de script minimaliste :
#!/bin/bash #/path/to/script_alarm_input.sh echo "`date` - Depassement de seuil sur $1 : valeur actuelle = $3 ; valeur limite = $2" >> /path/to/file.log
MIBs
Les MIBs utilisées pour l'agent SNMP de Windows XP : http://support.microsoft.com/kb/237295/fr
Liens
- iReasoning MIB browser : un client graphique permettant d'émettre des requêtes SNMP vers un serveur.