Par Pat Eyler pate@gnu.org
Ping est un outil de diagnostic qui permet de s'assurer de la connexion entre deux machines sur un réseau. Il envoie des paquets contenant des demandes d'écho ICMP vers une adresse IP distante et se met à l'écoute de réponses ICMP. L'auteur de la première version du programme ping que nous utilisons aujourd'hui était Mike Muss. Depuis, beaucoup d'autres ont peaufiné, réécrit et molesté ping de diverses façons.
L'origine du nom ping est assez pittoresque. Certaines personnes affirment que c'est l'acronyme de Packet INternet Groper mais ce n'est pas le cas. Il tire son nom d'un système de détection par sonar. On connaît même l'histoire d'un administrateur ayant écrit un script qui « pinguait » continuellement une machine du réseau en émettant un signal d'alerte sonore qui faisait « ping » à chaque succès. Ensuite, il pouvait aller inspecter méthodiquement tous les connecteurs BNC de son réseau jusqu'à trouver le responsable de tous les maux de son réseau : quand le signal s'arrêtait, il avait trouvé le fautif.
Ping a longtemps été un très bon indicateur de la capacité des machines à recevoir et envoyer des paquets ICMP. Si vous pouviez « pinguer » un hôte, vous pouviez aussi établir une connexion ftp ou http. C'est moins le cas avec la généralisation du filtrage de paquets pour des raisons de sécurité. Beaucoup de pare-feu interdisent explicitement les paquets ICMP pour deux motifs :
La décision de laisser ICMP passer par votre pare-feu est difficile à prendre. On peut certainement trouver à ICMP des utilisations intéressantes mais il peut aussi être le point de départ d'attaques (p. ex., le « Ping de la Mort » ("Ping of Death"), qui envoyait des paquets surdimensionnés pour engorger la pile IP de la cible -- avec souvent des effets spectaculaires). Si vous décidez d'autoriser ICMP dans votre réseau, réfléchissez bien aux conséquences.
Des variantes de la commande ping ont été écrites pour d'autres usages. Parmi les plus connues, fping, qui a été conçue pour « pinguer » une plage d'adresses et est couramment utilisée dans les scanners de réseau et les moniteurs comme saint et mon (desquels ils sera question dans cet article). Autre variation, le module Net::Ping, qui apporte à Perl les fonctionnalités de ping sans qu'il soit nécessaire d'appeler un programme externe depuis un script. Vous pourriez utiliser ce dernier un peu comme ceci :
#!/usr/bin/perl -w use strict; use Net::Ping; my $host = $ARGV[0]; my $p = Net::Ping->new("icmp"); if ($p->ping($host)) { print "$host est vivant.\n"; } else { print "$host est hors d'atteinte.\n"; }
La plupart du temps, ping est lancé sans autres arguments et arrêté avec un Ctrl-c, ce qui donne ceci :
[pate@cherry pate]$ ping mango
PING mango (192.168.1.1) from 192.168.1.10 : 56(84) bytes of data.
64 bytes from mango (192.168.1.1): icmp_seq=0 ttl=255 time=0.5 ms
64 bytes from mango (192.168.1.1): icmp_seq=1 ttl=255 time=0.3 ms
64 bytes from mango (192.168.1.1): icmp_seq=2 ttl=255 time=0.3 ms
64 bytes from mango (192.168.1.1): icmp_seq=3 ttl=255 time=0.3 ms
64 bytes from mango (192.168.1.1): icmp_seq=4 ttl=255 time=0.3 ms
64 bytes from mango (192.168.1.1): icmp_seq=5 ttl=255 time=0.3 ms
--- mango ping statistics ---
6 packets transmitted, 6 packets received, 0% packet loss
round-trip min/avg/max = 0.3/0.3/0.5 ms
[pate@cherry pate]$
On peut diviser cette sortie en trois sections. La première, la simple ligne qui commence par le mot PING, montre un aperçu de la commande. La seconde section constituée des lignes commençant par 64 bytes affiche une trace des réponses reçues. Quant à la troisième, tout ce qui suit la ligne --- mango ping statistics ---, elle donne une récapitulation des résultats. Dans le cas présent, ils sont bons, aucun des paquets n'ayant été perdu et chacun ayant été transmis assez rapidement.
Cet exemple révèle également un point important : vous ne devriez pas vous fier à un seul paquet pour analyser votre réseau. Une série de cinq ou dix est bien plus intéressante dans la mesure où un réseau encombré peut vous faire perdre jusqu'à 40% de données, sans compter qu'un simple paquet perdu peut être dû à un hôte occupé à l'autre bout.
La commande ping comporte plusieurs options utiles. Elles sont reprises dans le tableau qui suit :
Option | Description |
-c count | Arrêt de l'envoi et de la réception après count paquets. |
-d | Positionne l'indicateur SO_DEBUG sur le socket utilisé. |
-f | Envoie les paquets aussi rapidement que possible. (flood) |
-i wait | Fixe un intervalle de wait secondes entre les paquets. |
-I ?device? | Positionne l'interface de sortie. |
-l preload | Envoie preload paquets aussi rapidement que possible, puis repasse en mode normal. |
-n | Ne résout pas les noms d'hôte, retourne uniquement les adresses IP. (numérique) |
-p pattern | Spécifie jusqu'à 16 octets de « remplissage » à envoyer avec le paquet. |
-q | N'affiche que les lignes de résumé. (silencieux) |
-r | N'utilise pas les tables de routage pour envoyer le paquet, l'envoie simplement sur l'interface locale. |
-R | Active l'option Record Route. |
-s packetsize | Fixe le nombre d'octets de données envoyés à packetsize |
-T tsonly | Émet un ping avec l'option horodatage. |
-T tsandaddr | Récupère l'horodatage et les adresses. |
-T tsprespec [host1 [host2 [host3 [host4]]]] | Récupère l'horodatage et les adresses à partir de noeuds spécifiés à l'avance. |
On peut combiner ces options pour rendre ping encore plus utile. La commande ping telle qu'utilisée précédemment ne permet pas de se rendre compte qu'elle peut prendre plusieurs secondes pour être exécutée et retourner ses diagnostics. L'option -f réduira le temps passé à attendre la commande. En combinant ceci avec les options -c 10 et -q vous obtiendrez rapidement des résultats plus faciles à lire :
[root@cherry /root]# ping -c 10 -fq mango
PING mango (192.168.1.1) from 192.168.1.10 : 56(84) bytes of data.
--- mango ping statistics ---
10 packets transmitted, 10 packets received, 0% packet loss
round-trip min/avg/max = 0.2/0.2/0.9 ms
[root@cherry /root]#
NB : Les options -f et -l ne peuvent être employées que par root car elles peuvent dégrader sérieusement le fonctionnement du réseau si on s'en sert à mauvais escient.
Il peut être intéressant d'essayer des paquets de taille plus importante, grâce à ping -c10 -s 1024 -qf qui s'en acquittera pour vous. Cela peut se révéler particulièrement utile lorsque vous suspectez des problèmes de fragmentation de paquets.
Pour voir la route qu'empruntent vos paquets, vous pouvez utiliser ping -c10 -R. Cette commande engendre la sortie suivante :
PING tbr.nailed.org (206.66.240.72) from 192.168.1.10 : 56(124) bytes of data.
64 bytes from bigfun.whirlycott.com (206.66.240.72): icmp_seq=0 ttl=239 time=217.2 ms
RR: 192.168.1.10
216.41.39.90
serial0.mmgw32.bos1.Level3.net (209.244.39.25)
208.218.130.22
166.90.184.2
so-6-0-0.mp2.NewYork1.level3.net (209.247.10.45)
137.39.52.10
180.ATM7-0.BR2.NYC9.ALTER.NET (152.63.22.229)
lo0.XR2.NYC9.ALTER.NET (137.39.4.175)
64 bytes from bigfun.whirlycott.com (206.66.240.72): icmp_seq=1 ttl=239 time=1940.8 ms (same route)
64 bytes from bigfun.whirlycott.com (206.66.240.72): icmp_seq=2 ttl=239 time=250.6 ms (same route)
64 bytes from bigfun.whirlycott.com (206.66.240.72): icmp_seq=3 ttl=239 time=230.3 ms (same route)
64 bytes from bigfun.whirlycott.com (206.66.240.72): icmp_seq=4 ttl=239 time=289.8 ms (same route)
64 bytes from bigfun.whirlycott.com (206.66.240.72): icmp_seq=5 ttl=239 time=1261.4 ms (same route)
64 bytes from bigfun.whirlycott.com (206.66.240.72): icmp_seq=6 ttl=239 time=469.4 ms (same route)
64 bytes from bigfun.whirlycott.com (206.66.240.72): icmp_seq=7 ttl=239 time=1272.3 ms (same route)
64 bytes from bigfun.whirlycott.com (206.66.240.72): icmp_seq=8 ttl=239 time=353.1 ms (same route)
64 bytes from bigfun.whirlycott.com (206.66.240.72): icmp_seq=9 ttl=239 time=1281.1 ms (same route)
--- tbr.nailed.org ping statistics ---
10 packets transmitted, 10 packets received, 0% packet loss
round-trip min/avg/max = 217.2/756.6/1940.8 ms
NB : L'option record route spécifiée par -R n'est pas honorée par tous les routeurs et tous les hôtes. De plus, elle ne dispose que d'un espace limité pour contenir les adresses des routeurs. Traceroute est sans doute un meilleur outil pour identifier le parcours de paquets à travers un réseau.
La commande ping est très utile pour votre kit de secours et ne devrait pas être sous-estimée.
Copyright © 2000, Pat Eyler et New Riders Publishing. Cet article est publié sous la licence Open Publication License, sans aucune mention additionnelle. C'est le brouillon d'une section du livre « Networking Linux: A Practical Guide to TCP/IP », qui sera publié par New Riders Publishing l'hiver prochain.
Paru dans le numéro 56 de la Linux Gazette d'août 2000.
Traduction française de Joel SAGNES.