Offre Durée limitée : -10% sur tout le site* avec le code WELCOME10

Configurer la synchronisation NTP sur un VPS Linux avec chrony

Mis à jour le 3 novembre 2026 14 min de lecture 12 sections

L'horloge d'un VPS Linux ou d'un serveur dédié n'est pas un simple affichage : c'est une brique dont dépendent les journaux système, la validation des certificats TLS, les tâches planifiées par cron, la résolution DNS, la réplication des bases de données et la synchronisation des serveurs de jeu. Sur une machine virtuelle, l'horloge matérielle est elle-même virtualisée. Sans synchronisation NTP, elle peut dériver de plusieurs secondes par jour. Quelques secondes suffisent pour que les horodatages Unix des logs deviennent incohérents, qu'un certificat Let's Encrypt soit refusé par un client, ou qu'un job cron se décale silencieusement.

chrony est l'implémentation NTP de référence sur les distributions Linux modernes (Ubuntu 25.10+ et RHEL/CentOS l'installent par défaut). Plus rapide à converger que l'ancien ntpd et plus complet que systemd-timesyncd, il est conçu pour les environnements de virtualisation (KVM, VMware, Proxmox) où l'horloge peut sauter après une migration à chaud ou un redémarrage de l'hyperviseur. Ce guide couvre l'installation sur Ubuntu et Debian, la configuration du serveur avec les pools NTP français (fr.pool.ntp.org), les règles de firewall nécessaires, la vérification de la précision avec chronyc tracking et la mise en place d'une surveillance pour détecter les écarts avant qu'ils ne provoquent un incident.

Pourquoi la synchronisation NTP est critique sur un serveur

Le protocole NTP (Network Time Protocol) permet à un serveur de synchroniser son horloge système avec des serveurs de temps de référence, des horloges atomiques ou GPS accessibles par Internet. Sans NTP, un VPS Linux ou un serveur dédié accumule une dérive (drift) qui produit des effets concrets sur l'ensemble de la configuration du serveur :

  • Logs incohérents : les horodatages des journaux système (journalctl, syslog, logs applicatifs) ne correspondent plus aux événements réels. Corréler les logs de plusieurs serveurs d'un cluster devient impossible pour l'administrateur.
  • Certificats TLS refusés : un navigateur ou un client API vérifie que la date du serveur est dans la fenêtre de validité du certificat. Un décalage de quelques minutes provoque des erreurs NET::ERR_CERT_DATE_INVALID, même avec un certificat Let's Encrypt valide.
  • Tâches cron décalées : les jobs cron et timers systemd s'exécutent selon l'horloge du système. Une dérive accumule un décalage progressif sur les sauvegardes automatiques (backup), les rotations de logs et les scripts de maintenance.
  • Serveurs de jeu désynchronisés : FiveM, Minecraft ou Rust s'appuient sur l'horodatage pour la synchronisation réseau entre le serveur et les clients. Un écart d'horloge provoque des saccades, des téléportations ou des erreurs d'authentification.
  • Authentification en échec : les protocoles basés sur des tokens temporels (TOTP, Kerberos, OAuth) rejettent les requêtes si l'horloge du serveur dépasse la fenêtre de tolérance.
  • Résolution DNS et DNSSEC : les signatures DNSSEC contiennent des horodatages de validité. Un serveur dont l'horloge dérive peut échouer à valider des réponses DNS signées, ce qui casse la résolution DNS pour les domaines protégés par DNSSEC.
  • Réplication des bases de données : MySQL, MariaDB et PostgreSQL utilisent les horodatages dans les binary logs et les journaux de transactions. Un écart entre un serveur principal et ses réplicas provoque des conflits de réplication ou des données incohérentes.
  • Serveur web et reverse proxy : Apache et Nginx écrivent des timestamps dans les logs d'accès. Un reverse proxy Nginx dont l'horloge ne correspond pas à celle du backend rend le debug des latences impossible.
  • Sauvegardes incrémentales : des outils comme rsync comparent les horodatages des fichiers pour déterminer ce qui a changé. Une horloge décalée provoque des sauvegardes complètes au lieu d'incrémentales, ou pire, des fichiers modifiés ignorés.
  • Serveur SMTP : les en-têtes d'email contiennent un horodatage (Date:). Un serveur Postfix dont l'horloge dérive voit ses messages marqués comme suspects par les filtres anti-spam, ce qui dégrade la délivrabilité.

chrony, systemd-timesyncd, ntpd : lequel choisir

Trois implémentations NTP coexistent sur les distributions Linux. Le tableau suivant résume leurs différences pour un administrateur de VPS ou de serveur dédié :

Critère chrony systemd-timesyncd ntpd (ntp)
Convergence initiale Quelques secondes Quelques minutes Plusieurs minutes
Mode serveur NTP Oui (utile pour un réseau local) Non (client pur) Oui
Détection de sources défaillantes Oui (surveillance de plusieurs serveurs simultanés) Non Oui
Adapté aux VM / VPS Oui (gère les sauts d'horloge) Basique Sensible aux sauts
Support NTS (authentification TLS) Oui (natif depuis la version 4.0) Non Non
Empreinte mémoire (RAM) ~5 Mo ~1 Mo ~10 Mo
Paquet par défaut Ubuntu 25.10+, RHEL/CentOS Ubuntu 24.04 et antérieures Ancien standard

systemd-timesyncd est un client minimal qui ne surveille qu'un seul serveur à la fois : il ne détecte pas une source NTP défaillante qui renvoie une heure erronée. ntpd est l'implémentation historique des systèmes Unix, mais sa convergence lente et sa sensibilité aux sauts d'horloge le rendent inadapté à la virtualisation sur VPS et serveurs dédiés. chrony cumule la rapidité de convergence, la détection de sources défaillantes, une faible consommation de RAM et la tolérance aux environnements virtualisés (KVM, VMware, Proxmox).

Prérequis

Avant de commencer la configuration du serveur, vérifiez que vous disposez de :

  • Un VPS Linux ou un serveur dédié sous Ubuntu 22.04+, Ubuntu 24.04 LTS ou Debian 12 ;
  • Un accès SSH avec les droits root ou un utilisateur dans le groupe sudo ;
  • Une connectivité réseau sortante sur le port UDP 123 (NTP) depuis votre hébergeur ;
  • Le firewall du VPS (UFW ou nftables) configuré pour autoriser le trafic NTP sortant.

Installer chrony sur Ubuntu et Debian

Sur Ubuntu 24.04 LTS et Debian 12, systemd-timesyncd est le client NTP par défaut. Installer chrony le remplace automatiquement. Lancez la commande suivante en tant que root ou avec sudo :

sudo apt update
sudo apt install -y chrony

Vérifiez que le service est actif avec la commande suivante :

sudo systemctl status chrony

La sortie doit afficher active (running). Si systemd-timesyncd était actif, il est automatiquement désactivé lors de l'installation de chrony pour éviter un conflit entre les deux démons de synchronisation.

Pour confirmer que chrony est bien le client NTP utilisé par le système :

timedatectl status

La ligne NTP service: active confirme que la synchronisation NTP fonctionne. La ligne System clock synchronized: yes indique que l'horloge est déjà ajustée.

Sur les plateformes de virtualisation comme KVM ou VMware, l'hyperviseur peut injecter son propre temps via les guest additions. chrony gère ces sauts d'horloge sans intervention de l'admin. Si votre hébergeur met à disposition un panneau comme Plesk, l'heure affichée dans le tableau de bord reflète celle du système : une fois chrony configuré, elle sera exacte automatiquement.

Configurer les pools NTP français

Par défaut, chrony sur Ubuntu utilise les pools ntp.ubuntu.com. Pour un VPS hébergé en France, pointer vers les serveurs NTP français réduit la latence des requêtes et améliore la précision de synchronisation. Les noms de domaine fr.pool.ntp.org résolvent vers des adresses IP de serveurs NTP géographiquement proches, maintenus par des volontaires du projet pool.ntp.org.

Le fichier de configuration principal est /etc/chrony/chrony.conf. Ouvrez-le avec la commande suivante :

sudo nano /etc/chrony/chrony.conf

Remplacez les lignes pool ou server existantes par les pools NTP français :

pool 0.fr.pool.ntp.org iburst
pool 1.fr.pool.ntp.org iburst
pool 2.fr.pool.ntp.org iburst
pool 3.fr.pool.ntp.org iburst

L'option iburst accélère la synchronisation initiale en envoyant plusieurs requêtes rapprochées au démarrage du service, au lieu d'attendre l'intervalle d'interrogation normal.

Les autres directives essentielles de la config, déjà présentes dans les configurations par défaut :

  • driftfile /var/lib/chrony/chrony.drift : stocke la dérive estimée de l'horloge pour accélérer la resynchronisation au redémarrage ;
  • makestep 1 3 : autorise un ajustement brutal de l'horloge (step) si l'écart dépasse 1 seconde, mais seulement lors des 3 premières mises à jour après le démarrage. Après cela, chrony n'ajuste l'horloge que progressivement (slew) pour éviter de casser les applications ;
  • rtcsync : synchronise l'horloge matérielle (RTC) avec l'horloge système toutes les 11 minutes.

Appliquez la configuration en redémarrant le service :

sudo systemctl restart chrony

Configurer le firewall pour le trafic NTP

chrony a besoin d'envoyer et de recevoir des paquets sur des ports réseau spécifiques. Si le firewall du serveur bloque ces ports, la synchronisation échouera silencieusement. Voici les ports à ouvrir :

  • UDP 123 (sortant) : port standard du protocole NTP, utilisé pour toutes les requêtes de synchronisation ;
  • TCP 4460 (sortant) : port de négociation NTS (Network Time Security), nécessaire uniquement si vous activez l'authentification TLS des échanges NTP.

Avec UFW (le firewall par défaut sur Ubuntu), autorisez le trafic NTP sortant :

sudo ufw allow out 123/udp
sudo ufw allow out 4460/tcp

Si vous utilisez nftables comme pare-feu, ajoutez les règles équivalentes dans votre configuration. Pour vérifier que les ports sont bien ouverts et que chrony communique avec les serveurs NTP, listez les ports en écoute avec ss :

sudo ss -ulnp | grep chronyd

La sortie doit montrer chronyd en écoute sur le port UDP 123. Si aucune source NTP ne répond après quelques minutes, vérifiez que votre hébergeur ou le routeur en amont ne bloque pas le trafic UDP 123 sortant.

Vérifier la synchronisation avec chronyc

chronyc est l'outil en ligne de commande pour interroger le démon chrony. Les deux commandes essentielles pour l'admin :

Sources NTP actives

chronyc sources -v

Cette commande affiche la liste des serveurs NTP interrogés par chrony, avec leur adresse IP et leur état. Chaque ligne indique :

  • ^* : la source actuellement sélectionnée comme référence principale ;
  • ^+ : une source utilisable comme alternative ;
  • ^- : une source valide mais exclue (trop éloignée de la majorité) ;
  • ^? : une source dont la fiabilité n'a pas encore été établie.

La colonne Stratum indique le nombre de sauts entre le serveur NTP et une horloge de référence (stratum 1 = directement connecté à une horloge atomique ou GPS). La colonne Poll donne l'intervalle d'interrogation en secondes (puissance de 2).

Précision de l'horloge locale

chronyc tracking

Cette commande affiche l'état de synchronisation du système. Les valeurs clés :

  • System time : l'écart entre l'horloge système et la source NTP sélectionnée. Sur un VPS bien synchronisé, cette valeur est de l'ordre de quelques millisecondes ou microsecondes ;
  • Last offset : le dernier ajustement effectué ;
  • RMS offset : la moyenne quadratique des décalages récents, indicateur de la stabilité globale ;
  • Frequency : la dérive mesurée de l'oscillateur en ppm (parts per million). Une valeur stable indique que chrony a bien estimé la dérive de l'horloge du VPS ;
  • Stratum : le stratum de votre serveur (stratum du serveur source + 1).

Utiliser chrony comme serveur NTP sur un réseau local

Si vous administrez un cluster de serveurs (VPS ou serveurs dédiés) dans le même datacenter, vous pouvez configurer un seul serveur comme serveur NTP de référence pour tout le réseau local. Les autres machines synchronisent leur horloge sur ce serveur interne au lieu de multiplier les requêtes vers les pools publics. Cette configuration réduit la bande passante NTP sortante et garantit une cohérence d'horloge entre tous les serveurs du cluster.

Sur le serveur NTP principal, ajoutez la directive allow dans /etc/chrony/chrony.conf pour autoriser les requêtes depuis le sous-réseau local :

# Autoriser les clients du réseau local à se synchroniser
allow 10.0.0.0/24

Remplacez 10.0.0.0/24 par le sous-réseau de votre infrastructure. Redémarrez chrony pour appliquer la configuration. Sur les autres serveurs du cluster, pointez vers l'adresse IP du serveur NTP interne :

server 10.0.0.1 iburst

Ce serveur NTP interne agit comme un proxy de temps : il se synchronise sur les pools publics et redistribue l'heure aux machines du réseau local. Les serveurs clients n'ont pas besoin d'un accès direct aux pools NTP externes via le routeur.

Surveiller la dérive pour éviter les incidents silencieux

Une horloge qui dérive lentement ne produit pas d'erreur visible immédiatement. Le problème ne se manifeste qu'au moment où un certificat est refusé, un log est incohérent ou une sauvegarde échoue. Deux approches pour détecter ces écarts avant qu'ils ne provoquent un incident :

Script de vérification ponctuel (Bash)

Ce script Bash vérifie que l'écart d'horloge reste inférieur à 100 millisecondes et que chrony est bien synchronisé :

#!/bin/bash
OFFSET=$(chronyc tracking | awk '/System time/{print $4}')
SYNC=$(chronyc tracking | awk '/Leap status/{print $4}')
if [ "$SYNC" != "Normal" ]; then
    echo "ALERTE : chrony non synchronise (Leap status: $SYNC)"
    exit 1
fi
# Comparer l'offset a 0.1 seconde
if awk "BEGIN{exit !($OFFSET > 0.1)}" ; then
    echo "ALERTE : derive NTP de ${OFFSET}s (seuil: 0.1s)"
    exit 1
fi
echo "OK : derive NTP ${OFFSET}s, synchronisation normale"

Planifiez ce script toutes les heures avec un timer systemd ou un job cron pour recevoir une alerte en cas de dérive.

Alternative en Python

Si vos scripts de monitoring sont en Python, la commande suivante interroge chrony et retourne l'offset en une ligne :

python3 -c "
import subprocess, re, sys
out = subprocess.check_output(['chronyc', 'tracking']).decode()
m = re.search(r'System time\s+:\s+([\d.]+)', out)
offset = float(m.group(1)) if m else None
if offset is None or offset > 0.1:
    print(f'ALERTE: derive NTP {offset}s'); sys.exit(1)
print(f'OK: derive NTP {offset}s')
"

Monitoring continu

Pour un suivi graphique de la dérive NTP, les exporteurs Prometheus comme node_exporter exposent les métriques node_timex_offset_seconds et node_timex_estimated_error_seconds. Un tableau de bord Grafana sur votre VPS permet de visualiser l'évolution de l'offset et de déclencher des alertes automatiques quand la dérive dépasse un seuil. Si votre hébergeur met à disposition un panneau Plesk, vérifiez également que l'heure affichée dans l'interface d'administration correspond à l'heure réelle.

Dépannage courant

Symptôme Cause probable Commande de diagnostic / correction
Toutes les sources en ^? Le port UDP 123 est bloqué par le firewall ou le routeur en amont sudo ufw allow out 123/udp
System clock synchronized: no chrony n'a pas encore convergé ou le service n'est pas démarré sudo systemctl restart chrony && sleep 10 && chronyc tracking
Offset de plusieurs secondes après un reboot L'horloge RTC de la machine virtuelle a divergé pendant l'arrêt La directive makestep 1 3 corrige automatiquement les 3 premiers écarts
Leap status: Not synchronised Aucune source NTP n'a pu être contactée (DNS, réseau) chronyc sources pour identifier les sources inaccessibles, vérifier la connectivité
Conflit avec systemd-timesyncd Les deux services tournent simultanément sudo systemctl disable --now systemd-timesyncd
Dérive anormale sur VMware ou KVM L'hyperviseur injecte un temps incorrect via les guest tools Désactiver la synchronisation de l'hyperviseur : vmware-toolbox-cmd timesync disable ou ajuster kvm-clock
Les noms de domaine des pools ne résolvent pas Le résolveur DNS du serveur est en panne ou mal configuré dig 0.fr.pool.ntp.org pour tester la résolution, vérifier /etc/resolv.conf

Pour forcer une resynchronisation immédiate (utile après une restauration de snapshot ou une migration de VM) :

sudo chronyc makestep

Cette commande force un ajustement brutal de l'horloge, indépendamment de la directive makestep du fichier de config. À n'utiliser qu'en cas de décalage important constaté, pas en routine.

Sécuriser la synchronisation NTP

Le protocole NTP classique (port UDP 123) n'authentifie pas les réponses. Un attaquant en position de man-in-the-middle peut injecter des réponses NTP falsifiées pour décaler l'horloge d'un serveur. Les conséquences vont de la création d'un créneau d'acceptation d'un certificat révoqué à la désynchronisation de logs pour masquer une intrusion.

chrony supporte NTS (Network Time Security), une extension du protocole NTP qui authentifie les échanges via TLS (port TCP 4460 pour la négociation de clés, puis port UDP 123 pour les paquets NTP authentifiés). NTS est supporté nativement par chrony depuis la version 4.0 et activé par défaut sur Ubuntu 26.04. Pour activer NTS manuellement avec des serveurs qui le supportent, remplacez les directives pool par des directives server avec l'option nts dans votre fichier de config :

server time.cloudflare.com iburst nts
server nts.netnod.se iburst nts

Après redémarrage du service, vérifiez l'état de l'authentification NTS avec la commande suivante :

sudo chronyc -N authdata

La colonne Mode doit afficher NTS pour les serveurs configurés avec cette option. NTS est un renforcement recommandé, surtout si le VPS ou le serveur dédié gère des services sensibles comme des certificats TLS, des bases de données ou des données d'authentification. Pour renforcer la sécurité globale de votre serveur, consultez notre guide sécuriser SSH sur VPS Linux.

Conclusion

chrony transforme la synchronisation NTP d'une configuration qu'on oublie après l'installation en un élément surveillé de l'infrastructure. La séquence tient en quatre étapes : installer le paquet, pointer vers les pools français, ouvrir les ports du firewall et vérifier avec chronyc tracking. Sur un VPS ou un serveur dédié qui héberge des serveurs de jeu, un serveur web, des bases de données MySQL ou des sauvegardes planifiées, une horloge fiable est un prérequis silencieux dont l'absence ne se remarque qu'au moment où elle casse quelque chose. Pour optimiser les performances globales de votre VPS Linux au-delà de la synchronisation NTP, consultez notre guide dédié. Et pour maintenir votre serveur à jour sur les correctifs de sécurité, voyez comment automatiser les mises à jour de sécurité sur Ubuntu.

FAQ

Quelle est la différence entre chrony et systemd-timesyncd ?

systemd-timesyncd est un client NTP minimal qui ne surveille qu'un seul serveur à la fois et ne détecte pas les sources défaillantes. chrony surveille plusieurs serveurs simultanément, converge plus rapidement, supporte le mode serveur NTP et gère les sauts d'horloge fréquents sur les machines virtuelles. Pour un VPS en production, chrony est le choix recommandé.

Pourquoi utiliser les pools NTP français plutôt que les pools par défaut ?

Les pools fr.pool.ntp.org regroupent des serveurs NTP géographiquement proches de votre VPS hébergé en France. La latence réduite entre le VPS et les serveurs de temps améliore la précision de la synchronisation. Les pools par défaut (ntp.ubuntu.com ou pool.ntp.org) peuvent diriger les requêtes vers des serveurs plus éloignés.

Comment vérifier que mon VPS est bien synchronisé ?

Exécutez chronyc tracking en SSH. La ligne System time indique l'écart entre l'horloge du VPS et la source NTP de référence. Sur un VPS bien configuré, cette valeur est de l'ordre de quelques millisecondes. La commande chronyc sources affiche la liste des serveurs NTP contactés et leur état.

chrony peut-il fonctionner en même temps que systemd-timesyncd ?

Non. Deux démons de synchronisation NTP en parallèle créent un conflit. Sur Ubuntu et Debian, l'installation du paquet chrony désactive automatiquement systemd-timesyncd. Si ce n'est pas le cas, désactivez-le manuellement avec sudo systemctl disable --now systemd-timesyncd.

Qu'est-ce que NTS et faut-il l'activer ?

NTS (Network Time Security) est une extension du protocole NTP qui authentifie les réponses des serveurs de temps via TLS. Elle protège contre les attaques man-in-the-middle qui pourraient falsifier l'heure reçue par le VPS. chrony supporte NTS nativement depuis la version 4.0. L'activation est recommandée pour les serveurs qui gèrent des certificats TLS ou des données d'authentification sensibles. Ubuntu 26.04 active NTS par défaut.

Une dérive d'horloge peut-elle affecter un serveur de jeu FiveM ou Minecraft ?

Oui. Les serveurs de jeu utilisent l'horodatage système pour la synchronisation réseau entre le serveur et les clients. Un décalage d'horloge provoque des incohérences de timing qui se traduisent par des saccades, des téléportations de joueurs ou des erreurs d'authentification sur les services connectés au serveur de jeu.

Quels ports du firewall faut-il ouvrir pour NTP ?

Le protocole NTP utilise le port UDP 123 en sortie. Si vous activez NTS (Network Time Security), le port TCP 4460 doit également être ouvert en sortie pour la négociation des clés TLS. Si chrony sert de serveur NTP pour un réseau local, le port UDP 123 doit aussi être ouvert en entrée pour les clients du cluster.

chrony fonctionne-t-il sur un serveur dédié ou uniquement sur un VPS ?

chrony fonctionne sur toute machine Linux, VPS ou serveur dédié. Sur un serveur dédié, l'horloge matérielle (RTC) est physique et dérive moins qu'une horloge virtualisée, mais la synchronisation NTP reste indispensable pour les logs, les certificats TLS et les bases de données. L'empreinte mémoire de chrony (environ 5 Mo de RAM) est négligeable sur un serveur dédié.

Comment configurer chrony comme serveur NTP pour un réseau local ?

Ajoutez la directive allow suivie du sous-réseau (par exemple allow 10.0.0.0/24) dans /etc/chrony/chrony.conf et redémarrez le service. Les autres serveurs du cluster pointent alors vers l'adresse IP de ce serveur NTP interne au lieu d'interroger les pools publics. Cette configuration garantit la cohérence d'horloge entre tous les serveurs du réseau local.

La dérive NTP peut-elle affecter les sauvegardes et la réplication MySQL ?

Oui. Les sauvegardes incrémentales (rsync, tar) comparent les horodatages des fichiers : une horloge décalée provoque des sauvegardes complètes inutiles ou des fichiers modifiés ignorés. Pour MySQL et MariaDB, la réplication utilise les timestamps des binary logs. Un écart entre le serveur principal et les réplicas peut provoquer des conflits de données ou casser la réplication.