User Tools

Site Tools


informatique:logiciels:mrtg

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) ou noo (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

informatique/logiciels/mrtg.txt · Last modified: 2013/10/14 20:45 by 127.0.0.1