Comment mettre en place un serveur de temps NTP avec Chronyd
La synchronisation horaire est un élément fondamental et crucial pour le bon fonctionnement d’un système d’information. Elle garantit la cohérence des journaux d’événements, elle facilite la corrélation des alertes de sécurité, et évite les erreurs lors des échanges réseau, ou lors des authentifications avec Kerberos (qui rejette les connexions si l'horloge du serveur de temps et de la machine cliente ne sont pas assez proches).
Mais avant de nous plonger dans la configuration technique, il est essentiel de bien comprendre pourquoi la synchronisation horaire est un enjeu crucial en environnement informatique. Si ce n'est pas encore fait, je vous invite à lire l'article sur Qu’est-ce que le protocole NTP et pourquoi est-il important d’avoir un serveur NTP ?, qui pose les bases théoriques.
Ce tutoriel a donc pour objectif de vous montrer comment mettre en place un serveur de temps NTP (Network Time Protocol) dans un contexte proche de celui d'une infrastructure professionnelle. Il explique également son fonctionnement et montre comment synchroniser l’horloge de toutes les machines d'une infrastructure, qu’elles soient physiques ou virtuelles, sous Linux comme sous Windows.
Mise en contexte
Pour vous donner un aperçu, je vous présente un schéma illustrant l'infrastructure que j'ai mise en place au sein de mon environnement, et que vous pouvez reproduire dans un premier temps afin de comprendre son fonctionnement :

Dans ce contexte, je vais mettre en œuvre mon serveur de temps dans un VLAN différent de mes machines clientes. J'aurai donc un "VLAN Serveurs" et un "VLAN Clients".
Concernant le serveur de temps, ce dernier aura comme adresse IP statique "172.16.2.5".
Pour ce qui est de mes clients, je vais utiliser deux types de clients, un poste sous Linux ayant comme adresse IP "172.16.3.5", et un autre sous Windows ayant comme adresse IP "172.16.3.6".
J'ai mis en place que 2 clients, mais vous pouvez mettre autant de clients que vous souhaitez.
Pré requis
Une machine qui fera office de serveur de temps (Linux)
Pour ce qui est des pré requis, il n'y a pas grand chose à savoir, sachant que le serveur de temps qui hébergera chrony, n'aura besoin que de très peu de ressources. Donc une machine avec 1 Go de RAM, 1 cœur ainsi que 10 Go de stockage sera largement suffisante.
Une machine cliente (Linux, Windows, ou les deux)
- Linux (debian) : les mêmes caractéristiques que ci-dessus si vous utilisez uniquement Linux sans interface graphique, sinon se référer à la note ci-dessous.
- Windows (11) :
- 2 cœurs
- 4 Go de RAM
- 64 Go de stockage
A noter que pour le client Linux (debian), cela dépend si elle contient ou non une interface graphique ; si cela est le cas, il faudra augmenter légèrement vos RAM et stockage. De même pour Windows, dans notre exemple, nous prenons un Windows 11, mais si tel n'est pas le cas, il faudra réadapter en fonction de si vous êtes sur un Windows Server, Windows 10, ou toutes autres versions possibles.
Qu'est-ce que Chrony ?
Chrony est un service utilisant le protocole NTP. Il permet de synchroniser l'horloge système des machines ou équipements réseaux, en interrogeant des sources de temps publiques/externes.
Chrony comporte deux programmes distincts :
- Chronyd : qui est un démon, ce dernier permettant de démarrer, de l'activer, de vérifier son état, ou encore d'arrêter son processus.
- Chronyc : qui lui est un programme dédié à l'interface de ligne de commande, permettant de surveiller les performances de chronyd et de faire différentes configurations en fonction de l'environnement souhaité.
Concernant les ressources nécessaires à l'utilisation de Chrony, celui-ci ne demande que très peu de ressources, comme il est possible de le constater sur la capture d'écran ci-dessous, il consomme à peine 100 Mo de mémoire, si ce n'est plus.


Comment fonctionne un serveur de temps ?
Prenons un exemple afin que vous puissiez mieux visualiser et comprendre.
Pour faire simple, le serveur de temps local va récupérer l'heure via des sources de temps fiables tels que des serveurs NTP publics. En fonction des configurations, le serveur de temps peut soit :
- se synchroniser directement avec une autre source de référence
- soit via d'autres serveurs NTP intermédiaires.
Le chemin hiérarchique serait comme suit en sachant que stratum 0 correspond a la première source de temps : stratum 0 (source de temps de référence primaire) -> stratum 1 (tels qu'un serveur de temps synchronisé avec un stratum O) -> stratum 2 (tels qu'un serveur de temps synchronisé avec un stratum 1) -> stratum 3 (tels qu'un ordinateur synchronisé avec un stratum 2), et ainsi jusqu'au stratum de niveau 16, qui représente une horloge considérée comme étant non synchronisée.

Par la suite chrony utilisera un fichier de dérive (appelé driftfile) afin de compenser les variations de précisions entre l'horloge locale interne et l'heure réelle, et ainsi d'avoir une synchronisation plus fiable et précise. Une fois configurés, tous les équipements du réseau interrogeront ce serveur NTP local afin de synchroniser leurs horloges système.
Mise en place
Configuration sur le serveur NTP
Dans un tout premier temps, nous allons configurer notre serveur de temps source. En amont, si ce n'est pas fait, mettez à jour vos paquets avec la commande :
sudo apt update && apt upgrade -y
Par la suite, installer le paquet chrony avec la commande suivante :
sudo apt install sudo chrony -y
Puis vérifier que chrony est bien en cours d’exécution :
sudo systemctl status chrony
S'il n'est pas démarré, exécuter la commande :
sudo systemctl start chronyPar la suite il faut modifier le fichier de configuration de chrony, pour cela entrer dans le fichier de configuration /etc/chrony/chrony.conf :
nano /etc/chrony/chrony.conf
Puis ajouter le bloc ci-dessous en adaptant à votre propre configuration.
Voici un exemple de ce à quoi doit ressembler la configuration une fois terminée :
# Welcome to the chrony configuration file. See chrony.conf(5) for more
# information about usable directives.
# Include configuration files found in /etc/chrony/conf.d.
confdir /etc/chrony/conf.d
# Use Debian vendor zone.
server 0.fr.pool.ntp.org iburst
server 1.fr.pool.ntp.org iburst
server 2.fr.pool.ntp.org iburst
server 3.fr.pool.ntp.org iburst
server time.google.com iburst
server ntp.unice.fr iburst
# Use time sources from DHCP.
sourcedir /run/chrony-dhcp
# Use NTP sources found in /etc/chrony/sources.d.
sourcedir /etc/chrony/sources.d
# This directive specify the location of the file containing ID/key pairs for
# NTP authentication.
keyfile /etc/chrony/chrony.keys
# This directive specify the file into which chronyd will store the rate
# information.
driftfile /var/lib/chrony/chrony.drift
# Save NTS keys and cookies.
ntsdumpdir /var/lib/chrony
# Uncomment the following line to turn logging on.
#log tracking measurements statistics
# Log files location.
logdir /var/log/chrony
# Stop bad estimates upsetting machine clock.
maxupdateskew 100.0
# This directive enables kernel synchronisation (every 11 minutes) of the
# real-time clock. Note that it can't be used along with the 'rtcfile' directive.
rtcsync
# Step the system clock instead of slewing it if the adjustment is larger than
# one second, but only in the first three clock updates.
makestep 1 3
# Get TAI-UTC offset and leap seconds from the system tz database.
# This directive must be commented out when using time sources serving
# leap-smeared time.
leapsectz right/UTC
local stratum 10
allow 172.16.1.0/24 # Remplacer les sous réseaux par ceux que vous souhaitez
allow 172.16.2.0/24 # Remplacer les sous réseaux par ceux que vous souhaitez
Dans la section # Use Debian vendor zone., il faut y configurer les différents pools de serveurs, il en existe plusieurs, le mieux est d'en avoir quelques-uns, afin d'y avoir au cas où un pool tombe en panne, qu'il y en ait un second qui puisse prendre le relais.
Il faut également ajouter une couche de sécurité, notamment en filtrant, et en y configurant uniquement vos sous réseaux de votre infrastructure qui doivent utiliser votre serveur NTP.
Une fois la configuration terminée, enregistrer puis quitter le fichier.
Configuration sur le client NTP Linux (Debian 12)
Une fois la première partie de configuration terminée sur le serveur de temps, nous allons configurer nos différents clients. Ici, nous allons configurer un client Linux qui utilisera donc notre serveur de temps que nous avons préalablement mis en place.
Sur le client NTP, si cela n'est pas déjà fait, mettez à jour vos paquets avec la commande :
sudo apt update && sudo apt upgrade -y
Puis installer le service chrony avec la commande suivante :
apt install chrony -yPuis vérifier que chrony est bien en cours d’exécution :
sudo systemctl status chrony
S'il n'est pas démarré, exécuter la commande :
sudo systemctl start chronyPar la suite, il faudra modifier le fichier de configuration de chrony, afin d'y configurer l'ajout de notre serveur NTP maître dans la section # Use Debian vendor zone.. Pour cela, entrer dans le fichier /etc/chrony/chrony.conf :
nano /etc/chrony/chrony.conf
Puis ajouter le bloc ci-dessous en adaptant à votre propre configuration.
Voici un exemple de ce à quoi doit ressembler la configuration une fois terminée :
# Welcome to the chrony configuration file. See chrony.conf(5) for more
# information about usable directives.
# Include configuration files found in /etc/chrony/conf.d.
confdir /etc/chrony/conf.d
# Use Debian vendor zone.
server 172.16.2.5 iburst # Remplacer l'IP par celle de votre serveur NTP maitre
# Use time sources from DHCP.
sourcedir /run/chrony-dhcp
# Use NTP sources found in /etc/chrony/sources.d.
sourcedir /etc/chrony/sources.d
# This directive specify the location of the file containing ID/key pairs for
# NTP authentication.
keyfile /etc/chrony/chrony.keys
# This directive specify the file into which chronyd will store the rate
# information.
driftfile /var/lib/chrony/chrony.drift
# Save NTS keys and cookies.
ntsdumpdir /var/lib/chrony
# Uncomment the following line to turn logging on.
#log tracking measurements statistics
# Log files location.
logdir /var/log/chrony
# Stop bad estimates upsetting machine clock.
maxupdateskew 100.0
# This directive enables kernel synchronisation (every 11 minutes) of the
# real-time clock. Note that it can't be used along with the 'rtcfile' directive.
rtcsync
# Step the system clock instead of slewing it if the adjustment is larger than
# one second, but only in the first three clock updates.
makestep 1 3
# Get TAI-UTC offset and leap seconds from the system tz database.
# This directive must be commented out when using time sources serving
# leap-smeared time.
leapsectz right/UTCDans la section # Use Debian vendor zone. , il faut y configurer notre serveur de temps, dans mon cas mon serveur de temps utilise l'adresse IP "172.16.2.5", alors dans la section # Use Debian vendor zone. , il faudra ajouter l'adresse IP qu'utilise notre serveur de temps.
Par la suite, redémarrer le service chronyd afin de le synchroniser avec le serveur de temps :
systemctl restart chronyd
Configuration sur le client NTP Windows
Maintenant, nous allons configurer un client Windows qui utilisera donc notre serveur de temps que nous avons préalablement mis en place.
Sur Windows, depuis le CMD ou PowerShell en mode administrateur, exécutez les commandes suivantes afin d'ajouter votre serveur de temps source :
w32tm /config /manualpeerlist:"172.16.2.5" /syncfromflags:manual /updatenet start w32time , puis de réexécuter la commande ci-dessus afin d'y ajouter votre serveur de temps source.Par la suite, arrêter puis démarrer de nouveau le service de temps avec les commandes :
net stop w32timenet start w32timeFuseau horaire (optionnel)
Par contre en fonction de votre langue de votre Windows, il est possible que votre horloge soit en PST (Pacific Standard Time) donc horaire de la côte ouest des Etats-Unis (ou un autre fuseau horaire), et non en CEST (Central European Summer Time). Pour cela il faudra bien vérifier sur quel fuseau horaire est votre Windows avec la commande :
tzutil /gPuis si le fuseau horaire est différent de CEST, s'il vous le souhaitez, vous pouvez le modifier avec la commande :
tzutil /s "Romance Standard Time"Romance Standard Time correspond au fuseau horaire Europe/Paris.Sur le serveur NTP
Maintenant, nous allons de nouveau retourner sur le serveur NTP et nous allons redémarrer le service chrony :
systemctl restart chronydPuis, nous allons activer la synchronisation avec la commande :
sudo timedatectl set-ntp trueIl est également possible de voir les clients qui ont été configurés afin de permettre d'interroger votre serveur NTP :
chronyc clients
La commande chronyc clients affiche une liste avec les clients ayant accédé au serveur de temps via le port NTP ou NTS-KE, vous pourrez y voir notamment :
- Hostname : le nom de vos machines clientes, dans mon cas ce sont mes deux clients.
- NTP : le nombre de paquets reçu du client.
- Drop : le nombre de paquets abandonnés afin de limiter le taux de réponse.
- Int : l'intervalle moyen entre les paquets en secondes.
- IntL : l'intervalle moyen entre les paquets reçus en secondes.
- Last : le temps écoulé depuis la réception du dernier paquet NTP en secondes.
- Cmd : le nombre de paquets de commande ou de connexions NTS-KE reçus/ acceptables.
- Drop : le nombre de paquets de commande ou de connexions NTS-KE qui ont été abandonnés afin de limiter le taux.
- Int : l'intervalle moyen entre les paquets de commande ou de connexion NTS-KE.
- Last : le temps écoulé depuis la réception/acceptation du dernier paquet de commande ou de la dernière connexion NTS-KE.
Les tests de bon fonctionnement
Sur le client NTP
Linux
Maintenant que tout est correctement configuré, tant sur notre serveur que sur nos machines clientes, nous allons pouvoir réaliser plusieurs tests de bon fonctionnement afin de vérifier que nos machines clientes utilisent bien notre serveur de temps local.
Dans un premier temps, retournez sur votre client Linux et faites les tests suivants afin de vérifier que le client est bien synchronisé avec le serveur NTP :
chronyc sources -v

La commande chronyc sources -v montre une liste détaillée des sources de temps utilisées par chrony. Dans mon exemple, la liste comporte qu'une seule source avec son adresse IP, qui est celle que j'ai configurée sur mon serveur NTP.
La première colonne "MS" signifie le mode de la source ainsi que son état, plusieurs options sont possibles :
- M : Cette option indique le mode de la source, voici ses différents caractères :
- ^ : Signifie que la source provient d'un serveur.
- = : Signifie que la source provient d'un pair.
- # : Signifie une source provenant d'une horloge de référence connecté localement.
- S : Cette option indique l'état de la source, voici ses différents caractères :
- * : Indique la meilleure source qui est actuellement utilisée.
- ? : Indique qu'une source n'est pas considérée comme utilisable.
- + : Indique des sources supplémentaires utilisables, en plus de la meilleure source.
- - : Indique qu'une source est inutilisée.
- Name/IP address : indique le nom ou l'adresse IP utilisé par la machine hébergeant la source de temps, ou l'identifiant de références pour les horloges de références externes.
- Stratum : indique le niveau de sauts entre le client et la source de temps de référence.
- Poll : indique la fréquence d'interrogation de la source de temps utilisée. Dans mon cas, c'est toutes les 6 secondes.
- Reach : indique le statut de disponibilité de la source afin de savoir si les dernières interrogations de la source sont correctes et valides. Dans mon 377, indique que les 8 dernières interrogations ont été reçues avec succès.
- LastRx : indique le temps de réception du dernier paquet en seconde.
- Last sample : indique le décalage entre l'horloge locale et celle de la source lors de la dernière mesure. Un décalage positif indique que l'horloge locale est en avance sur celle de la source. Le signe "+/-" indique la marge d'erreur provenant de la mesure.
chronyc tracking

La commande chronyc tracking affiche différents paramètres aux performances de l'horloge système, tels que le niveau de strate, la date et l'heure de référence au moment de l'exécution de la commande, ou encore de la fréquence.
timedatectl status

La commande timedatectl status affiche différentes informations liées aux paramètres actuels de l'horloge de temps, tels que l'état de la synchronisation, et permettra notamment de vérifier tout simplement l'heure.
Windows
Sur Windows, les commandes sont différentes, car ne possédant pas l'outil chrony, Windows utilise "w32tm". Depuis le CMD ou l'interface PowerShell, exécuter les commandes suivantes :
w32tm /query /status
La commande w32tm /query /status affiche différentes informations telles que :
- L'indicateur de dérive : permettant de savoir la présence ou l'absence de seconde intercalaire, dans mon cas cela correspond à "0", donc il n'y a aucun avertissement.
- Le niveau de strate : (ici dénommé "Couche"), indique la distance qui sépare d'une machine de la source de temps de référence.
- Le niveau de précision : du système en secondes. Dans mon cas -23, qui correspond à environ 119 nanosecondes.
- Le délai de racine : (donc la source de temps), entre cette dernière et la machine cliente. Dans mon cas cela correspond à 0.016 secondes.
- La dispersion racine : qui indique la variance totale accumulée sur les différentes machines jusqu'au niveau de stratum 1, en d'autres termes, l'écart possible maximum entre l'horloge de la machine cliente et celle du serveur de temps.
- L'ID de référence : correspond à l'identifiant de la source de temps, dans mon cas c'est l'adresse IP locale de mon serveur de temps, qui est en 172.16.2.5.
- L'heure de la dernière synchronisation : qui indique quand est-ce qu'a eu lieu la dernière synchronisation via la source de temps.
- La source de temps : qui indique quelle est la source de temps utilisée.
- L'intervalle d'interrogation : qui indique tous les combien de temps a lieu l'intervalle d'interrogation, dans mon cas c'est "10", donc l'intervalle a lieu toutes les 1024 secondes.
w32tm /query /source
La commande w32tm /query /source affiche uniquement l'adresse IP du serveur de temps source.
Conclusion
Voilà, maintenant vous avez appris ce qu'est la synchronisation horaire, sachant que cette dernière est essentielle pour assurer le bon fonctionnement d'un système d'informations. Grâce à ce tutoriel, vous avez également appris les bases pour mettre en place un serveur de temps NTP dans un contexte proche de celui d'une infrastructure professionnelle avec l'outil Chrony sous Linux, ainsi que sa configuration, tant le service lui-même que les clients, Windows comme Linux.
Cela permet d'avoir et de garantir des horloges à l'heure sur l'ensemble des équipements d'une infrastructure informatique, ce qui permet d'éviter des problèmes liés aux journaux d'évènements, aux authentifications, ou encore aux échanges réseaux.
Pour nous aider à nous améliorer, n'hésitez pas à faire part de vos avis en commentaires ou même à poser vos questions si vous avez besoin d'aide supplémentaire.
Vous pouvez également partager cet article et nous suivre sur Twitter/X :
ainsi que sur Instagram :


