This is an old revision of the document!
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 qui génère des graphiques d'utilisation de ressources réseaux à partir de données récupérées par SNMP (il peut aussi tracer d'autres courbes via l'utilisation de scripts). Le format de sortie (les résultats) sont au format HTML avec des images PNG.
SNMP
C'est 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. Pour récupérer les informations SNMP se base sur une (ou des) MIBs, qui se présentent sous la forme d'un arbre (comme le DNS) contenant diverses informations. Ces MIBs dépendant du matériel ; il y a une partie standard (pour les interfaces réseau par exemple) et une autre propriétaire ; dans ce dernier cas il faudra installer soi-même la MIB de son matériel.
Installation de SNMP
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
La première étape est d'installer le paquet :
apt-get install mrtg
On va ensuite créer un répertoire qui contiendra le(s) fichier(s) de configuration :
mkdir /etc/mrtg
Puis on génère le fichier de conf :
cfgmaker --ifdesc=descr --output=/etc/mrtg/server.cfg public@server
- 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 :
# Created by # /usr/bin/cfgmaker --ifdesc=descr --output=/etc/mrtg/odin.cfg public@odin # (et un peu retouche) ### 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.