Skip to main content

NTP Server abfragen und Netzwerk prüfen

NTP nutzt UDP Port 123. Ein normaler TCP-Portcheck ist daher nicht ausreichend. MitWenn Debian-Standardtoolsbestimmte kannNTP-Server manper vorIP-Adresse allemgetestet prüfen,werden obsollen, diemuss Zeitsynchronisierungeine desechte SystemsNTP-Anfrage funktioniert.an diese IP gesendet werden.


Keine Zusatzpakete notwendig

DieDer folgendenfolgende BefehleTest verwendenbenötigt Standardtools,keine diezusätzlichen NTP-Tools wie ntpdig, sntp oder ntpdate. Er verwendet nur python3, falls es auf einemdem System vorhanden ist.

Auf normalen Debian-SystemSystemen mit systemd vorhanden sind. Es wird nichts installiert und es wird keinist sudopython3 verwendet.

häufig

Wichtig:vorhanden. MitAuf diesensehr Standardtoolsminimalen kannSystemen manist normalerweisedas keineaber beliebigennicht garantiert. Ohne python3 oder ein NTP-ServerTool direktist einzelnein abfragen.sauberer Man prüft stattdessen, ob der lokale Zeitdienst erfolgreich mit einemdirekter NTP-ServerTest synchronisiert.gegen beliebige IP-Adressen nicht sinnvoll möglich.


1. ZeitstatusEinzelne desNTP-IP Systemstesten

prüfen

Beispiel-IP anpassen:

timedatectlpython3 status
-

Interessant192.168.10.10 sind<<'PY' vorimport allem:

datetime
    import
  • Systemipaddress clockimport synchronized
  • socket
  • NTPimport service
  • struct
  • Timeimport zone
  • sys
if

Wennlen(sys.argv) System!= clock2: synchronized:print("FEHLER: yesBitte angezeigtgenau wird,eine funktioniertIP-Adresse angeben.") sys.exit(2) host = sys.argv[1].strip() try: ipaddress.ip_address(host) except ValueError: print(f"FEHLER {host}: Keine gültige IP-Adresse.") sys.exit(2) packet = bytearray(48) packet[0] = 0x23 try: infos = socket.getaddrinfo(host, 123, type=socket.SOCK_DGRAM) family, socktype, proto, _, sockaddr = infos[0] with socket.socket(family, socktype, proto) as sock: sock.settimeout(3) sock.sendto(packet, sockaddr) data, addr = sock.recvfrom(512) if len(data) < 48: print(f"FEHLER {host}: Antwort zu kurz, keine gültige NTP-Antwort.") sys.exit(1) stratum = data[1] tx_seconds, tx_fraction = struct.unpack("!II", data[40:48]) unix_time = tx_seconds - 2208988800 + tx_fraction / 2**32 server_time = datetime.datetime.fromtimestamp(unix_time, datetime.timezone.utc) if stratum == 0: print(f"WARNUNG {host}: Antwort erhalten, aber Stratum 0. Server lehnt die ZeitsynchronisierungAnfrage grundsätzlich.möglicherweise Wennab.") dortelse: noprint(f"OK {host}: NTP-Antwort erhalten, Stratum {stratum}, Serverzeit {server_time.isoformat()}") except socket.timeout: print(f"FEHLER {host}: Timeout. Keine NTP-Antwort über UDP Port 123.") sys.exit(1) except OSError as e: print(f"FEHLER {host}: Netzwerkfehler: {e}") sys.exit(1) PY steht, kommt aktuell keine erfolgreiche Synchronisierung zustande.


2. Mehrere NTP-SynchronisierungIPs genauertesten

prüfen

Die IP-Adressen in der ersten Zeile anpassen:

timedatectlfor timesync-status
ip

Dieserin Befehl192.168.10.10 zeigt,192.168.10.11 mit192.168.10.12; welchemdo Zeitserverpython3 das- System"$ip" synchronisiert<<'PY' undimport obdatetime Antwortenimport vomipaddress NTP-Serverimport kommen.

socket

Typischeimport interessantestruct Angabenimport sind:

sys
    host
  • Server= odersys.argv[1].strip() Servertry: Address
  • ipaddress.ip_address(host)
  • Stratum
  • except
  • PollValueError: Interval
  • print(f"FEHLER
  • Packet{host}: Count
  • Keine
  • Offset
  • gültige
IP-Adresse.")

Wennsys.exit(2) einpacket Server,= Stratum-Wertbytearray(48) undpacket[0] Paketinformationen= angezeigt0x23 werden,try: kommeninfos NTP-Antworten= an.socket.getaddrinfo(host, Wenn123, type=socket.SOCK_DGRAM) family, socktype, proto, _, sockaddr = infos[0] with socket.socket(family, socktype, proto) as sock: sock.settimeout(3) sock.sendto(packet, sockaddr) data, addr = sock.recvfrom(512) if len(data) < 48: print(f"FEHLER {host}: Antwort zu kurz, keine Serverdatengültige oderNTP-Antwort.") Fehlersys.exit(1) angezeigtstratum werden,= istdata[1] NTPtx_seconds, tx_fraction = struct.unpack("!II", data[40:48]) unix_time = tx_seconds - 2208988800 + tx_fraction / 2**32 server_time = datetime.datetime.fromtimestamp(unix_time, datetime.timezone.utc) if stratum == 0: print(f"WARNUNG {host}: Antwort erhalten, aber Stratum 0. Server lehnt die Anfrage möglicherweise nichtab.") aktivelse: oderprint(f"OK {host}: NTP-Antwort erhalten, Stratum {stratum}, Serverzeit {server_time.isoformat()}") except socket.timeout: print(f"FEHLER {host}: Timeout. Keine NTP-Antwort über UDP Port 123123.") wirdexcept blockiert.

OSError as e: print(f"FEHLER {host}: Netzwerkfehler: {e}") PY done

3. Maschinenlesbare Ausgabe prüfen

timedatectl show-timesync --all

Diese Ausgabe ist nützlich, wenn man gezielt Werte prüfen oder dokumentieren möchte.

Interessant sind zum Beispiel:

  • ServerName=
  • ServerAddress=
  • RootDistanceMaxUSec=
  • PollIntervalUSec=
  • NTPMessage=

4. Prüfen, ob systemd-timesyncdPython läuftvorhanden ist

systemctlpython3 is-active systemd-timesyncd.service

Mögliche Ausgaben:

AusgabeBedeutung
activeDer Zeitdienst läuft.
inactiveDer Zeitdienst läuft aktuell nicht.
failedDer Zeitdienst ist fehlgeschlagen.
unknownDer Dienst ist nicht vorhanden oder nicht bekannt.

5. DNS separat prüfen

getent ahosts pool.ntp.org--version

Wenn hiereine IP-AdressenVersionsnummer angezeigt werden,wird, funktioniertkann dieder Namensauflösung.Test verwendet werden. Wenn keinepython3: IP-Adressecommand zurückkommt,not liegtfound daserscheint, Problemist wahrscheinlichPython beiauf DNSdiesem undSystem nicht direkt bei NTP.


6. Netzwerkroute prüfen

ip route get 1.1.1.1

Damit kann geprüft werden, ob das System grundsätzlich eine Route ins Netzwerk oder Internet hat. Das prüft aber nicht direkt NTP, sondern nur die allgemeine Erreichbarkeit über die Routing-Tabelle.installiert.


Warum nicht curl oder wget?

curl und wget eignenkönnen sich nicht fürkeine echte NTP-Abfragen.Abfrage Beide sind für HTTP, HTTPS, FTP und ähnliche URL-basierte Protokolle gedacht.machen. NTP läuft aber über UDP Port 123., nicht über HTTP oder HTTPS.

Man kann mitMit curl oder wget höchstenskann man nur prüfen, ob HTTP/HTTPS und DNS grundsätzlich funktionieren:funktioniert:

curl -I https://www.debian.org
wget --spider https://www.debian.org

DieseDas Tests sagensagt aber nichts Sicheres darüber aus, ob NTP über UDP Port 123 erlaubt ist. Denn natürlich kann Netzwerkdiagnose nicht einfach mal logisch sein.


Warum nicht nur Bash mit /dev/udp?

Bash kann zwar Daten an /dev/udp/IP/PORT senden, aber UDP hat keinen Verbindungsaufbau wie TCP. Nur weil ein UDP-Paket gesendet wurde, weiß man noch nicht, ob ein NTP-Server geantwortet hat.

Für einen brauchbaren Test muss eine echte NTP-Anfrage gesendet und die Antwort ausgewertet werden. Genau das macht der Python-Test oben.


Ergebnis bewerten

liefertgültige
Ergebnis Bedeutung
SystemOK clock... synchronized:NTP-Antwort yeserhalten Die SystemzeitIP-Adresse wirdantwortet erfolgreichauf synchronisiert.NTP über UDP Port 123.
timedatectlWARNUNG timesync-status... Stratum 0 zeigt Serverdaten NTP-AntwortenDer kommenServer grundsätzlichhat an.geantwortet, lehnt die Anfrage aber möglicherweise ab oder liefert keine nutzbare Zeit.
System clock synchronized: noTimeout AktuellKeine keineAntwort erfolgreicheerhalten. Zeitsynchronisierung.UDP Port 123 wird möglicherweise blockiert oder der Server antwortet nicht.
systemd-timesyncd.service ist inactive oder failedNetzwerkfehler DerEs lokalegibt Zeitdienstein läuftlokales nichtNetzwerkproblem, korrekt.Routingproblem oder ein Problem mit der Adresse.
getentKeine ahostsgültige IP-Adresse Der angegebene Wert ist keine IP-Adresse DNS-AuflösungIPv4- funktioniertoder nicht.IPv6-Adresse.

Kurzfazit

MitWenn Debian-Standardtoolsbestimmte prüftIP-Adressen mangetestet NTPwerden amsollen, besten überreicht timedatectl status, timedatectl timesync-status undnicht timedatectlaus. show-timesync --all. Wenn dort ein aktiver Server und erfolgreiche Synchronisierung angezeigt werden, funktionieren NTP-Abfragen aus dem Netzwerk grundsätzlich.

Für eineeinen direktedirekten Einzelabfrage gegen beliebige NTP-ServerTest braucht man entweder ein zusätzliches NTP-WerkzeugTool wie ntpdig oder einen kleinen UDP-NTP-Test wie oben mit python3.

Ohne solchepython3, Zusatztoolsntpdig, sntp oder ntpdate ist nurein diesauberer Prüfungdirekter überNTP-Test dengegen vorhandenenbeliebige System-ZeitdienstIP-Adressen nicht realistisch möglich.