Motivation: Aufgrund eines Problems mit 2FA (2 Faktor-Authentifizierung) bei einem meiner Services (https://dockhand.pro/) habe ich festgestellt, dass die Uhr auf meinem RS so weit abweicht (ca 60s), dass die zeitgesteuerte 2FA nur "manchmal" funktioniert und ansonsten den sechsstelligen Code nicht akzeptiert (wenn die 30 Sekundenfenster soweit auseinanderliegen, dass auf meinem Authenticator (der die richtige Zeit hat) kein gültiger Code für die falsche Zeit auf dem RS angezeigt wird.
Natürlich will man NTP umsetzen. Dafür gibt es mehrere Optionen und man muss v.a. auch die NC Firewall konfigurieren (siehe unten). Dies betrifft sicherlich jegliche NTP Lösung, nicht nur die vorgeschlagene.
Daher habe ich mich mit https://claude.ai/ Code hingesetzt und eine Lösung gesucht. Es hat mir https://chrony-project.org/ als robuste und genauere Lösung vorgeschlagen, das vorhandene systemd-timesyncd wird bei Umsetzung deaktiviert.
Vielleicht wollt Ihr ja auch eine genaue(re) Uhrzeit auf Euerem Server haben
. Dann wäre hier das "Kochbuch", das mir Claude so schön übersichtlich geschrieben hat und das auch Claude Code vorgesetzt werden kann, um die Änderungen umsetzen zu lassen. Natürlich könnt Ihr die Schritte aber auch manuell umsetzen. Im Anhang das Markdown File für CC oder zur Ablage zum Download.
Ich habe feste Quell IP Adressen konfiguriert, da man in der Firewall (Screenshots unten) den QUELLport 123 aufmachen muss (ein Zielport geht nicht, da der Zielport zufällig ist). Und das will man natürlich nur für wenige, vertrauenswürdige IPs erlauben. Daher sind hier sind die PTB IPs und das Google NTP Netzwerk fest konfiguriert und weiter unten auch in der Firewall frei gegeben. Die typischen *.pool.ntp.org DNS Namen funktionieren hier nicht, da sich die IP Adressen dahinter ständig ändern.
# NTP-Synchronisierung mit Chrony einrichten
## Ziel
Systemuhr dauerhaft und automatisch per NTP synchronisieren, mit festen NTP-Servern (PTB + Google) statt des dynamischen NTP-Pools.
---
## 1. Installation
```bash
apt-get install -y chrony
```
`systemd-timesyncd` wird automatisch deaktiviert sobald chrony läuft — kein manuelles Eingreifen nötig.
---
## 2. Konfiguration
Datei `/etc/chrony/chrony.conf` anpassen. Den bestehenden `pool`-Eintrag ersetzen:
```bash
# Use Debian vendor zone. ← diese Zeile ersetzen:
pool 2.debian.pool.ntp.org iburst
```
Ersetzen durch:
```
# PTB (Physikalisch-Technische Bundesanstalt) - offizielle deutsche Zeitserver
server ptbtime1.ptb.de iburst
server ptbtime2.ptb.de iburst
server ptbtime3.ptb.de iburst
# Google NTP
pool time.google.com iburst
```
Außerdem `makestep` so setzen, dass ein Zeitsprung immer erlaubt ist (nicht nur beim Start):
```
# Vorher:
makestep 1 3
# Nachher:
makestep 1 -1
```
---
## 3. Dienst starten
```bash
systemctl enable --now chrony
systemctl status chrony
```
---
## 4. Synchronisierung prüfen
```bash
chronyc sources
```
Erwartete Ausgabe nach ca. 30–60 Sekunden — eine Quelle mit `*` markiert (= aktiv):
```
MS Name/IP address Stratum Poll Reach LastRx Last sample
===============================================================================
^- ptbtime3.ptb.de 1 6 17 23 -3731us
^* time3.google.com 1 6 77 23 +4622ns
^- time2.google.com 1 6 77 22 -1158us
```
Falls alle Quellen `?` zeigen → siehe Abschnitt **Firewall** weiter unten.
---
## 5. Zeitzone setzen (falls nötig)
```bash
timedatectl set-timezone Europe/Berlin
timedatectl status
```
---
## Hinweis: Hardware-Firewall
Wenn der Server hinter einer Hardware-Firewall steht, die **eingehenden Traffic blockiert**, funktioniert NTP möglicherweise nicht — auch wenn ausgehend alles offen ist.
**Warum:** NTP-Antworten kommen *eingehend* vom Server-Port 123 auf einen zufälligen Client-Port zurück. Eine stateless Firewall blockiert diese Antworten.
**Lösung: Firewall-Regel hinzufügen**
Inbound UDP erlauben für folgende Quell-IPs:
| Quelle | IPs / Netzwerk |
|--------|----------------|
| PTB (Deutschland) | `192.53.103.108`, `192.53.103.104`, `192.53.103.103` |
| Google NTP | `216.239.35.0/24` |
Regel: **Inbound UDP, Quellport 123, von den oben genannten IPs → erlaubt**
Nach dem Setzen der Firewall-Regel ggf. einen Burst erzwingen:
```bash
chronyc burst 4/4
sleep 30
chronyc sources
```
---
## Überprüfung nach Abschluss
```bash
timedatectl # System clock synchronized: yes
chronyc tracking # Stratum und Offset anzeigen
chronyc sources -v # Alle Quellen mit Details
```
Alles anzeigen
Und hier die Firewallkonfiguration:
| Beschreibung | Typ | Aktion | Protokoll | Source(s) (IPs / Netzwerke) | Source Port(s) | Destination(s) (IPs / Netzwerke) | Destination Port(s) | |
|---|---|---|---|---|---|---|---|---|
| 1 | 123 UDP eingehend | EINGEHEND | ACCEPT | UDP | 192.53.103.108, 192.53.103.104, 216.239.35.0/24, 192.53.103.103 | 123 | * | * |