Vous êtes l'administrateur système d'un réseau de machines et vous voudriez qu'elles soient toutes synchronisées sur la même heure en permanence? La pile de votre carte mère est défaillante et souvent votre PC se croit revenu au 1er janvier 1980? Alors NTP va probablement vous intéresser.
Le Network Time Protocol (NTP) est utilisé pour synchroniser l'heure du système d'un ordinateur avec un ou plusieurs autres ordinateurs disposant d'une source fiable comme référence temporelle, tel un récepteur radio branché sur les émissions d'une horloge atomique ou un récepteur GPS.
NTP permet à l'ordinateur client de se synchroniser avec une précision d'environ une milliseconde si les 2 machines sont situées sur un même réseau local et jusqu'à quelques dizaines de millisecondes.
Une configuration NTP typique utilise plusieurs serveurs de temps (pour la redondance) qui devront être de préférence sur des réseaux physiques différents.
Le daemon xntp fonctionne en interrogeant régulièrement le ou les serveurs spécifiés dans son fichier de configuration et synchronise la machine locale en tenant compte des délais de transmission induits par les connexions réseau.
D'autre part, xntp calcule la déviation standard de la machine locale et utilise cette déviation moyenne pour continuer à tenir la machine à l'heure même si elle ne peut contacter aucun serveur NTP pendant un certain temps (comme par exemple dans le cas d'une machine qui est reliée à Internet par une connexion PPP intermitente).
Les algorithmes utilisés en interne par NTP ont évolués en quelque chose d'extrêmement sophistiqué au cours de son développement, et, bien qu'intéressant, cela dépasse largement le cadre de cet article.
Ceux qui sont intéressés par les détails pourront consulter la RFC-1305 pour la définition du protocole, ainsi que les RFC-1128, RFC-1129, RFC-1361 et RFC-1769 qui analysent le design, l'implémentation et les performances de NTP.
Installation :
Les distributions Debian & Red Hat comportent chacune un package xntp3 qu'il suffit d'installer.
Pour ceux qui utilisent d'autres distributions ou qui préfèrent compiler leurs programmes eux-mêmes, les sources de xntp sont disponibles sur ftp.udel.edu:/pub/ntp/. La compilation et l'installation à partir des sources ne devraient pas poser de problème car xntp utilise GNU Autoconf ; il suffit donc de taper
./configure && make && make install
Configuration
xntp n'a besoin que d'un seul fichier de configuration (par ailleurs assez simple) :
# /etc/ntp.conf
# Fichier d'historique
logfile /var/log/xntpd
# Fichier contenant la deviation moyenne
driftfile /var/lib/ntp/ntp.drift
# Répertoire contenant les statistiques d'utilisation
statsdir /var/log/ntpstats/
# Statistiques désirées
statistics loopstats peerstats clockstats
filegen loopstats file loopstats type day enable
filegen peerstats file peerstats type day enable
filegen clockstats file clockstats type day enable
# Liste des serveurs NTP
server chronos.inria.fr prefer
server ntp.fuller.edu
# End of /etc/ntp.conf
Lancement du daemon xntpd:
Si vous avez installé xntp3 à partir d'un package rpm ou debian, il existe déjà sur votre système un fichier /etc/init.d/xntp3 (Debian) ou /etc/rc.d/init.d/xntpd (Red Hat) qui est automatiquement exécuté lors du démarrage du système. À défaut, il suffit d'ajouter la ligne :
/usr/sbin/xntpd &
dans votre fichier rc.local ou équivalent.
La commande ntpdate :
Certaines machines ont un BIOS qui "dérive" beaucoup et xntp refuse de remettre la machine à l'heure au démarrage si l'heure du système est trop différente de l'heure fournie par NTP. Pour ce cas de figure, le package xntp fournit la commande ntpdate qui permet de remettre à l'heure une machine lors de son démarrage.
ntpdate -b -s ntp.mon-domaine.com
Configuration avancée :
Pour éviter que des personnes non-autorisées utilisent votre machine comme serveur de temps, xntp permet d'utiliser un système d'authentification pour limiter l'accès à votre serveur.
Il faut pour cela ajouter les lignes suivantes dans les fichiers ntp.conf des machines serveurs et clients :
# Fichier contenant les clefs
keys /etc/ntp.keys
# Numéro de la clef à présenter pour une requête de # synchronisation.
trustedkey 1
# Numéro de la clef à présenter pour l'utilisation de # xntpdc
requestkey 1
# Numéro de la clef à présenter pour l'utilisation de # ntpq
controlkey 1
Le fichier de configuration du serveur devra, de plus, contenir les lignes :
# Activer l'authentification
enable auth
Le fichier /etc/ntp.keys (doit être en mode 600 et appartenir à root pour éviter que les utilisateurs de la machine puissent avoir accès aux clefs) devra contenir une (ou plusieurs) lignes, chacune contenant 3 champs : le numéro de la clef, le type de la clef et enfin la clef elle-même.
Par exemple :
1 A laclef
Dans ce cas, le type de clef est 'A' pour ASCII. xntp supporte également d'autres types d'authentifications comme DES ou MD5 (respectivement 'S' et 'M').
Quelles sont ces 2 commandes xntpdc et ntpq mentionnées dans les commentaires de l'exemple précédent ? Elles sont à xntp ce que nslookup est au DNS, à savoir un moyen rapide d'interroger un serveur NTP à des fins de vérification ou de débugage. Notons au passage que ces 2 commandes permettent également de modifier au vol les paramètres du serveur xntp sans avoir à le relancer.
La commande ntptrace :
Pour vérifier à partir d'où une machine synchronisée par NTP prend sa référence de temps, on peut utiliser la commande ntptrace :
% ntptrace
localhost: stratum 4, offset 0.0019529, synch distance 0.144135
server2ozo.com: stratum 2, offset 0.0124263, synch distance 0.115784
usndh.edu: stratum 1, offset 0.0019298, synch distance 0.011993, refid 'WWVB'
%
Pour chaque ligne, les champs correspondent à :
• Le nom de la machine (dans notre exemple, la première machine de la chaîne est 'localhost' car aucun nom n'a été donné en paramètre à ntptrace).
• Le niveau de la machine dans la chaîne.
• La différence entre la machine locale et cette machine (différence telle qu'elle a été mesurée par ntptrace; il est possible que cette différence se soit pas tout à fait nulle pour la machine 'localhost').
• La distance de synchronisation de la machine.
(Seulement pour les serveurs de niveau-1) le nom symbolique de l'horloge de référence.
Modes broadcast et multicast :
Vous venez d'installer un serveur xntp sur votre réseau local et 200 machines clients l'utilisent comme source de synchronisation ? Dans ce cas, vous pouvez limiter le "bavardage" des daemons NTP entre eux, xntp offrant la possibilité de fonctionner en mode broadcast ou multicast :
A ajouter dans le fichier /etc/ntp.conf des clients :
broadcastclient
broadcastdelay 0.008
A ajouter dans le fichier des serveurs :
broadcast <adresse-de-broadcast-de-votre-reseau>
Il est important de noter que le daemon xntp se bloque en mémoire à l'aide de l'appel système mlock() qui empèche le process d'être "swapé" afin que les temps de réaction soient les plus courts possibles. De ce fait, xntp occupe en permanence environ 1 Mo de mémoire, ce qui dégrade d'autant les performances des machines anciennes qui ne disposent que de peu de mémoire.
Pour ce type de machines, il sera possible de n'utiliser que la commande ntpdate, lancée à intervalles réguliers. Cela peut se faire, par exemple, en ajoutant la ligne suivante dans la crontab de l'utilisateur root :
00 * * * * /usr/sbin/ntpdate -b -s ntpserver.domaine.com
Cette méthode n'apportera pas la même précision que le daemon xntp, dans la mesure où il ne sera pas tenu compte de la dérive de l'horloge de votre machine.
ntpdate utilise 2 méthodes différentes pour resynchroniser l'horloge locale. Si la dérive est inférieure à 0.5 seconde, l'appel système settimeofday() est utilisé, sinon la fonction adjtime() est appelée pour accélérer ou ralentir l'horloge du système de 10% jusqu'à ce que celle-ci soit à l'heure désirée. Cette méthode permet d'éviter les "bonds quantiques" qu'un système Unix n'appréciera pas forcement. En effet, si l'heure passe brusquement de 11h59 à 12h01, alors le programme que la crontab devait exécuter à 12h00 ne sera pas lancé.
Notons enfin que xntp ne fonctionne pas seulement sous Linux mais sous la plupart des Unix ainsi que sous Windows NT, ce qui vous permettra de maintenir à l'heure toutes les machines de votre réseau quel que soit le système d'exploitation utilisé.
Vincent Renardias <vincent@debian.org>