Debian Systemzeit synchronisieren

Andreas Preuss
13-06-2018 17:21

Einige Debianserver betreibe ich in einer VM und habe oft nach einem Suspend das Problem, dass Datum und Uhrzeit nicht mehr aktuell sind. Oft greift die entsprechende Sync-Einstellung in den VMWare-Tools nicht. Es wäre also sinnvoll die Zeit Online über einen NTP Server synchronisieren zu können. Das NTP Protokoll ist dazu da, um die Zeit auf einem Server mit einem zentralen Zeitserver abzugleichen. Hierbei schafft die Installation eines NTP Daemons Abhilfe. Dieser ist bei den einzelnen Distributionen schon als Paket vorhanden und kann ganz einfach installiert werden.

sudo apt-get install ntp

Danach ist mit einem Editor der Wahl die Konfigurationsdatei /etc/ntp.conf zu öffnen und der Eintrag der Zeitserver anzupassen. Unter pool.ntp.org kann man sich zum Beispiel den für sich passenden NTP-Server heraussuchen.
Bei Debian Linux kann man beispielsweise folgende Server für Deutschland in die Datei /etc/ntp.conf einfügen bzw. die bestehenden mit "server" beginnenden Zeilen ersetzen:

server  ntp1.hetzner.de  iburst
server  ntp2.hetzner.com iburst
server  ntp3.hetzner.net iburst
server 0.de.pool.ntp.org iburst
server 1.de.pool.ntp.org iburst
server 2.de.pool.ntp.org iburst
server 3.de.pool.ntp.org iburst

Hier wird bei jedem Start des NTP Dienstes ein beliebiger deutscher Server abgefragt. Dies stellt sicher, daß die Anfragen über viele Server verteilt werden und erhöht gleichzeitig die Zuverlässigkeit. Abschliessend muss der ntpd noch neu gestartet werden.

service ntp restart

Es kann notwendig sein, dass man einmal nachdem man den NTP Server installiert hat, die Zeit manuell synchronisiert. Dies geht entweder mit ntpd oder mit ntpdate (muss bei Debian zusätzlich installiert werden):

service ntp stop  # NTP stoppen
ntpd -q -g        # synchronisieren
service ntp start # NTP wieder starten

Die Option -g bedeutet, dass ntpd auch synchronisiert, wenn die Zeit mehr als 1000 Sekunden abweicht.
Die Option -q bedeutet, dass ntpd nur einmal ausgeführt wird.

Absicherung
Da NTP ein UDP-basiertes Protokoll ist, kann es leicht für DDoS-Angriffe mißbraucht werden. Da bei falscher Konfiguration die Antwort größer als die Anfrage ausfällt, wird so ein Angriff verstärkt. Eine entsprechende Konfiguration, welche nur die deutschen NTP-Pool server nutzt, könnte wie folgt aussehen:

restrict    default kod nomodify notrap nopeer noquery
restrict -6 default kod nomodify notrap nopeer noquery

restrict    127.0.0.1
restrict -6 ::1

server 0.de.pool.ntp.org iburst
server 1.de.pool.ntp.org iburst
server 2.de.pool.ntp.org iburst
server 3.de.pool.ntp.org iburst

Bei dieser Konfiguration sind Veränderungen und Statusabfragen nur noch lokal möglich. Zeitinformationen können mit und von jeder IP aus abgerufen werden. Alternativ ist es möglich alle Anfragen zu blockieren und Zeitinformationen nur mit explizit erlaubten Zeitservern auszutauschen. Folgendes Beispiel erlaubt nur den Austausch von Zeitinformationen mit den Hetzner NTP Servern

restrict    default ignore
restrict -6 default ignore

restrict    127.0.0.1
restrict -6 ::1

server ntp1.hetzner.de iburst
restrict    213.239.239.164 nomodify notrap nopeer noquery
restrict -6 2a01:4f8:0:a0a1::2:1 nomodify notrap nopeer noquery

server ntp2.hetzner.de iburst
restrict    213.239.239.165 nomodify notrap nopeer noquery
restrict -6 2a01:4f8:0:a101::2:3 nomodify notrap nopeer noquery

server ntp3.hetzner.de iburst
restrict    213.239.239.166 nomodify notrap nopeer noquery
restrict -6 2a01:4f8:0:a112::2:2 nomodify notrap nopeer noquery

Uhrzeit in Hardwareuhr schreiben
Damit der Server nach einem erneuten Booten mit einer völlig falschen Zeit hochkommt, kann man noch die Uhr in die Hardwareclock schreiben.

hwclock --systohc

Die Urzeit kann mit dem Befehl date ausgegeben werden:

# Tag (01 bis 31)
getDay=$(date "+%d")
	
# Wochentag (Montag bis Sonntag)
getDayName=$(date "+%A")
	
# Monat (01 bis 12)
getMonth=$(date "+%m")

# Monatsname (Januar bis Dezember)
getMonthName=$(date "+%B")
	
# Jahr (ab 1970)
getYear=$(date "+%Y")

# Jahr (kurz: 00 bis 99)
getYearShort=$(date "+%y")
	
# Stunde (kurz: 00 bis 23)
getHour=$(date "+%H")

# Minute (kurz: 00 bis 59)
getMinute=$(date "+%M")

# Sekunde (kurz: 00 bis 59)
getSecond=$(date "+%S")
	
# Format: HH:MM:SS
getTime=$(date "+%T")
	
# Format: DD.MM.YYYY HH:MM:SS
getDateTime=$(date "+%d.%m.%Y %T")

# Format: DD.MM.YYYY HH:MM:SS.Nanosekunden
# Beispiel: 2014-01-02 17:43:38.226981463
getDateTime=$(date "+%Y-%m-%d %T.%N")
	
# Dauer
startTime=$(date "+%s")
endTime=$(date "+%s")
runTime=$(echo $endTime - $startTime | bc)
Tags: Bash, Debian 9 Stretch, Linux, NTP
Durchschnittliche Bewertung: 0 (0 Abstimmungen)

Es ist möglich, diese FAQ zu kommentieren.