NTP

Das Network Time Protocol (NTP) dient seit 1985 der Synchronisierung von Uhren in Netzwerken über UDP. NTP wurde speziell entwickelt, um eine zuverlässige Zeitgabe über Netzwerke mit variabler Paketlaufzeit zu ermöglichen, mit Genauigkeiten bis in den Milli- und Mikrosekundenbereich.

Ein wichtiger Begriff im NTP-Umfeld ist das Stratum: NTP nutzt ein hierarchisches System verschiedener Strata (Plural von Stratum). Stratum 0 bezeichnet die Zeitnorm, z.B. eine Atom- oder Funkuhr. Direkt angekoppelte NTP-Server heißen Stratum 1. Jede weitere abhängige Einheit erhält bei der Bezeichnung eine höhere Nummer (Stratum 2, Stratum 3 usw.). Ein NTP-Dienst auf RHEL beginnt mit einem Stratum von 16. Im Laufe der Zeit verbessert sich durch Synchronisation mit anderen Zeit-Servern das eigene Stratum - hier hilft also nur warten. Ab Stratum 9 darf der RHEL NTP-Server seine Uhrzeit an untergeordnete Strata weitergeben.

Begriffe:

  • DST: Daylight Saving Time

  • RTC: Realtime Clock

  • TZ: Timezone

Links

Chrony

Ab RHEL 7:

yum -y install chrony
systemctl enable --now chronyd

Allerdings hat man bei der Installation die zu verwendenden NTP-Server nicht explizit festgelegt. Will man den Server 192.0.2.74 als übergeordneten Time-Server verwenden, konfiguriert man:

cat > /etc/chrony.conf << EOF
server 192.0.2.74  iburst

bindcmdaddress 127.0.0.1
bindcmdaddress ::1
commandkey 1
driftfile /var/lib/chrony/drift
generatecommandkey
keyfile /etc/chrony.keys
logchange 0.5
logdir /var/log/chrony
makestep 10 3
noclientlog
rtcsync
stratumweight 0
EOF
systemctl restart chronyd

Tipp

Die Konfigurationsanweisung allow 192.0.2.0/24 macht aus einem Chrony-Client einen vollwertigen NTP-Server. Firewall auf Port 123/udp öffnen.

ntpd (bis RHEL 7)

Client

yum -y install ntp
systemctl enable --now ntpd

Allerdings hat man bei der Installation die zu verwendenden NTP-Server nicht explizit festgelegt. Will man den Server 192.0.2.74 als übergeordneten Time-Server verwenden, konfiguriert man:

/etc/ntp.conf
disable monitor
driftfile /var/lib/ntp/drift
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
restrict 127.0.0.1
restrict ::1
restrict default nomodify notrap nopeer noquery
server 192.0.2.74 iburst
systemctl restart ntpd

Server

Die Konfiguration eines eigenen NTP-Servers auf Basis ntpd, der seine Uhrzeit von NTP-Servern aus dem Internet bezieht, ist nicht sonderlich schwer. Hinzu kommen lediglich die Angaben, welche Netzwerke mit dem Server kommunizieren dürfen, und dass der NTP-Server nach Abfrage der entfernten NTP-Anbieter im Fehlerfall die lokale Uhrzeit zur Synchronisation ausliefern darf:

yum -y install ntp
systemctl enable --now ntpd
/etc/ntp.conf
disable monitor
driftfile /var/lib/ntp/drift
fudge 127.127.1.0 stratum 10
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
restrict 127.0.0.1
restrict ::1
restrict 192.168.26.0
mask 255.255.255.0
nomodify
notrap
nopeer
noquery
pool ntp.metas.ch
server 127.127.1.0 iburst
systemctl restart ntpd

Firewall auf Port 123/udp öffnen.

Zugriffskontrolle auf Host-Ebene erreicht man entweder über die Software-Firewall, oder im Fall des NTP-Servers direkt über die restrict-Anweisungen in der ntp.conf.

/etc/ntp.conf
restrict 192.0.2.0 mask 255.255.255.0 nomodify notrap nopeer noquery
restrict 10.26.7.0 mask 255.255.255.0 ignore

Hier werden aus dem 192.0.2er-Netz einige Paketklassen verworfen und Anfragen aus dem 10.26.7er-Netz gleich ganz ignoriert.

Umgang mit ntp-Tools

So aktualisiert man manuell die Zeit per Network Time Protocol mit einem Server aus dem Internet (im Beispiel mit einem ganzen Schweizer Server-Pool namens ch.pool.ntp.org). Damit stellt man auch fest, ob der Host in der Lage ist, eine aktuelle Zeit vom angegebenen Time-Server zu beziehen. Der Befehl funktioniert allerdings nur, falls der lokale NTP-Daemon beendet und damit der NTP-Port 123 frei ist:

Auf Basis chrony
chronyd -q 'pool ntp.metas.ch iburst'
Auf Basis ntpd
systemctl stop ntpd
ntpdate ntp.metas.ch
systemctl start ntpd

Tipp

SystemD und timedatectl: Darauf achten, dass „RTC in local TZ“ auf „no“ steht. Sonst wird die RTC in der lokalen Zeitzone gelesen, was Probleme bei Wechsel der Zeitzone und DST verursachen kann. Die RTC wird so nie aktualisiert und muss sich ausschliesslich auf externe Zeitserver verlassen. Wenn möglich also RTC in UTC verwenden: timedatectl set-local-rtc 0.

Welche Uhren sind verfügbar?

cat /sys/devices/system/clocksource/clocksource0/available_clocksource
# kvm-clock tsc hpet acpi_pm

Welche Uhr wird als Source genommen?

cat /sys/devices/system/clocksource/clocksource0/current_clocksource
# kvm-clock

ntpq (bis RHEL 7)

Der Befehl ntpq --peers („NTP-Query Peers“) bei laufendem NTP-Daemon liefert eine Liste der verwendeten NTP-Peers mit deren Status, Stratum, Offset der lokalen Uhr gegenüber dem Peer und Jitter (Zeitschwankung in ms - je höher der Wert, desto unzuverlässiger die Quelle). Aufpassen: NTP sorgt zwar für das korrekte Setzen der Uhrzeit, allerdings immer innerhalb der konfigurierten Zeitzone. Eine falsch konfigurierte Zeitzone wird nicht korrigiert.

Nach Neustart eines NTP-Daemons sieht der Status der Zeitsynchronisation evtl. so aus:

ntpq --peers

Der * am Anfang der Zeile bedeutet, dass die Zeit von diesem System geholt wird (hier mit Stratum 10):

     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 bwntpz.bluewin. 195.186.150.242  2 u    4   64    1    2.279    0.725   0.000
*LOCAL(0)        .LOCL.          10 l    3   64    1    0.000    0.000   0.000

Ein paar Minuten später. Der erste Server wurde bereits 17 mal erreicht („reach“), er ist in der Glaubwürdigkeit aber noch nicht aufgestiegen. Der zuoberst stehende Server gewinnt. Der Prozess dauert mind. ca. 10 Minuten.

     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 bwntpz.bluewin. 195.186.150.242  2 u   22   64   17    2.279    0.725   0.182
*LOCAL(0)        .LOCL.          10 l   28   64   17    0.000    0.000   0.000

Nochmal später:

     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*p5099c3bf.dip0. .DCFa.           1 u   16   64  377   31.215   -5.451   0.167
+ntp2.cratis.cc  85.199.214.101   2 u   25   64  377   25.675   -0.109   0.101
-46.175.224.7.ma 188.112.42.5     3 u   16   64  377   35.890    2.775   0.049
+korred.spirit.g 240.67.35.84     3 u   11   64  377   11.656    1.736   0.081
 LOCAL(0)        .LOCL.          10 l   91   64  376    0.000    0.000   0.000

Die Spalten bedeuten:

  • refid: DCFa = amplitude modulated, DCFp = phase modulated, genauer als DCFa, ist ein DCF77 time signal, MRS = Multi Reference Source

  • when: vor wieviel Sekunden das letzte mal erreicht

  • reach: Der „reach“-Counter startet bei 1 und erhöht sich um 2, 4, 10, 20, 40, 100, 200 [202 bei der LOCAL-Clock] bis max. 377.

Troubleshooting

Hoher Jitter in einer VM?

NTP vergleicht die Internet-Zeit mit der lokalen Zeit. Die lokale Zeitquelle für die VMs ist eventuell der Hypervisor, z.B. KVM - dort also mal schauen, ob der ntpd läuft.

Built on 2023-01-27