Mit der Zeit gehen

NTP und andere Zeit-Server

01.06.2002 Eine korrekt gestellte Systemuhr ist nicht nur praktisch, sie hilft auch bei der Suche nach Konfigurations- und Netzwerksfehlern oder bei der Analyse von Angriffen. Aber woher bekommt man die richtige Zeit? Über's Internet.

Mail abgeschickt um 17:15 Uhr, angekommen fünf Minuten vorher? Hier erscheint die falsch gestellte Systemuhr noch amüsant. Unangenehm wird es spätestens dann, wenn man in den Logdateien eines halbwegs beschäftigten Servers nach einem bestimmten Problem sucht. Für verteilte Anwendungen ist eine korrekte Uhrzeit auf allen beteiligten Systemen oft unerlässlich.

Leider sind die so genannten Echtzeituhren der meisten Computer alles andere als quarzgenau. Abweichungen von mehreren Sekunden pro Tag sind keine Seltenheit, und mal ehrlich: Wer will denn schon zweimal in der Woche die Zeit korrigieren? Kaum verwunderlich, dass es schon sehr früh in der Geschichte des Internets eine Lösung für das Zeitproblem gab.

NTP

Das "Network Time Protocol" (NTP, [3] und [4]) mit dem zugehörigen Server-Programm ntpd erfüllt fast alle vorstellbaren Forderungen an eine Uhr.

NTP synchronisiert die Systemzeit mit der "Universal Time Coordinated" (UTC), bei uns gerne "Greenwich Mean Time" (GMT) genannt. Als Quelle für diese exakte Uhrzeit dient beispielsweise ein terrestrisches oder satellitengestütztes Funksystem, etwa DCF-77 oder GPS. Dabei kann man mit einem aktuellen Linux-Kernel eine Genauigkeit in der Größenordnung einer Mikrosekunde erreichen, einer Millionstel-Sekunde also!

Die meisten Leute haben weder einen eigenen Hardware-Empfänger noch eine Cäsium-Atomuhr im Garten. Für Normalsterbliche bezieht der NTP-Daemon die Zeit daher von einem Server aus dem Intra- oder Internet. Die Genauigkeit liegt dabei immerhin noch im Millisekundenbereich (im LAN) oder zumindest bei einigen Hundertstel Sekunden (über das Internet).

Ein typischer NTP-Daemon berechnet die systematische Ungenauigkeit der eigenen Systemuhr im PC. Dadurch liefert er selbst ohne Netzwerkanbindung für einige Stunden bis hin zu einem Tag eine ganz exakte Uhrzeit. Zudem berücksichtigen aktuelle Versionen die Besonderheiten von ISDN- und Modem-Verbindungen mit teils stark asymmetrischen Paketlaufzeiten. So ist auch für einfache Leute eine absolut exakte Systemzeit erreichbar.

Zeitarchitektur im Netz

Für die Verteilung der Uhrzeit über das Netz sieht NTP eine raffinierte Server-Architektur vor, die in Abbildung 1 skizziert ist.

Abbildung 1: Die NTP-Architektur im Internet

Die Uhrzeit jedes synchronisierten Rechners geht letztlich auf eine so genannte externe Zeitquelle zurück. In Abbildung 1 sind dafür GPS-Satellitenempfänger oder DCF-Funkuhren als Beispiele genannt. Der meistgenutzte NTP-Daemon unterstützt unzählige dieser Zeitquellen. Ein Computer, der direkt an eine solche Uhr angeschlossen ist, befindet sich definitionsgemäß in der obersten Schicht der NTP-Architektur, im Stratum 1. Er verfügt (in den Grenzen der verwendeten Hardware) über eine absolut korrekte Zeit.

Über das Netz geben die Computer dieser ersten Schicht die Zeit weiter. Rechner aus Stratum 2 beziehen die Zeit von Stratum 1; Rechner aus Stratum 3 von Stratum 2. Das lässt sich (fast) beliebig fortsetzen.

Ziel von NTP ist nicht die Synchronisation eines Clients mit einem vorgegebenen Server, sondern mit UTC. Fällt ein Server aus oder liefert er eine fehlerhafte Zeit zurück, soll NTP dies ohne Wimpernzucken umgehen. Daher benötigt ein NTP-Client im Idealfall mehrere Server.

Jeder Server informiert nicht nur darüber, was er gerade für die richtige Zeit hält. Zusätzlich schätzt er seine eigene Abweichung von der "echten" UTC. Wenn nun mehrere Server zur Verfügung stehen, werden zunächst diejenigen mit offensichtlich falscher Uhrzeit ausgemerzt. Anschließend sucht der Client sich den besten Server aus, also den aus der obersten Schicht bzw. denjenigen mit der geringsten Abweichung. Nur mit diesem synchronisiert er seine Zeit. Im Idealfall sind bei jedem Rechner wenigstens drei Server konfiguriert. Davon wird effektiv nur einer für die Synchronisation benutzt, die übrigen dienen als Vergleich und Backup.

Für den typischen Linux-Computer zu Hause ist ein ständig laufender NTP-Daemon, also ntpd bzw. xntpd, in der Regel Overkill. Nicht nur, dass diese Software im Idealfall eine kontinuierlich laufende Maschine mit zumindest überwiegend aktiver Netzwerkverbindung erwartet: Die zugehörige Funktionalität lässt sich zudem auch viel einfacher erreichen, indem man jeweils nach dem Herstellen einer Netzwerkverbindung einmalig die Uhrzeit abgleicht. Dafür verwenden Sie wahlweise ntpdate oder ntpd -q.

Beide Programme lassen sich aus den auf der Heft-CD befindlichen Sourcen kompilieren, sofern sie nicht ohnehin bereits auf dem Rechner vorliegen. Nach dem Auspacken mit tar -xzvf ntp-4.1.1a.tar.gz installiert man die Software mit dem üblichen Dreiklang ./configure; make; make install in den /usr/local-Zweig des Dateisystems.

Abgleich bei Einwahl

Nutzt man ohnehin ein Skript wie /etc/ppp/ip-up, das bei jedem Verbindungsaufbau ins Internet aufgerufen wird, bietet sich ntpdate an:

ntpdate -s ntp.uni-trier.de slug.ctv.es ntp.maths.tcd.ie ntp.cs.strath.ac.uk

Die Option -s leitet Fehler- und Statusmeldungen in das Syslog um und sorgt so dafür, dass sie in den zentralen Logdateien (in der Regel in /var/log/messages) einzusehen sind.

Es folgt eine Liste einiger NTP-Server. Eine Übersicht öffentlich zugänglicher NTP-Server finden Sie in [2]; die Höflichkeit gebietet es, keinen "fremden" NTP-Server anzuzapfen, wenn der Admin das nicht wünscht. Auch sollten Sie als Privatmann tunlichst keine Server aus Stratum 1 verwenden, um keine Überlast zu provozieren. Wie bereits erwähnt, wird NTP nur einen der Server für die eigentliche Synchronisierung verwenden, die übrigen dienen lediglich als Vergleichsobjekte.

Treffer beim ersten Versuch

Etwas genauer funktioniert der NTP-Daemon im "One-Shot-Modus", bei dem ein einmaliger Abgleich durchgeführt wird. Dazu starten Sie ntpd mit der Option -q. Der Daemon arbeitet dabei so exakt wie möglich; anschließend beendet er sich jedoch und überwacht die Systemzeit nicht mehr weiter.

Für ntpd benötigen Sie eine einfache Konfigurationsdatei namens /etc/ntp.conf mit Angaben über die Server. Diese könnte etwa so aussehen:

server ntp.uni-trier.de iburst
server slug.ctv.es iburst
server ntp.maths.tcd.ie iburst
server ntp.cs.strath.ac.uk iburst

Das Schlüsselwort iburst sorgt für eine schnelle Übertragung zahlreicher Anfragen unmittelbar hintereinander und erlaubt damit eine möglichst zügige Synchronisation.

Zeitverteiler im LAN

Wenn Sie ein eigenes lokales Netzwerk betreiben, wollen Sie die Uhrzeit wahrscheinlich auf alle Rechner weiterverteilen. Freilich könnte jede Workstation selbstständig eine Synchronisation mit einem externen Server durchführen.

Alternativ definieren Sie einfach Ihren Router als primitiven Zeitserver für das alte rdate-Protokoll [5]. Dieses ist immerhin auf Zehntelsekunden genau und sollte für den Hausgebrauch völlig ausreichen. Großer Vorteil: Sie benötigen keinen eigenen Daemon mit eigenen Sicherheitsrisiken, denn die Unterstützung für rdate ist im inetd-Server bereits eingebaut, also jenem Super-Server, der auf fast allen Linux-Computern aktiv ist und die Verteilung ankommender Netzwerkverbindungen zu den ganzen "kleinen" Daemonen erledigt.

Auf Server-Seite aktivieren Sie dieses Protokoll durch einen Eintrag in /etc/inetd.conf oder /etc/xinetd.d. Denken Sie daran: Änderungen in diesen Dateien müssen Sie dem zugehörigen Daemon durch einen Befehl wie killall -HUP inetd mitteilen.

Listing 1

rdate über inetd

# Variante 1: time (rdate)-Eintrag für /etc/inetd.conf
time    stream  tcp     nowait  root    internal

Die Konfiguration in Listing 1 gilt immer dann, wenn Ihr Computer mit inetd arbeitet. Meistens befindet sich eine solche oder ähnliche Zeile bereits in der Konfigurationsdatei /etc/inetd.conf und muss nur noch durch Entfernen des # am Zeilenanfang aktiviert werden.

Listing 2

rdate-Konfiguration für xinetd

# Variante 2: time (rdate)-Eintrag als
# eigene Datei /etc/xinetd.d/time
service time
{
        type            = INTERNAL
        id              = time-stream
        socket_type     = stream
        protocol        = tcp
        user            = root
        wait            = no
        disable         = no
}

Verwenden Sie ein System mit dem neueren xinetd, zeigt Listing 2 die entsprechende Konfiguration. Hier legt man für jedes gewünschte Protokoll eine eigene Konfigurationsdatei in einem Kontrollverzeichnis an. Und wieder gilt: Wahrscheinlich befindet sich solch eine Datei bereits auf Ihrem Computer und muss nur noch aktiviert werden. Ändern Sie dazu disable = yes zu disable = no, wie im Beispiel gezeigt.

Jeder andere Rechner des Netzwerks kann nun vom so konfigurierten Server die Zeit abfragen. Angenommen, Ihr Router verwendet die private IP-Adresse 172.16.45.1, so lautet der Befehl zum Setzen der lokalen Zeit auf einem Client-Rechner rdate -s 172.16.45.1. Es empfiehlt sich, anschließend auch die Hardware-Uhr zu aktualisieren, zum Beispiel mit dem Dienstprogramm hwclock. Am besten legen Sie auf Ihren Client-Computern einen Eintrag in der crontab von root an, sodass die beiden Befehle einmal in der Stunde automatisch ausgeführt werden:

9 * * * * /usr/bin/rdate -s 172.16.45.1; /sbin/hwclock --systohc --utc

Ausblick

Einmal eingerichtet, sorgt NTP unauffällig und im Hintergrund dafür, dass Ihre Computer immer mit der korrekten Uhrzeit versorgt werden. Wenn Sie sich genauer für die Arbeit der zugehörigen Daemonen interessieren, lesen Sie sich zunächst einmal die Manpages zu ntpd oder auch hwclock durch. Ist Ihr Wissendurst dann noch nicht gestillt, empfehle ich die sehr ausführliche und informative Web-Seite zu NTP [1] (pju).

Glossar

Daemon

Dienst-Programm, das im Hintergrund eines Unix-Systems läuft, ohne die darauf arbeitenden Benutzer zu behelligen.

Paketlaufzeiten

Über's Internet zu übertragende Daten werden auf Absenderseite in Pakete verpackt und vom Empfänger wieder ausgepackt und in einer für die jeweilige Anwendung passenden Form zusammengesetzt. Die Paketlaufzeit gibt an, wie lange ein solches Datenpaket von A nach B braucht. Wenn Hin- und Rückweg nennenswert unterschiedlich lange dauern, spricht man von Asymmetrie.

Syslog

Der System-Logging-Daemon syslogd protokolliert entsprechend seiner Konfiguration in /etc/syslog.conf für das System relevante Fehler- und Statusmeldungen mit, gibt sie auf einer Konsole aus und/oder legt sie in Dateien unterhalb von /var/log ab.

Infos

[1] Web-Seite zum Network Time Protocol: http://www.eecis.udel.edu/~ntp/ (auch unter http://www.ntp.org/ zu erreichen)

[2] Liste öffentlich zugänglicher NTP-Server: http://www.eecis.udel.edu/~mills/ntp/servers.htm

[3] David Mills: RFC 2030, "Simple Network Time Protcol (SNTP) Version 4 for IPv4, IPv6 and OSI", ftp://ftp.isi.edu/in-notes/rfc2030.txt

[4] David Mills: RFC 1305 (STD-0012), "Network Time Protocol (Version 3): Specification, Implementation and Analysis", ftp://ftp.isi.edu/in-notes/rfc1305.txt

[5] Jon Postel und Ken Harrenstien: RFC 868 (STD-0026), "Time Protocol", ftp://ftp.isi.edu/in-notes/rfc868.txt

Einem Freund empfehlen    Druckansicht beenden Bookmark and Share
Kommentare