Chapitre 05
Temps & NTP (chrony)
Objectifs du chapitre
- Comprendre pourquoi l'heure juste est un enjeu OT, et le rÎle de stratum dans une hiérarchie NTP.
- Lire l'état d'un client :
chronyc tracking,sources,sourcestats. - Configurer l'edge en serveur NTP pour la cellule et vérifier ses
clients (
chronyc clients). - Diagnostiquer un client â S7-1500, switch â qui ne se synchronise pas, et
maĂźtriser le saut d'horloge (
makestep).
1. Pourquoi le temps compte en OT
Une heure fausse ne fait pas planter une machine ; elle rend le diagnostic impossible. Si l'edge est Ă 08:03 et le CPU S7-1500 Ă 08:05, corrĂ©ler un dĂ©faut automate avec un Ă©vĂ©nement dans le journal de l'edge (chapitre 4) devient un casse-tĂȘte : les mĂȘmes faits portent des heures diffĂ©rentes. Pire, certains protocoles et certificats en dĂ©pendent :
- Horodatage des alarmes et des donnĂ©es : une remontĂ©e OPC-UA ou un log d'historian n'a de valeur que si tous les acteurs partagent la mĂȘme heure.
- Certificats TLS/OPC-UA : une horloge trop dĂ©calĂ©e fait Ă©chouer la validation d'un certificat (pĂ©riode de validitĂ© « pas encore commencĂ©e » ou « expirĂ©e ») â panne dĂ©routante qui n'a rien de rĂ©seau.
- Analyse d'incident : sans horloge commune, impossible d'établir la chronologie d'une panne à travers edge, automate et switch.
Sur beaucoup de cellules, l'edge joue le rĂŽle de rĂ©fĂ©rence de temps locale : il se synchronise vers le haut (NTP de l'usine, ou sa propre horloge Ă dĂ©faut) et sert l'heure vers le bas Ă l'automate et aux switches. Bien rĂ©gler chrony sur l'edge, c'est mettre toute la cellule Ă la mĂȘme montre.
2. Stratum : la hiérarchie NTP en un mot
NTP organise les sources de temps en strates (stratum). Le stratum 0 est une horloge de référence (GPS, atomique) ; le stratum 1 est un serveur directement branché dessus ; chaque niveau qui s'en éloigne incrémente le numéro. Plus le stratum est bas, plus la source est « proche » de la référence. Notre edge sera typiquement stratum 3 ou 4 (il suit le NTP de l'usine), et il servira l'automate en tant que tel.
chrony, remplit les deux rÎles.3. chrony : le démon de temps de Debian
Debian moderne utilise chrony (démon chronyd, client chronyc).
Il est plus robuste que l'ancien ntpd sur les réseaux instables et les machines qui ne
tournent pas 24/7 â exactement le profil d'un edge. On vĂ©rifie qu'il tourne (chapitre 3) :
maint@edge-cell12:~$ systemctl status chronyd
Active: active (running) since Tue 2026-04-08 06:14:02 CEST; 87 days ago
chronyc tracking : suis-je Ă l'heure ?
maint@edge-cell12:~$ chronyc tracking
Reference ID : C0A8000A (ntp.usine.local)
Stratum : 3
Ref time (UTC) : Sat Jul 04 06:22:14 2026
System time : 0.000041 seconds slow of NTP time
Last offset : -0.000012 seconds
RMS offset : 0.000208 seconds
Frequency : 12.340 ppm slow
Skew : 0.045 ppm
Root delay : 0.004120 seconds
Leap status : Normal
Les lignes qui comptent :
- System time ⊠slow/fast of NTP time : l'Ă©cart courant entre l'horloge locale et la source. Ici 41 microsecondes â excellent. Au-delĂ de quelques dizaines de millisecondes sur un edge stable, on s'interroge.
- Stratum : 3, cohérent avec la figure. Un stratum
16signifie « non synchronisĂ© » â l'edge n'a aucune source valide (§6). - Leap status: Normal : la synchro est saine.
Not synchronisedest le drapeau rouge.
chronyc sources : Ă qui je fais confiance ?
maint@edge-cell12:~$ chronyc sources -v
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* ntp.usine.local 2 10 377 412 +18us[ +21us] +/- 2.1ms
^- ntp2.usine.local 2 10 377 377 -1.2ms[ -1.2ms] +/- 8.4ms
^? 192.168.0.1 0 8 0 - +0ns[ +0ns] +/- 0ns
La colonne M/S (le symbole en tĂȘte) est la clĂ© :
| Symbole | Sens |
|---|---|
^* | source actuellement sélectionnée (la référence retenue) |
^+ | source acceptable, combinée avec la sélectionnée |
^- | source acceptable mais écartée (redondante) |
^? | source injoignable / pas encore de mesure |
^x | source considérée fausse (falseticker) |
Reach est un registre octal de joignabilité : 377 (= 8 bits à 1)
signifie « les 8 derniers sondages ont rĂ©pondu » â parfait. 0 = injoignable ;
une valeur qui monte progressivement (1, 3, 7, 17âŠ) indique une synchro en cours d'Ă©tablissement.
4. Configurer l'edge en serveur NTP
Pour que l'edge serve l'heure à la cellule, on édite /etc/chrony/chrony.conf :
# /etc/chrony/chrony.conf (sur l'edge)
# --- RĂŽle CLIENT : d'oĂč l'edge tient l'heure (vers le haut) ---
server ntp.usine.local iburst
server ntp2.usine.local iburst
# --- RĂŽle SERVEUR : Ă qui l'edge sert l'heure (vers le bas) ---
allow 192.168.0.0/24 # autorise le segment OT Ă interroger l'edge
# Si l'edge perd sa source amont, il continue de servir sa propre horloge
# à un stratum dégradé (utile pour un ßlot isolé) :
local stratum 10
# Corriger un gros décalage au démarrage d'un seul coup (voir §6)
makestep 1.0 3
rtcsync # resynchronise l'horloge matérielle (RTC)
driftfile /var/lib/chrony/chrony.drift
Les deux directives structurantes : server (l'edge est client de ces
serveurs) et allow (l'edge sert ce sous-réseau). AprÚs édition, on recharge :
maint@edge-cell12:~$ sudo systemctl restart chronyd
maint@edge-cell12:~$ chronyc sources # vérifier que les serveurs amont répondent
Le piĂšge nÂș 1 du serveur NTP : oublier allow. Sans lui, chrony reste un
client pur et refuse toute requĂȘte entrante â les automates interrogent l'edge et
n'obtiennent rien, sans message d'erreur explicite de leur cĂŽtĂ©. SymptĂŽme : « l'edge est Ă
l'heure mais les clients ne se synchronisent pas ». Vérifie toujours qu'allow couvre
bien le sous-réseau OT.
chronyc clients : qui me demande l'heure ?
maint@edge-cell12:~$ sudo chronyc clients
Hostname NTP Drop Int IntL Last Cmd
===============================================================
192.168.0.1 142 0 6 - 23 0
192.168.0.20 88 0 6 - 9 0
192.168.0.30 0 0 - - - 0
Cette commande (qui demande sudo) liste les clients qui ont interrogé l'edge. Ici le CPU
(.1) et un switch (.20) se synchronisent bien ; le switch .30
Ă 0 requĂȘte NTP ne parle pas Ă l'edge â c'est lui qu'on va diagnostiquer.
5. Diagnostiquer un client qui ne se synchronise pas
« Le switch .30 n'est pas à l'heure ». La démarche, du plus probable au moins
probable :
- L'edge sert-il vraiment ?
chronyc trackingsur l'edge : si lui-mĂȘme est en stratum 16 / Not synchronised, il ne peut servir personne. On rĂšgle l'amont d'abord. - Le client est-il autorisĂ© ? VĂ©rifier que son IP tombe dans un
allowdechrony.conf. - Le réseau laisse-t-il passer le NTP ? NTP est en UDP port 123. Un pare-feu OT ou une rÚgle VLAN peut le bloquer. Test rapide cÎté edge :
maint@edge-cell12:~$ sudo ss -ulpn | grep :123
UDP UNCONN 0 0 0.0.0.0:123 0.0.0.0:* users:(("chronyd",pid=612,fd=5))
# chronyd Ă©coute bien sur 123 â le serveur est prĂȘt. Reste le client / le rĂ©seau.
- Le client pointe-t-il vers la bonne IP ? C'est la cause la plus fréquente et elle est cÎté client : le switch ou l'automate a été configuré avec l'ancienne adresse du serveur NTP, ou aucune. Cela se rÚgle dans sa configuration, pas sur l'edge.
Sur le S7-1500, le serveur NTP se dĂ©clare dans TIA Portal : propriĂ©tĂ©s du CPU â
« Synchronisation de l'heure » â activer NTP et saisir l'IP de l'edge
(192.168.0.10) + l'intervalle. Un oubli classique : le fuseau/décalage. Le CPU
travaille souvent en UTC en interne et applique un décalage local à l'affichage ;
un « écart de 2 heures » entre l'edge (heure locale CEST) et l'automate est presque
toujours un problĂšme de fuseau, pas de synchro NTP. Compare toujours en UTC pour lever le doute.
6. Le saut d'horloge : makestep
chrony corrige normalement l'heure en ralentissant/accélérant doucement l'horloge (pour ne
jamais la faire reculer, ce qui perturberait les applications). Mais au démarrage, si l'edge est décalé de
plusieurs secondes (RTC déchargée, machine restée éteinte longtemps), la correction douce prendrait des
heures. makestep 1.0 3 autorise un saut brutal pour les 3 premiĂšres mises Ă
jour si l'écart dépasse 1 seconde. On peut aussi forcer à la main :
maint@edge-cell12:~$ sudo chronyc makestep
200 OK
maint@edge-cell12:~$ chronyc tracking | grep "System time"
System time : 0.000018 seconds slow of NTP time
Un saut d'horloge est un événement à ne pas prendre à la légÚre en production :
faire bondir l'heure de plusieurs secondes pendant qu'une ligne tourne peut désordonner des horodatages,
déclencher des timeouts applicatifs, invalider une session. On force un makestep de
prĂ©fĂ©rence Ă froid (au dĂ©marrage, machine pas encore en service) â pas sur un edge en pleine remontĂ©e de
données. En marche, on laisse chrony corriger en douceur.
Récapitulatif
- En OT, l'heure juste rend le diagnostic corrélable et fait marcher les certificats ; l'edge est souvent la référence de temps locale de la cellule.
- chrony est Ă la fois client (
server âŠ) et serveur (allow âŠ).chronyc tracking(suis-je Ă l'heure : stratum, offset, Leap status),sources(mes sources :^*= sĂ©lectionnĂ©e, Reach 377 = OK),clients(qui me demande l'heure). - Serveur NTP : ne pas oublier
allow <sous-rĂ©seau>â sinon les clients n'obtiennent rien. - Client qui ne synchronise pas : vĂ©rifier (1) l'edge lui-mĂȘme est synchro, (2) le client est
allowé, (3) UDP/123 passe (ss -ulpn | grep :123), (4) le client pointe la bonne IP ; sur S7-1500, se méfier du fuseau UTC vs local. makestep= saut d'horloge : utile à froid, dangereux en marche.
Exercices
Exercice 1 â Suis-je synchronisĂ© ?
En une commande sur l'edge, comment sais-tu si l'horloge est correctement synchronisée et à quel stratum ? Quels champs regardes-tu ?
Voir la solution
$ chronyc tracking
Trois champs : Leap status doit ĂȘtre Normal (pas
Not synchronised) ; Stratum doit ĂȘtre bas (3â4 typiquement, jamais
16) ; System time ⊠of NTP time doit ĂȘtre petit (”s Ă quelques ms). Si le stratum
est 16 ou le Leap status « Not synchronised », l'edge n'a pas de source valide â on regarde
chronyc sources.
Exercice 2 â L'edge est Ă l'heure mais l'automate non
chronyc tracking sur l'edge est nickel, pourtant le S7-1500 dérive. Liste les vérifs, de
l'edge vers le client.
Voir la solution
- Sur l'edge :
allow 192.168.0.0/24prĂ©sent danschrony.conf? (sans lui, l'edge ne rĂ©pond pas aux requĂȘtes). - Sur l'edge :
sudo chronyc clientsâ le CPU apparaĂźt-il avec des requĂȘtes NTP > 0 ? Si 0, il ne l'interroge pas (config client ou rĂ©seau). - RĂ©seau : UDP/123 passe-t-il ?
sudo ss -ulpn | grep :123confirme que l'edge écoute ; un pare-feu OT peut bloquer entre les deux. - CÎté CPU (TIA) : NTP activé avec l'IP de l'edge ? Et surtout, l'écart est-il de « 2 heures pile » ? Alors c'est le fuseau (UTC vs local), pas la synchro.
Exercice 3 â Reach Ă 0
chronyc sources montre ta source amont avec ^? et Reach 0. Que
signifie-t-il, et quelles causes envisages-tu ?
Voir la solution
Reach 0 = aucun des 8 derniers sondages n'a reçu de réponse : la source est
injoignable. ^? confirme « pas de mesure exploitable ». Causes
possibles : le serveur NTP amont est éteint ou a changé d'IP ; le réseau bloque UDP/123 vers
l'amont ; le nom ntp.usine.local ne résout plus (DNS) ; l'edge n'a pas de route
vers le segment usine. On teste la joignabilité de base (ping, résolution DNS) puis on
remonte ; tant que l'edge n'a pas de source, il ne peut servir personne (stratum 16).