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 sudopython3verwendet.
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
Beispiel-IP anpassen:
timedatectlpython3 status- Interessant192.168.10.10 sind<<'PY'
vorimport allem:
- import
Systemipaddressclockimportsynchronizedsocket
NTPimportservicestruct
Timeimportzonesys
Wennlen(sys.argv) Bitte System!= clock2:
synchronized:print("FEHLER: yesangezeigtgenau 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
Die IP-Adressen in der ersten Zeile anpassen:
timedatectlfor timesync-statusip 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.
Typischeimport interessantestruct
Angabenimport sind:
- host
=Serverodersys.argv[1].strip()Servertry:Addressipaddress.ip_address(host)
Stratumexcept PollValueError:Intervalprint(f"FEHLER Packet{host}:CountKeine Offsetgültige
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.
3. Maschinenlesbare Ausgabe prüfen
timedatectl show-timesync --allDiese 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.serviceMögliche Ausgaben:
| |
| |
| |
|
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 liegtfounddaserscheint, Problemist wahrscheinlichPython beiauf DNSdiesem undSystem nicht direkt bei NTP.
6. Netzwerkroute prüfen
ip route get 1.1.1.1Damit 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
| Ergebnis | Bedeutung | |
|---|---|---|
|
Die |
|
|
||
|
||
|
||
|
Der angegebene Wert ist keine | gültige
Kurzfazit
MitWenn Debian-Standardtoolsbestimmte prüftIP-Adressen mangetestet NTPwerden amsollen, besten überreicht timedatectl status, timedatectl timesync-statusundnicht 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.