Eigenen NTP-Server mit Chrony einrichten: Einheitliche Uhrzeit im Heimnetz¶
Veröffentlicht am 26. Oktober 2026 · Geschätzte Lesezeit: 6 Minuten
Ein dauerhaft laufender Ubuntu-Server kann seine Uhrzeit aus offiziellen Zeitquellen beziehen und sie anschließend Geräten im eigenen LAN bereitstellen. So nutzen Server, NAS und Smart-Home-Geräte eine gemeinsame Zeitbasis, was Protokolle und Fehlersuche erleichtert. Die Einrichtung dauert etwa 25 bis 40 Minuten; danach braucht Chrony etwas Zeit, um die Quellen auszuwählen.[1][2]
Voraussetzungen
- Ein dauerhaft laufender Ubuntu-Server mit sudo-Zugang und fester IP-Adresse oder DHCP-Reservierung
- Die tatsächliche LAN-Netzadresse samt Präfix, zum Beispiel
<LAN-CIDR> - Zugriff auf die Router- oder Host-Firewall, falls sie aktiv ist
- Ein Testgerät, auf dem sich ein eigener Zeitserver konfigurieren lässt
- Kein öffentliches Port-Forwarding für NTP
1. Zustand und Netzwerk prüfen¶
Erfasse zuerst Uhrzeit, IP-Adressen und Firewallstatus:
<LAN-CIDR> muss später dein wirkliches internes Netz bezeichnen; nicht das Beispielnetz blind übernehmen. Wenn Chrony noch nicht installiert ist, installiere es:
Ubuntu verwendet Chrony als Standard-Zeitdienst ab Ubuntu 25.10; ältere Installationen können anders eingerichtet sein. Prüfe den tatsächlichen Dienststatus, statt anzunehmen, welcher Zeitdienst bereits läuft.[1][3]
Wenn der Dienst nicht active meldet, lies die konkrete Fehlermeldung und behebe sie, bevor du fortfährst.
2. Konfiguration sichern und Zeitquellen prüfen¶
Sichere die Hauptkonfiguration, bevor du sie änderst:
Ubuntu kann Zeitquellen zusätzlich in Dateien unter /etc/chrony/sources.d/ verwalten. Prüfe die vorhandenen Einträge und lösche sie nicht pauschal:[2]
sudo grep -R -n -E '^[[:space:]]*(server|pool|peer|allow)[[:space:]]' /etc/chrony/chrony.conf /etc/chrony/sources.d 2>/dev/null || true
Notiere die vorhandene Upstream-Konfiguration. Sie stellt die Zeitversorgung des Servers sicher; eine allow-Regel allein richtet keine Internet-Zeitquelle ein.[1][2]
3. Zugriff im Chrony-Server begrenzen¶
Öffne die Hauptdatei:
Ergänze eine einzelne allow-Zeile für das richtige Clientnetz. Beispiel, ausschließlich wenn dein Netz tatsächlich 192.168.10.0/24 ist:
Ersetze 192.168.10.0/24 durch <LAN-CIDR>: die Netzadresse und Präfixlänge deines Netzes, etwa aus Router- oder Netzwerkkonfiguration. Verwende keine leere oder unbeschränkte allow-Direktive. Chrony verlangt eine passende allow-Regel, damit es Zeitdienst-Anfragen von Clients bedient.[1][4]
Lass vorhandene pool-, server- und Ubuntu-NTS-Einträge unverändert, sofern du keinen konkreten Grund für eine Anpassung hast. Bei Ubuntu-NTS benötigt der Upstream neben NTP/UDP 123 auch NTS-KE über TCP 4460; diese Verbindung betrifft den Server zu seinen Zeitquellen, nicht die normalen NTP-Clients im LAN.[2]
Speichere die Datei und prüfe sie auf offensichtliche Tippfehler. Die bisherige Sicherung ermöglicht den Rückweg in Schritt 9.
4. Chrony neu starten und Upstream prüfen¶
Lade die Änderung durch einen Neustart ein und prüfe den Dienst:
Zeige Chronys gewählte Quellen und Synchronisationsstatus:
Warte bei Bedarf einige Minuten und prüfe erneut. ^* kennzeichnet die aktuell ausgewählte Zeitquelle; ^? bedeutet, dass eine Quelle derzeit nicht auswählbar oder nicht erreichbar ist. Der Server sollte selbst eine plausible Synchronisation erreichen, bevor Clients umgestellt werden.[1][2]
5. Firewall nur bei aktiver UFW anpassen¶
Wenn sudo ufw status zuvor Status: active gezeigt hat, erlaube NTP ausschließlich aus dem tatsächlichen LAN. Ersetze <LAN-CIDR> vor dem Ausführen:
Beispiel mit einem nur beispielhaften Netz:
Setze diese Regel nicht ein, wenn das Beispielnetz nicht exakt deinem LAN entspricht. Bei inaktiver UFW musst du sie nicht aktivieren. Andere Firewalls oder VLAN-Regeln müssen ebenfalls nur den benötigten Clientzugriff auf UDP-Port 123 erlauben. Richte keine öffentliche Portweiterleitung für UDP 123 ein.
Kontrolliere anschließend die Regeln:
6. Einen Testclient auf den internen Server umstellen¶
Führe diesen Schritt zunächst nur an einem Testgerät aus. Auf einem Linux-Client mit Chrony sichere die Konfiguration:
Lege eine Quellen-Datei an. Ersetze <SERVER-IP> durch die feste LAN-IP des Chrony-Servers:
<SERVER-IP> ist eine Platzhalteradresse, keine wörtliche Eingabe. Falls dein Client seine Quellen nicht aus sources.d einliest, ergänze stattdessen die passende server <SERVER-IP> iburst-Zeile in dessen bestehender Chrony-Konfiguration. Entferne andere Zeitquellen nicht ohne zu prüfen, wie der Client verwaltet wird.
Lade die Quellen neu und kontrolliere sie:
Nach der Einregelzeit sollte die Server-IP als erreichbare Quelle auftauchen und idealerweise mit ^* ausgewählt sein. Stelle weitere Geräte erst um, wenn der Testclient funktioniert.
7. Funktion und Erreichbarkeit prüfen¶
Auf dem Server:
systemctl is-active chrony
chronyc activity
chronyc tracking
chronyc sources -v
sudo ss -lunp | grep ':123'
sudo journalctl -u chrony -n 50 --no-pager
Auf dem Client:
Erfolg bedeutet: Chrony ist aktiv, der Server hat eine erreichbare Upstream-Quelle, der Client zeigt die interne Server-IP und nach der Einregelzeit eine ausgewählte Quelle. Leap status: Normal ist ein hilfreicher zusätzlicher Kontrollwert. Ein offener UDP-Port allein beweist nicht, dass die Zeit korrekt synchronisiert wird.[1][2]
8. Risiken und typische Fehler¶
- Eine falsche Netzmaske kann Geräte aussperren oder den Zugriff zu weit öffnen. Vergleiche
<LAN-CIDR>mit Router und Client-IP. - Eine wechselnde Server-IP macht die Clientkonfiguration ungültig. Nutze eine DHCP-Reservierung oder eine korrekt verwaltete feste Adresse.
- Chrony muss eine eigene Upstream-Zeitquelle erreichen können. Bei Ubuntu-NTS können blockiertes TCP 4460, DNS oder Zertifikatsprobleme die Synchronisation verhindern.[2]
- Getrennte VLANs benötigen passende Regeln zwischen den Netzen; die lokale UFW-Regel allein reicht dann möglicherweise nicht.
- Ein unmittelbar nach dem Neustart fehlendes
^*ist nicht zwingend ein Konfigurationsfehler. Warte kurz und kontrolliere Journal, Erreichbarkeit und Quellen erneut. - Nicht
local stratumaktivieren, um eine fehlende Upstream-Synchronisation zu kaschieren. Clients könnten sonst eine unzuverlässige Zeit als gültig behandeln.[4] - NTP-Zeitsynchronisierung und Zeitzone sind verschieden: Chrony synchronisiert die Systemzeit; die lokale Anzeigezeitzone wird separat eingestellt.
9. Rückweg¶
Falls der Server nach der Änderung nicht korrekt arbeitet, stelle die Sicherung wieder her und starte Chrony neu:
sudo cp -a /etc/chrony/chrony.conf.vor-ntp-server /etc/chrony/chrony.conf
sudo systemctl restart chrony
Wenn du die UFW-Regel angelegt hast, ermittle ihre Nummer:
Lösche anschließend nur die eindeutig identifizierte Chrony-Regel:
<REGELNUMMER> ersetzt du durch die in der vorherigen Ausgabe angezeigte Nummer. Entferne beim Testclient die Datei heimnetz.sources oder spiele dessen Sicherung zurück und starte Chrony dort ebenfalls neu.
Fertig¶
Prüfe zum Abschluss noch einmal auf dem Server chronyc tracking und chronyc sources -v sowie auf dem Testclient die erreichbare interne Quelle. Wenn Quelle oder Status nicht plausibel sind, stelle keine weiteren Geräte um, sondern prüfe Firewall, IP-Adresse, CIDR, Upstream-Verbindung und Journal.
Grundlage dieser Anleitung ist die Ubuntu-Dokumentation zum Betrieb von Chrony als NTP-Server: https://ubuntu.com/server/docs/how-to/networking/serve-ntp-with-chrony/.
Sources¶
[1] https://documentation.ubuntu.com/server/how-to/networking/serve-ntp-with-chrony/index.html — Ubuntu: Serve NTP with Chrony [2] https://ubuntu.com/server/docs/about-time-synchronisation — Ubuntu: About time synchronization [3] https://ubuntu.com/server/docs/how-to/networking/chrony-client — Ubuntu: Synchronize time using chrony [4] https://chrony-project.org/doc/4.1/chrony.conf.html — Chrony: chrony.conf