🐧 Edge Linux Debian · diagnostic & exploitation

Chapitre 05
Temps & NTP (chrony)

Objectifs du chapitre

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 :

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.

Horloge GPS stratum 0/1 NTP usine stratum 2 Edge (chrony) stratum 3 · client + serveur client ↑ CPU S7-1500 Switches OT serveur ↓ (l'edge sert l'heure Ă  la cellule)
Figure 5.1. L'edge est à la fois client (il suit le NTP de l'usine, vers le haut) et serveur (il sert l'heure au CPU et aux switches, vers le bas). Un seul démon, 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 :

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Ă© :

SymboleSens
^*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
^xsource 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 :

  1. L'edge sert-il vraiment ? chronyc tracking sur l'edge : si lui-mĂȘme est en stratum 16 / Not synchronised, il ne peut servir personne. On rĂšgle l'amont d'abord.
  2. Le client est-il autorisĂ© ? VĂ©rifier que son IP tombe dans un allow de chrony.conf.
  3. 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.
  1. 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

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
  1. Sur l'edge : allow 192.168.0.0/24 prĂ©sent dans chrony.conf ? (sans lui, l'edge ne rĂ©pond pas aux requĂȘtes).
  2. 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).
  3. RĂ©seau : UDP/123 passe-t-il ? sudo ss -ulpn | grep :123 confirme que l'edge Ă©coute ; un pare-feu OT peut bloquer entre les deux.
  4. 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).