NTP

NTP
NTP

NTP — Le Protocole Silencieux qui Gouverne vos Infrastructures

Guide complet à destination des administrateurs système — Home Lab & Entreprise

Avant-propos

Il existe des protocoles qu'on ne remarque que lorsqu'ils sont cassés. NTP en fait partie. Un décalage de quelques secondes suffit à rendre vos certificats TLS invalides, à désynchroniser vos logs, à faire échouer vos authentifications Kerberos ou à créer des trous noirs dans votre SIEM. Cet article couvre le protocole dans sa globalité, son histoire, son importance critique en entreprise, puis entre dans le détail des implémentations Windows et Linux.

1. Le Protocole NTP — Fondamentaux & Histoire

1.1 Genèse et évolution

NTP (Network Time Protocol) est l'un des plus anciens protocoles Internet encore en service. Il a été conçu par David L. Mills de l'Université du Delaware, dont la première publication remonte à 1985 (RFC 958). L'idée était simple : synchroniser les horloges des machines connectées à Internet avec une précision suffisante pour que les applications distribuées fonctionnent de manière cohérente.

L'évolution des versions reflète la montée en complexité des réseaux :

Version Année RFC Apports majeurs
NTPv1 1988 RFC 1059 Premier standard formel, synchronisation simple
NTPv2 1989 RFC 1119 Authentification basique, gestion des erreurs
NTPv3 1992 RFC 1305 Algorithmes d'estimation de délai améliorés, sécurité renforcée
NTPv4 2010 RFC 5905 IPv6, précision à la nanoseconde, autokey, meilleure tolérance aux pannes
SNTP - RFC 4330 Simplified NTP — clients légers, pas de correction d'erreur avancée

Parallèlement, PTP (Precision Time Protocol, IEEE 1588) est apparu pour les environnements nécessitant une précision sub-microseconde (finance haute fréquence, télécom, industrie). PTP n'est pas abordé en détail ici mais mérite d'être connu dans une architecture sysadmin avancée.

1.2 Modèle hiérarchique — La notion de Stratum

NTP fonctionne sur un modèle hiérarchique de strates (stratum) :

strates NTP (stratum)

Le principe de l'algorithme NTP repose sur plusieurs mécanismes combinés :

  • Round-Trip Delay : mesure de la latence aller-retour pour corriger le décalage de transit réseau
  • Clock Filter : sélection des meilleures mesures parmi un échantillon
  • Clock Select : algorithme de vote entre plusieurs sources pour éliminer les falsetickers
  • Clock Discipline : ajustement progressif (discipline) de l'horloge locale via adjtime()/adjtimex(), jamais de saut brutal (sauf step forcé)

Le port utilisé est UDP/123, et contrairement à TCP, NTP opère en mode stateless avec un simple échange de 4 timestamps par paquet.

1.3 Structure d'un paquet NTP

 0                   1                   2                   3
 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|LI | VN  |Mode |    Stratum    |     Poll      |  Precision    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                          Root Delay                           |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                       Root Dispersion                         |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                     Reference Identifier                      |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                   Reference Timestamp (64 bits)               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                   Originate Timestamp (64 bits)               |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                    Receive Timestamp (64 bits)                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|                   Transmit Timestamp (64 bits)                |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Les 4 timestamps permettent de calculer l'offset (décalage) et le delay (latence réseau).

2. NTP en Entreprise — Pourquoi c'est Critique

2.1 Les couches qui dépendent de la synchronisation temporelle

Un admin qui considère NTP comme un service secondaire n'a pas encore vécu une nuit blanche à cause de lui. Voici les dépendances directes en entreprise :

Authentification & Sécurité

  • Kerberos (Active Directory) refuse les tickets dont le décalage dépasse 5 minutes (clockskew). Une désynchronisation de 5 minutes et 1 seconde bloque toute authentification AD.
  • TLS/mTLS : les certificats ont des plages de validité notBefore/notAfter. Un hôte avec une horloge décalée verra des certificats valides comme expirés ou futurs.
  • TOTP/2FA (Google Authenticator, etc.) : les codes OTP sont calculés sur la fenêtre temporelle actuelle ±30s. Au-delà, l'authentification échoue.
  • JWT : les tokens ont des champs iat (issued at) et exp (expiration). Décalage = tokens rejetés.

Infrastructure distribuée

  • Bases de données distribuées (PostgreSQL avec réplication, MySQL Galera, Cassandra, etcd, CockroachDB) : l'ordonnancement des transactions repose sur des timestamps. Un décalage crée des conflits d'ordre et des corruptions potentielles.
  • Kubernetes : les certificats de l'API server, les leases de leader election (etcd) dépendent de l'horloge système.
  • File systems distribués (Ceph, HDFS, GlusterFS) : les opérations de verrouillage et les métadonnées utilisent des timestamps.

Conformité & Audit

  • PCI-DSS (Requirement 10.4), ISO 27001, SOX, NIS2 : tous exigent une synchronisation précise des horloges pour garantir l'intégrité des journaux d'audit.

2.2 NTP et la centralisation des logs — Le lien fondamental avec les SIEM

C'est probablement l'impact le plus sous-estimé par les équipes qui n'ont jamais eu à investiguer un incident de sécurité multi-hosts.

Le problème de la corrélation temporelle

Un SIEM (Splunk, Elastic SIEM, Microsoft Sentinel, QRadar, Wazuh...) ingère des événements depuis des dizaines ou centaines de sources :

[10:42:03.221] firewall-01    → DENY SSH 10.0.1.55 → 192.168.1.10
[10:42:07.891] auth-server-01 → FAILED LOGIN user=root src=10.0.1.55
[10:42:09.114] dc-01          → KERBEROS TGT REQUEST user=svc_backup
[10:42:11.002] web-app-01     → SQL ERROR query="' OR 1=1--" src=10.0.1.55

Si web-app-01 a 3 minutes de retard, cet événement apparaît à 10:39 dans Splunk, avant le refus du firewall. La chaîne d'attaque devient incompréhensible. Un analyste SOC passe 2 heures à tenter de reconstituer une timeline qui n'a aucun sens.

Syslog et le champ timestamp

Le protocole Syslog (RFC 3164, RFC 5424) inclut un timestamp généré par l'émetteur. Sans synchronisation NTP, deux hôtes qui s'échangent des messages à la même seconde réelle peuvent présenter des écarts de plusieurs minutes dans les logs collectés.

Les solutions de centralisation (rsyslog, syslog-ng, Fluentd, Logstash, Vector) permettent bien d'ajouter un timestamp de réception côté collecteur — mais cela ne remplace pas le timestamp d'origine pour la corrélation forensique.

Impact sur la détection

Les règles de corrélation SIEM fonctionnent sur des fenêtres temporelles :

RULE: si 5 échecs d'authentification sur le même user en moins de 60 secondes → ALERT

Si les sources sont désynchronisées de 90 secondes, cette règle ne se déclenche jamais. Vous êtes aveugle.

Recommandation architecture : déployez un ou deux serveurs NTP internes (Stratum 2) synchronisés sur des pools publics fiables ou sur une source GPS/PTP interne. Tous vos actifs (serveurs, switches, firewalls, appliances, hyperviseurs, containers via le nœud hôte) doivent pointer vers ces sources internes. Activez le monitoring NTP (offset, stratum, reachability) dans votre stack de supervision (Zabbix, Prometheus/Alertmanager, PRTG).

3. NTP sous Windows

3.1 Évolution historique sous Windows

Microsoft a intégré NTP progressivement, souvent de manière propriétaire et imparfaite :

Version Windows Service / Mécanisme NTP Notes
Windows NT 4.0 Pas de NTP natif Outils tiers requis
Windows 2000 W32Time (première version) Implémentation minimaliste, non conforme RFC 1305
Windows XP / 2003 W32Time amélioré, NTP client Toujours limité pour usage serveur
Windows Vista / 2008 W32Time avec NTPv4 partiel Amélioration de la précision
Windows 8 / 2012 W32Time amélioré Meilleure gestion des sources multiples
Windows 10 / 2016 W32Time avec précision ±1s garantie Suffisant pour la plupart des usages
Windows Server 2016+ Accurate Time (KB3177467) Précision sub-milliseconde possible
Windows 11 / 2022+ W32Time + support PTP en option Intégration Hyper-V améliorée

Point critique : jusqu'à Windows Server 2016, W32Time ne respectait pas pleinement la RFC NTP. Microsoft lui-même le reconnaissait dans la documentation. Pour des environnements nécessitant une précision <1ms (finance, trading, SCADA), W32Time seul ne suffit pas sur les anciennes versions.

3.2 Services côté serveur Windows

W32Time (Windows Time Service)

C'est le service natif, présent sur tous les systèmes Windows depuis Windows 2000. Il peut opérer en mode client, serveur NTP, ou les deux simultanément.

Configuration en tant que serveur NTP :

# Activer le mode serveur NTP
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer" `
    -Name "Enabled" -Value 1

# Configurer les paramètres du service
w32tm /config /manualpeerlist:"0.fr.pool.ntp.org,0x8 1.fr.pool.ntp.org,0x8 2.fr.pool.ntp.org,0x8" `
    /syncfromflags:manual /reliable:YES /update

# Redémarrer le service
Restart-Service w32tm
net stop w32tm && net start w32tm

Configuration via GPO (recommandé en entreprise)

Dans un domaine AD, la hiérarchie NTP est automatiquement gérée :

  • Le PDC Emulator du domaine racine se synchronise sur une source externe
  • Tous les autres DCs se synchronisent sur le PDC Emulator
  • Les membres du domaine se synchronisent sur leur DC le plus proche
GPO Path: Computer Configuration → Administrative Templates → System → Windows Time Service
→ Global Configuration Settings
→ Time Providers → Configure Windows NTP Client
→ Time Providers → Enable Windows NTP Server

Paramètres clés à configurer :

Paramètre GPO Valeur recommandée
NtpServer IP_PDC_Emulator,0x9 (type NTP)
Type NTP
MaxPosPhaseCorrection 54000 (15h max correction positive)
MaxNegPhaseCorrection 54000 (15h max correction négative)
SpecialPollInterval 3600 (poll toutes les heures)

Meinberg NTP (tiers, recommandé pour usage serveur strict)

Pour les environnements où la précision RFC-compliant est obligatoire (conformité stricte, SIEM forensique, finance), Meinberg NTP for Windows est la référence. C'est le portage officiel de la référence ntpd sur Windows.

  • Téléchargement : https://www.meinbergglobal.com/english/sw/ntp.htm
  • Service installé : Network Time Protocol Daemon
  • Fichier de configuration : C:\Program Files (x86)\NTP\etc\ntp.conf
  • Format identique au ntp.conf Linux/BSD
# ntp.conf Windows (Meinberg)
server 0.fr.pool.ntp.org iburst
server 1.fr.pool.ntp.org iburst
server 2.fr.pool.ntp.org iburst

driftfile "C:\Program Files (x86)\NTP\etc\ntp.drift"
logfile "C:\Program Files (x86)\NTP\etc\ntp.log"

restrict default kod nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict ::1
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap

3.3 Binaires et outils clients Windows

Outil Type Usage principal
w32tm CLI natif Configuration, diagnostic, requêtes NTP, resynchronisation
Get-Date PowerShell Lecture de l'heure système
net time Legacy CMD Ancienne commande de synchronisation (dépréciée)
NTP Analyzer GUI tiers Monitoring visuel des sources NTP
Meinberg NTP Service tiers Client/serveur RFC-compliant complet
ntpdate (WSL) WSL Requête ponctuelle via WSL2 si besoin

3.4 Diagnostic NTP sous Windows — CLI indispensables

Côté client

# ── État général du service W32Time ──────────────────────────────
w32tm /query /status
# Affiche : source actuelle, offset, stratum, poll interval, last sync

# ── Liste des sources NTP configurées et leur état ────────────────
w32tm /query /peers
# Affiche pour chaque peer : IP, stratum, when (dernière synchro),
# offset, delay, dispersion

# ── Configuration complète du service ─────────────────────────────
w32tm /query /configuration

# ── Tester la synchronisation vers un serveur spécifique ──────────
w32tm /stripchart /computer:time.windows.com /samples:5 /dataonly
# Affiche l'offset en temps réel sur N samples

# ── Resynchronisation forcée ──────────────────────────────────────
w32tm /resync /force
w32tm /resync /rediscover   # Force la redécouverte des peers

# ── Vérifier si le service tourne ─────────────────────────────────
Get-Service W32Time | Select-Object Status, StartType
sc query w32tm

# ── Diagnostiquer les erreurs de sync (Event Log) ─────────────────
Get-WinEvent -LogName System | Where-Object {$_.ProviderName -eq "Microsoft-Windows-Time-Service"} | Select-Object -First 20

# ── Vérifier l'offset courant en PowerShell ───────────────────────
w32tm /query /status | Select-String "RMS Offset|Source|Stratum"

# ── Test de connectivité UDP/123 ──────────────────────────────────
Test-NetConnection -ComputerName 1.fr.pool.ntp.org -Port 123
# Note : NTP utilise UDP, Test-NetConnection teste TCP/UDP selon -Port
# Pour UDP strict, utiliser : portqry -n 1.fr.pool.ntp.org -e 123 -p UDP

# ── Vérifier le pare-feu Windows ─────────────────────────────────
Get-NetFirewallRule | Where-Object {$_.DisplayName -like "*NTP*" -or $_.DisplayName -like "*Time*"}
netsh advfirewall firewall show rule name=all | Select-String -A5 "123"

Côté serveur

# ── Vérifier que W32Time est configuré comme serveur ──────────────
Get-ItemProperty "HKLM:\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer" | Select-Object Enabled

# ── Vérifier le type de synchronisation (NT5DS vs NTP) ────────────
w32tm /query /configuration | Select-String "Type|NtpServer"

# ── Tester que le serveur répond aux requêtes NTP entrantes ───────
w32tm /stripchart /computer:VOTRE_SERVEUR_NTP /samples:3

# ── Depuis un autre host : interroger le serveur NTP local ────────
w32tm /stripchart /computer:192.168.1.10 /samples:5 /dataonly

# ── Vérifier les logs W32Time ─────────────────────────────────────
Get-WinEvent -LogName System -MaxEvents 50 | Where-Object {$_.Id -in (29,37,38,47,50,155,156,157,158)}

# ── Sur le PDC Emulator : vérifier la source de référence ─────────
w32tm /query /source
# Doit retourner une IP externe ou "Local CMOS Clock" si problème

# ── Forcer la resynchronisation du PDC Emulator ───────────────────
w32tm /resync /force
net stop w32tm && net start w32tm

# ── Vérifier via NTP brut (PowerShell) ────────────────────────────
$ntpServer = "192.168.1.10"
$socket = New-Object Net.Sockets.Socket([Net.Sockets.AddressFamily]::InterNetwork, [Net.Sockets.SocketType]::Dgram, [Net.Sockets.ProtocolType]::Udp)
$socket.Connect($ntpServer, 123)
$ntpData = New-Object byte[] 48
$ntpData[0] = 0x1B  # NTP request
$socket.Send($ntpData) | Out-Null
$socket.Receive($ntpData) | Out-Null
$socket.Close()
$intPart = [BitConverter]::ToUInt32($ntpData[40..43], 0)
$fracPart = [BitConverter]::ToUInt32($ntpData[44..47], 0)
$ntpEpoch = [DateTime]::new(1900, 1, 1, 0, 0, 0, [DateTimeKind]::Utc)
$ntpTime = $ntpEpoch.AddSeconds([uint64]$intPart)
Write-Host "NTP server time: $ntpTime UTC"
Write-Host "Local time:      $((Get-Date).ToUniversalTime()) UTC"

# ── Activer le mode debug de W32Time temporairement ───────────────
w32tm /debug /enable /file:"C:\w32tm-debug.log" /size:10000000 /entries:0-300
# (désactiver après diagnostic)
w32tm /debug /disable

4. NTP sous Linux

4.1 Évolution historique sous Linux

L'écosystème NTP Linux a connu une transition plus radicale que Windows, avec un changement de daemon de référence :

Période Daemon Notes
1993–2000 xntpd Port Unix de l'implémentation de référence de D. Mills
2000–2017 ntpd (ntp.org) Référence universelle, RFC-compliant, très stable mais complexe à configurer
2004+ openntpd Alternative OpenBSD, minimaliste, sécurité renforcée
2012+ chrony Conçu pour les réseaux instables et les machines virtuelles
2014+ systemd-timesyncd Client SNTP léger intégré à systemd, insuffisant pour usage serveur
2017–aujourd'hui chrony (défaut) Remplace ntpd sur RHEL/CentOS/Fedora/Ubuntu 18.04+, Debian 10+

Pourquoi chrony a supplanté ntpd :

  • Convergence beaucoup plus rapide après démarrage ou perte de synchronisation
  • Gestion native des environnements virtualisés (horloge instable, migrations VM)
  • Algorithme de discipline plus précis sur les connexions intermittentes
  • Moindre consommation de ressources
  • Configuration plus simple

ntpd n'est pas mort : il reste utilisé pour les cas avancés (serveurs Stratum 1/2 avec référence GPS/PPS, environnements embarqués spécifiques, compatibilité legacy).

4.2 Services côté serveur Linux

chrony (chronyd)

Chrony est aujourd'hui le standard de facto sur les distributions majeures.

Packages :

# RHEL/CentOS/Rocky/AlmaLinux/Fedora
dnf install chrony

# Debian/Ubuntu
apt install chrony

# SUSE/openSUSE
zypper install chrony

Configuration serveur (/etc/chrony.conf ou /etc/chrony/chrony.conf) :

# ── Sources de référence ──────────────────────────────────────────
server 0.fr.pool.ntp.orgiburst
server 1.fr.pool.ntp.org iburst
server 2.fr.pool.ntp.org iburst
server 3.fr.pool.ntp.org iburst

# Pour usage interne (Stratum 2 pointant sur sources primaires)
server ntp1.example.com iburst prefer
server ntp2.example.com iburst

# ── Fichier de dérive ─────────────────────────────────────────────
driftfile /var/lib/chrony/drift

# ── Correction rapide si décalage > 1s au démarrage ──────────────
makestep 1.0 3

# ── Activer le suivi de l'horloge matérielle (RTC) ────────────────
rtcsync

# ── Source de référence locale (si pas de réseau) ─────────────────
local stratum 10

# ── Servir l'heure aux clients du réseau interne ─────────────────
# Autoriser le réseau 192.168.1.0/24 à se synchroniser
allow 192.168.1.0/24
allow 10.0.0.0/8

# ── Logging ───────────────────────────────────────────────────────
logdir /var/log/chrony
log measurements statistics tracking

# ── Sécurité : ne pas agir comme serveur pour les autres ─────────
# (pour un client pur, désactiver le bloc "allow" ci-dessus)

Gestion du service :

systemctl enable --now chronyd
systemctl status chronyd

ntpd (ntp / ntpsec)

Pour les environnements nécessitant une configuration avancée (référence GPS/PPS, Stratum 1, authentification symétrique entre peers).

ntpsec est le fork modernisé de ntpd, avec nettoyage du code, réduction de la surface d'attaque, et support des fonctionnalités modernes. C'est la version recommandée si vous avez besoin de ntpd.

# Debian/Ubuntu
apt install ntpsec

# RHEL (via EPEL)
dnf install ntpsec

Configuration serveur (/etc/ntp.conf) :

# ── Serveurs de référence ─────────────────────────────────────────
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

# ── Fichier de dérive ─────────────────────────────────────────────
driftfile /var/lib/ntp/ntp.drift

# ── Contrôle d'accès ──────────────────────────────────────────────
restrict default kod nomodify notrap nopeer noquery limited
restrict 127.0.0.1
restrict ::1
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap

# ── Serveur de référence locale (fallback) ────────────────────────
server 127.127.1.0
fudge  127.127.1.0 stratum 10

# ── Logging ───────────────────────────────────────────────────────
logfile /var/log/ntp.log

openntpd

Solution minimaliste issue d'OpenBSD, privilégiant la sécurité sur la précision absolue. Bonne option pour les environnements contraints ou les postes de travail.

apt install openntpd    # Debian/Ubuntu
# /etc/openntpd/ntpd.conf
servers 1.fr.pool.ntp.org
listen on *

systemd-timesyncd

Présent par défaut sur la majorité des distributions modernes. Client SNTP uniquement, non adapté à un usage serveur.

# /etc/systemd/timesyncd.conf
[Time]
NTP=192.168.1.10 192.168.1.11
FallbackNTP=0.fr.pool.ntp.org 1.fr.pool.ntp.org
RootDistanceMaxSec=5
PollIntervalMinSec=32
PollIntervalMaxSec=2048
systemctl enable --now systemd-timesyncd
timedatectl set-ntp true

Règle de base : sur un serveur de production, remplacez systemd-timesyncd par chrony. Sur un poste de travail ou un container léger, systemd-timesyncd est suffisant.

4.3 Binaires et outils clients Linux

Outil Daemon associé Usage
chronyc chronyd Interface CLI complète pour chrony
ntpq ntpd/ntpsec Requêtes et diagnostics ntpd
ntpstat ntpd/ntpsec Résumé rapide de l'état de synchronisation
ntpdate Standalone (déprécié) Synchronisation ponctuelle (remplacé par chronyc makestep)
timedatectl systemd Interface systemd pour la gestion du temps et de timesyncd
sntp ntpsec Client SNTP simple pour requêtes ponctuelles
tcpdump/wireshark - Analyse des paquets NTP (port UDP/123)
ntptrace ntpd Tracé de la hiérarchie NTP depuis un client

4.4 Diagnostic NTP sous Linux — CLI indispensables

Côté client

# ── chrony : état général ─────────────────────────────────────────
chronyc tracking
# Affiche : source de référence, stratum, offset system, RMS offset,
# frequency, residual freq, skew, root delay, root dispersion

# ── chrony : liste des sources et leur qualité ────────────────────
chronyc sources -v
# Colonnes clés :
#   S : état (* = sélectionné, + = combiné, - = écarté, ? = injoignable)
#   Last Rx : délai depuis le dernier paquet reçu
#   Offset : décalage mesuré

chronyc sourcestats -v
# Statistiques sur la dérive de chaque source

# ── chrony : activité et ajustements récents ─────────────────────
chronyc activity
chronyc ntpdata       # Détails NTP bruts de toutes les sources

# ── chrony : forcer une synchronisation manuelle ─────────────────
chronyc makestep      # Correction instantanée (saut d'horloge)
chronyc burst 4/4     # Envoyer N requêtes pour collecter des données rapidement

# ── systemd-timesyncd : état ──────────────────────────────────────
timedatectl show-timesync --all
timedatectl timesync-status
timedatectl status

# ── ntpd/ntpsec : état des peers ──────────────────────────────────
ntpq -p
# Colonnes : remote, refid, st (stratum), when, poll, reach, delay, offset, jitter
# Légende : * = peer sélectionné, + = inclus, - = écarté, x = falseticker

ntpq -c peers -c sysinfo     # Infos système ntpd
ntpstat                       # Résumé rapide : synchronized / unsynchronised

# ── Test de requête NTP vers un serveur spécifique ────────────────
# Avec ntpdate (si installé)
ntpdate -q 1.fr.pool.ntp.org       # Query sans appliquer la correction

# Avec chrony
chronyc -a "server 192.168.1.10"

# Avec sntp (ntpsec-utils)
sntp 1.fr.pool.ntp.org

# ── Test de connectivité UDP/123 ──────────────────────────────────
# Requête NTP brute avec nmap
nmap -sU -p 123 --script ntp-info 1.fr.pool.ntp.org

# Via nc (peut varier selon version)
echo "" | nc -u -w1 1.fr.pool.ntp.org 123 && echo "UDP/123 reachable"

# Via tcpdump (vérifier échanges NTP)
tcpdump -i eth0 -n port 123 -v

# ── Vérifier le timezone et la config globale ─────────────────────
timedatectl
date -u          # Heure UTC actuelle
hwclock --show   # Heure de l'horloge matérielle (RTC)

# ── Journaux ─────────────────────────────────────────────────────
journalctl -u chronyd -f --since "1 hour ago"
journalctl -u systemd-timesyncd -f
grep -i ntp /var/log/syslog | tail -50

Côté serveur

# ── Vérifier que chronyd est bien en mode serveur ─────────────────
chronyc -a "help"   # Lister les commandes disponibles
chronyc serverstats
# Affiche : nombre de requêtes reçues, réponses envoyées, clients

# ── Liste des clients actifs (qui se synchronisent sur ce serveur) ─
chronyc clients
# Nécessite "clientloglimit" ou "log clients" dans chrony.conf

# Activer le log clients si pas déjà fait :
# Dans /etc/chrony.conf : ajouter "clientloglimit 10000000"
# puis : chronyc reload sources

# ── Vérifier la configuration chargée ─────────────────────────────
chronyc -a "dump"   # Dump l'état interne
grep -v "^#" /etc/chrony.conf | grep -v "^$"   # Config sans commentaires

# ── Vérifier que le port UDP/123 est ouvert et en écoute ──────────
ss -ulnp | grep 123
netstat -ulnp | grep 123

# ── Vérifier les règles firewall ──────────────────────────────────
# iptables
iptables -L INPUT -n -v | grep 123

# firewalld
firewall-cmd --list-services | grep -i ntp
firewall-cmd --add-service=ntp --permanent   # Si pas déjà présent
firewall-cmd --reload

# nftables
nft list ruleset | grep 123

# ── Pour ntpd : vérifier les ACL (restrict) ───────────────────────
ntpq -c reslist

# ── Monitoring continu : offset en temps réel ─────────────────────
watch -n 2 'chronyc tracking && chronyc sources'

# ── Vérifier le fichier de dérive (drift) ─────────────────────────
cat /var/lib/chrony/drift
# Une valeur >500 ppm indique une horloge matérielle dégradée ou une VM instable

# ── Test depuis un client externe ─────────────────────────────────
# Depuis un autre hôte Linux, vérifier que ce serveur répond :
chronyc -h 192.168.1.10 tracking
sntp -K /dev/null 192.168.1.10
ntpdate -q 192.168.1.10

# ── Analyse des performances longue durée ─────────────────────────
# Avec gnuplot si log stats activé dans chrony.conf
# Le fichier /var/log/chrony/statistics.log contient l'historique complet
ls -la /var/log/chrony/
tail -20 /var/log/chrony/measurements.log

5. Conclusion — NTP à l'Ère de l'IA et de l'Observabilité

NTP est un protocole quasi-invisible quand il fonctionne, et catastrophique quand il ne fonctionne pas. Après 40 ans d'existence, il reste l'épine dorsale temporelle de toute infrastructure digne de ce nom.

Ce qui change avec l'IA et les outils modernes

Observabilité intelligente du NTP

Les stacks d'observabilité modernes commencent à traiter NTP comme un signal de première classe. Des exporters Prometheus (prometheus-ntp-exporter, chrony_exporter) permettent de tracker offset, stratum, dispersion et reachability dans Grafana. Des alertes AIOps (Dynatrace, Datadog, New Relic) peuvent désormais corréler automatiquement une dégradation de la qualité des logs avec une dérive NTP détectée sur les agents — sans intervention humaine.

SIEM de nouvelle génération

Les SIEM modernes (Microsoft Sentinel, Elastic Security, Exabeam) intègrent des moteurs de Machine Learning capables de détecter des anomalies temporelles dans les flux de logs — un comportement qui était invisible sans synchronisation parfaite devient détectable même avec un léger décalage, car l'IA modélise la variance temporelle attendue par type d'équipement. Cela ne remplace pas une bonne synchronisation NTP, mais compense en partie les insuffisances.

Sécurité de NTP elle-même

Les attaques sur NTP (NTP amplification DDoS, time poisoning) ont conduit à des évolutions importantes : NTPv4 avec NTS (Network Time Security, RFC 8915) apporte enfin une authentification cryptographique robuste basée sur TLS 1.3, sans la complexité de l'ancien Autokey. Chrony supporte NTS depuis la version 4.0. C'est l'avenir pour les serveurs NTP exposés ou les infrastructures sensibles.

Virtualisation, containers et time

Dans un environnement Kubernetes/conteneurs, la synchronisation NTP est gérée au niveau du nœud hôte. Les containers héritent de l'horloge de l'hôte — mais des outils comme tsc clocksource peuvent causer des dérives dans certaines configurations de virtualisation imbriquée. Les hyperviseurs modernes (VMware vSphere 8, Hyper-V 2022, KVM avec ptp_kvm) proposent des mécanismes de synchronisation para-virtualisée (VMware Tools time sync, ptp_kvm + phc2sys + ptp4l) qui peuvent se combiner avec chrony pour atteindre des précisions sub-milliseconde en VM — sujet qui mérite son propre article.

La recommandation finale

Traitez NTP comme une infrastructure de sécurité, pas comme un service de commodité. Déployez des serveurs internes dédiés, supervisez-les activement, intégrez les métriques NTP dans votre observabilité, et planifiez la migration vers NTS pour vos serveurs publics. Votre équipe SOC vous en remerciera.