In einer vernetzten und hochgradig digitalisierten Welt ist die genaue Zeit ein unverzichtbarer Faktor. Ganz gleich, ob es um das Synchronisieren von Computern, Netzwerkgeräten oder Servern geht, eine passgenaue Zeitsynchronisierung ist von entscheidender Bedeutung, um reibungslose Abläufe zu gewährleisten. Ein NTP-Server im eigenen Netzwerk stellt sicher, dass alle Geräte die exakte gleiche Zeit haben.
Selber Hosten ist aber häufig nicht angesagt. In der Regel werden im Heimbetrieb öffentliche Zeitserver angefragt. Die haben aber meist viel Besseres zu tun und antworten daher oft nicht bei mehreren dutzenden Anfragen alle paar Minuten. So erging es zumindest mir. Deshalb habe ich mich mit dem Thema NTP-Server detaillierter auseinandergesetzt. Gestoßen bin ich dabei auf den Service Chronyd.
Dieser kann außerdem als NTP-Client eingerichtet werden. Wie das funktioniert, erkläre ich nicht nur bis ins kleinste Detail, sondern ich biete dir auch ein funktionsfähiges Playbook an. Schließlich wirst du ja nicht alle Einstellungen von Hand auf jedem Server vornehmen wollen. Zusammenfassend lässt sich über Chrony sagen, dass er nicht nur äußerst zuverlässig arbeitet, sondern auch sehr benutzerfreundlich ist.
Installation und Einrichtung von Chronyd als Zeitserver:
Ich benutze sehr gerne RedHat-Derivate und dort ist Chrony bereits seit Version 8 serienmäßig vorinstalliert, konfiguriert und aktiviert. Die Einrichtung geht also sehr leicht von der Hand. Ich habe lediglich deutsche NTP-Server eingetragen und die Direktive manual eingetragen. Diese soll sicherstellen, dass keine automatischen Änderungen an der Konfiguration vorgenommen werden.
Noch wird Chronyd aber keine Anfragen von Clients beantworten. Dafür muss man mittels der Anweisung allow noch einstellen, welche IP-Adressen oder ganze Netzwerke Antworten erhalten. Ich habe mir es leicht gemacht und einfach allow all genutzt. Konkret schauen meine Anpassungen wie folgt aus:
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (https://www.pool.ntp.org/join.html).
# Do not change settings automatically
manual
# Use german ntp servers
server ptbtime1.ptb.de
server ntp1.t-online.de
server time.versatel.de
# Allow NTP client access from any network
allow all
# Use NTP servers from DHCP.
#sourcedir /run/chrony-dhcp
# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift
# Allow the system clock to be stepped in the first three updates
# if its offset is larger than 1 second.
makestep 1.0 3
# Enable kernel synchronization of the real-time clock (RTC).
rtcsync
# Enable hardware timestamping on all interfaces that support it.
#hwtimestamp *
# Increase the minimum number of selectable sources required to adjust
# the system clock.
#minsources 2
# Allow NTP client access from local network.
#allow 192.168.0.0/16
# Serve time even if not synchronized to a time source.
local stratum 10
# Require authentication (nts or key option) for all NTP sources.
#authselectmode require
# Specify file containing keys for NTP authentication.
keyfile /etc/chrony.keys
# Save NTS keys and cookies.
ntsdumpdir /var/lib/chrony
# Insert/delete leap seconds by slewing instead of stepping.
#leapsecmode slew
# Get TAI-UTC offset and leap seconds from the system tz database.
leapsectz right/UTC
# Specify directory for log files.
logdir /var/log/chrony
# Select which information is logged.
#log measurements statistics tracking#
Damit alle Änderungen wirksam werden, muss einmal neu gestartet werden:
systemctl restart chronyd
Nun sollte man noch prüfen, ob Chronyd die neuen Zeitserver erreichen kann:
chronyc sources
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^* ptbtime1.ptb.de 1 10 377 372 +2848us[+2824us] +/- 14ms
^+ ntp1.sul.t-online.de 2 10 377 290 -2204us[-2204us] +/- 34ms
^- ns01.versatel.de 2 9 377 240 -2704us[-2704us] +/- 51ms
Eine Zusammenfassung über den Zustand bekommt man mit:
chronyc tracking
Reference ID : C035676C (ptbtime1.ptb.de)
Stratum : 2
Ref time (UTC) : Tue Aug 15 19:08:17 2023
System time : 0.000140064 seconds slow of NTP time
Last offset : -0.000023929 seconds
RMS offset : 0.000096147 seconds
Frequency : 26.911 ppm slow
Residual freq : -0.000 ppm
Skew : 0.030 ppm
Root delay : 0.023521340 seconds
Root dispersion : 0.000550491 seconds
Update interval : 1035.6 seconds
Leap status : Normal
Installation und Einrichtung von Chronyd als NTP-Client:
Nachdem man jetzt einen funktionstüchtigen NTP-Server sein Eigen nennen kann, muss man auf seinen Clients nur noch dessen IP-Adresse hinterlegen. Das geht auf RedHat-Derivaten dank des vorinstallierten Chronyd-Services besonders einfach. Ich habe dafür einfach 2 Änderungen an der Konfiguration vorgenommen. Unter anderem wurde die IP meines Chronyd-Servers um die Einstellung iburst erweitert.
Diese Einstellung gibt an, dass der Client viele Anfragen in kurzer Zeit generieren darf, um seine Zeit schnell anpassen zu können. Je nach Zahl an anfragenden Geräten muss der NTP-Server dafür über ausreisende Ressourcen verfügen. Des Weiteren wurde auch hier wieder die Direktive manual gesetzt, damit keine automatischen Änderungen an der Konfiguration vorgenommen werden.
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (https://www.pool.ntp.org/join.html).
#pool 2.rocky.pool.ntp.org iburst minpoll 9 maxpoll 11
# Own NTP server
server 10.10.10.213 iburst
# Do not change settings automatically
manual
# Use NTP servers from DHCP.
#sourcedir /run/chrony-dhcp
# Record the rate at which the system clock gains/losses time.
driftfile /var/lib/chrony/drift
# Allow the system clock to be stepped in the first three updates
# if its offset is larger than 1 second.
makestep 1.0 3
# Enable kernel synchronization of the real-time clock (RTC).
rtcsync
# Enable hardware timestamping on all interfaces that support it.
#hwtimestamp *
# Increase the minimum number of selectable sources required to adjust
# the system clock.
#minsources 2
# Allow NTP client access from local network.
#allow 192.168.0.0/16
# Serve time even if not synchronized to a time source.
#local stratum 10
# Require authentication (nts or key option) for all NTP sources.
#authselectmode require
# Specify file containing keys for NTP authentication.
keyfile /etc/chrony.keys
# Save NTS keys and cookies.
ntsdumpdir /var/lib/chrony
# Insert/delete leap seconds by slewing instead of stepping.
#leapsecmode slew
# Get TAI-UTC offset and leap seconds from the system tz database.
leapsectz right/UTC
# Specify directory for log files.
logdir /var/log/chrony
# Select which information is logged.
#log measurements statistics tracking
Selbstredend muss auch hier der Daemon neu gestartet werden, damit alle Änderungen übernommen werden:
systemctl restart chronyd
Wir alle kennen diesen einen Spruch: Vertrauen ist gut und Kontrolle ist besser! Daher solltest du prüfen, ob Chronyd mit der Konfiguration arbeiten kann:
chronyc sources && chronyc tracking
Ansible-Playbook machen einem das Leben so viel leichter:
Niemand möchte händisch dieselbe Konfiguration auf unterschiedlichen Servern verteilen. Wer also in seinem Heimnetzwerk über einen Ansible Control Node verfügt, sollte daher lieber mein Playbook nutzen. Damit werden die oben besprochenen Änderungen automatisch auf jedem Host durchgeführt:
---
- name: NTP client configuration
hosts: all
remote_user: root
gather_facts: no
tasks:
- name: Copy Chronyd configuration to target hosts
copy:
src: ./files/chrony.conf
dest: /etc/chrony.conf
notify: chronyd
when: ansible_distribution in ['CentOS', 'Rocky', 'Fedora', 'AlmaLinux']
handlers:
- name: chronyd
service:
name: chronyd
state: restarted
enabled: true
Damit das Copy-Modul korrekt funktioniert, muss natürlich der Pfad zur chrony.conf korrekt angegeben werden. Ist das erledigt, wird das kleine Playbook auf den bekannten RedHat-Derivaten seine Änderungen durchführen.