La plupart des routeurs xDSL d'aujourd'hui sont capables d'envoyer à un serveur les logs d'utilisation et de connexion par l'intermédiaire du démon syslog. Cependant, les informations concernant cette fonction sont souvent absentes. Voici une méthode complète. Dans mon expérience, j'ai utilisé le routeur NetGear FR114P et syslog sous FreeBSD 5.4. Mais cette méthode doit pouvoir s'exporter sur d'autres routeurs et d'autres systèmes d'exploitations.

Les routeurs les plus récent proposent toutefois de choisir l'entité à laquelle l'on veut affecter les log du routeur.

Syslog

Syslog est un service (daemon) qui provient du monde UNIX, bien qu'il en existe une version sous Windows. C'est un outil qui récupère les messages envoyé par les programmes et les consigne dans des fichiers, les envoie à des utilisateurs...

Sous FreeBSD 5.4 il est lancé automatiquement au démarrage.

Les entités

Les messages récupérés par Syslog sont découpés en entités. Ces entités sont :

Il existe d'autres entités (13, 14), mais très peu utilisées.

Les messages

Pour chaque entité, il existe un ensemble de messages, c'est à dire un ensemble de niveaux de sévérité de chaque message reçu par Syslog. Ces messages sont :

Constitution des logs

Les logs envoyés à Syslog appartiennent forcément à une entité définie avec une sévérité définie. Dans Syslog, ce niveau est noté entité.niveau.

Récupérer les messages

Dans le cas de notre routeur, le plus difficile est de savoir à quel entité les messages sont envoyés. La plupart du temps, il s'agit de messages localn. Mais toute la difficulté provient de la façon de trouver n. Et il ne faut pas compter sur le vendeur du routeur pour nous l'indiquer.

Il existe donc deux méthodes possibles pour trouver le l'entité et ses niveaux. Une facile, mais incomplète (vous comprendrez bientôt pourquoi) et qui peut s'avérer totalement inutile, et une autre, plus complète, un peu plus technique mais plus efficace pour déterminer les disfonctionnements.

Première méthode (facile mais incertaine)

La méthode est simple : il suffit de mettre dans le fichier /etc/syslog.conf toutes les possibilités de messages, tous les couples possibles entité.niveau, en commençant par le plus probable, les localn.

Pour chaque localn, il faut définir les 8 niveaux et les envoyer chacun dans un fichier différent.


Attention

Syslog ne crée pas les fichiers s'ils n'existent pas. Il faut les créer pour lui. Une simple commande touch nom_de_fichier suffira à créer le fichier. Vu le nombre de fichiers à créer dans cette méthode, il vaut mieux créer un shell qui va se charger de créer les fichiers avec un minimum d'efforts.


Il ne vous reste plus qu'à relancer Syslog et constater quel fichier se remplit.

Dans le cas du routeur NetGear FR114P, il n'est pas nécessaire de lancer syslog avec un paramètre. Mais certaines configurations nécessiteront peut-être de le lancer avec l'option -a.

Pour relancer Syslog, tapez la commande :

kill -9 `more /var/run/syslog.pid`

syslogd

Seconde méthode (plus technique)

Tout le secret de cette technique repose sur l'utilisation de tcpdump, un utilitaire en standard sur les distributions libres. Pour Windows, il faudra se renseigner sur l'équivalent, s'il existe.

tcpdump est un utilitaire qui permet d'écouter un port et d'afficher ce qui y passe. Dans notre méthode, Syslog utilisant le port UDP 514, il ne nous reste plus qu'à écouter ce port.

Activation de la carte réseau

Tout d'abord, il faut activer la carte réseau correctement, c'est à dire le mode promiscious, qui permet d'écouter le trafic. Dans mon exemple, ep0 est l'inteface réseau que j'utilise.

ifconfig ep0 promisc


Remarque

ifconfig vous affiche simplement toutes vos interface réseau. Vous pourrez ainsi voir ce dont vous disposer et connaître le nom de votre interface.

Ecoute du port 514 avec tcpdump

Il suffit ensuite d'écouter :

tcpdump -X -i ep0 -s 1024 port 514 and proto UDP

l'option -i permet de déterminer sur quel appareil réseau vous désirez écouter le trafic. Il est utilise de le préciser si vous en avez plusieurs. Si vous n'en avez qu'un seul, vous pouvez omettre ce paramètre. Si tout se passe bien, vous devriez récupérer le trafic du réseau sur le port UDP 514. Et cela devrait ressembler à ceci :

10:01:40.411294 IP FR114P.syslog > Passerelle.syslog: UDP, length: 179 0x0000: 4500 00cf c2db 0000 4011 35e9 c0a8 0001 E.......@.5..... 0x0010: c0a8 0008 0202 0202 00bb 80ee 3c31 3838 ............<188 0x0020: 3e20 3230 3036 204a 616e 2032 3820 3130 >.2006.Jan.28.10 0x0030: 3a35 373a 3130 2028 4652 3131 3450 2d61 :57:10.(FR114P-a 0x0040: 382d 3662 2d37 6329 2038 322e 3233 342e 8-6b-7c).82.234. 0x0050: 3130 322e 3334 2054 4350 2070 6163 6b65 102.34.TCP.packe 0x0060: 7420 2d20 536f 7572 6365 3a38 322e 3233 t.-.Source:82.23 0x0070: 342e 3934 2e32 3332 2c31 3336 3720 2c57 4.94.232,1367.,W 0x0080: 414e 202d 2044 6573 7469 6e61 7469 6f6e AN.-.Destination 0x0090: 3a38 322e 3233 342e 3130 322e 3334 2c31 :82.234.102.34,1 0x00a0: 3335 202c 4c41 4e20 5b44 726f 705d 202d 35.,LAN.[Drop].- 0x00b0: 205b 496e 626f 756e 6420 5275 6c65 2834 .[Inbound.Rule(4 0x00c0: 2920 6e6f 7420 6d61 7463 685d 0d0a 20 ).not.match]... 10:01:40.411999 IP FR114P.syslog > Passerelle.syslog: UDP, length: 179 0x0000: 4500 00cf c2dc 0000 4011 35e8 c0a8 0001 E.......@.5..... 0x0010: c0a8 0008 0202 0202 00bb 7eee 3c31 3838 ..........~.<188 0x0020: 3e20 3230 3036 204a 616e 2032 3820 3130 >.2006.Jan.28.10 0x0030: 3a35 373a 3130 2028 4652 3131 3450 2d61 :57:10.(FR114P-a 0x0040: 382d 3662 2d37 6329 2038 322e 3233 342e 8-6b-7c).82.234. 0x0050: 3130 322e 3334 2054 4350 2070 6163 6b65 102.34.TCP.packe 0x0060: 7420 2d20 536f 7572 6365 3a38 322e 3233 t.-.Source:82.23 0x0070: 342e 3934 2e32 3332 2c31 3336 3920 2c57 4.94.232,1369.,W 0x0080: 414e 202d 2044 6573 7469 6e61 7469 6f6e AN.-.Destination 0x0090: 3a38 322e 3233 342e 3130 322e 3334 2c31 :82.234.102.34,1 0x00a0: 3335 202c 4c41 4e20 5b44 726f 705d 202d 35.,LAN.[Drop].- 0x00b0: 205b 496e 626f 756e 6420 5275 6c65 2834 .[Inbound.Rule(4 0x00c0: 2920 6e6f 7420 6d61 7463 685d 0d0a 20 ).not.match]...

etc.

Sur la première ligne vous trouvez votre machine, ici FR114P si vous l'avez défini dans le fichier /etc/hosts, sinon l'adresse IP de la machine émettrice. Passerelle est le nom du serveur Syslog, défini dans hosts également.

En dessous vous avez un ensemble de lignes ordonnées par colonnes. Intéressons nous à la dernière colonne. Plus particulièrement aux données incluses entre < et >. Ici 188. Il s'agit de notre entité.sévérité. Mais dans une version numérique.

Règle de calcul

La règle de calcul qui donne la valeur numérique récupérée est ainsi :

8 x entité + niveau.

Ce qui donne une série de valeur allant de 0 ( 8 x kernel + emerg ) à 191 ( 8 x local7 + debug ).

La règle pour passer de la valeur numérique à l'entité.niveau est :

Entité = Partie entière de (v/8)

niveau = reste de Entité x 8

Ou encore Entité est le quotient de la division euclidienne de v par 8, Niveau est le reste de la division euclidienne de v par 8


Dans notre exemple

188 donne :

Entité = 188 / 8 = 23

Niveau = 188 % 8 = 4 (0,5 x 8)

Grâce au tableau que j'ai donné au début, nous pouvons voir qu'il s'agit de local7, pour le niveau warning, soit :

local7.warning

Il suffira donc de récupérer tout ce qui concerne local7 dans syslog.

Mise en place

Vous avez défini l'ensemble des entités nécessaires pour votre routeur. En général un seul suffit mais certains cas en utilisent plusieurs.

Vous avez modifié le /etc/syslog.conf de façon à prendre en charge les messages provenant du routeur. Une fois syslog redémarré, tout est OK. Enfin vos fichiers de log se remplissent ! Vous avez (presque) gagné!

Presque! Car lorsque vous relancez la machine complètement, à nouveau les fichiers ne se remplissent plus. Et vous avez beau dire et maudire, rien ne se passe. Il n'y a que lorsqu'on relance manuellement le démon que tout se remet à nouveau à fonctionner normalement. seulement, vous n'avez pas envie d'arrêter le démon et le relancer après chaque redémarrage de machine, surtout s'il s'agit d'une machine qui doit fonctionner sans intervention humaine de proximité (par exemple un serveur).


Astuce

Mettez la commande de rédémarrage dans un shell placé dans le répertoire /etc/rc.d/. N'oubliez pas de lui donner les droits d'exécution.

Nommez le par exemple, syslog-restart, avec pour contenu :

#!/bin/sh

kill -9 `more /var/run/syslog.pid`

syslogd

Et n'oubliez pas de lui donner les droits en exécution (+x)

Cette commande sera automatiquement exécutée au démarrage, arrêtera le démon syslog pour le redémarrer.

Redémarrez votre machine et vérifiez que les logs se remplissent seuls.