Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung |
linux:ntp [21.02.2024 22:03. ] – [Firewalld - Paketfilter] django | linux:ntp [03.07.2024 19:56. ] (aktuell) – [Rolle] django |
---|
| {{htmlmetatags>metatag-robots=() |
| metatag-keywords=(Ansible,Arch Linux,ntp, chrony, timeserver,stratum,chronyc,chronyd) |
| metatag-description=(NTP-Zeitserver mit chrony unter Arch Linux einrichten und nutzen) |
| }} |
====== NTP-Zeitserver mit chrony unter Linux einrichten und nutzen ====== | ====== NTP-Zeitserver mit chrony unter Linux einrichten und nutzen ====== |
{{:linux:hourglass.png?nolink&100 |Bild: stilisierte Sanduhr}} Basis für eine zuverlässige Kommunikation zwischen netzwerkbasierten Diensten und Servern ist unter anderem eine exakte Zeitmessung. Nur so kann gewährleistet werden das Systemkomponenten wie z.B. systemd-Timer und Cronjobs zur richtigen Zeit gestartet werden und laufen. Einzelne Systeme können mit Hilfe des **N**etwork **T**ime **P**rotocol kurz **NTP** ihre Systemzeiten mit einem zentralen Zeitserver oder einem Pool von Servern zu synchronisieren. NTP wurde 1985 von David L. Mills entwickelt und wurde als [[https://tools.ietf.org/html/rfc958|RFC 958]] definiert um eine zuverlässige Zeitgabe über Netzwerke mit variabler Paketlaufzeit über das verbindungslose Protokolls **UDP** zu ermöglichen und bekam von der Internet Assigned Numbers Authority den UDP-Ports **123** zugewiesen. Das **RFC958** wurde in den letzten Jahren mehrfach überarbeitet und ergänzt und wurde letztmalig mit **[[https://www.rfc-editor.org/rfc/rfc9109|RFC 9109 - Network Time Protocol Version 4: Port Randomization]]** ergänzt. | {{:linux:hourglass.png?nolink&100 |Bild: stilisierte Sanduhr}} Basis für eine zuverlässige Kommunikation zwischen netzwerkbasierten Diensten und Servern ist unter anderem eine exakte Zeitmessung. Nur so kann gewährleistet werden das Systemkomponenten wie z.B. systemd-Timer und Cronjobs zur richtigen Zeit gestartet werden und laufen. Einzelne Systeme können mit Hilfe des **N**etwork **T**ime **P**rotocol kurz **NTP** ihre Systemzeiten mit einem zentralen Zeitserver oder einem Pool von Servern zu synchronisieren. NTP wurde 1985 von David L. Mills entwickelt und wurde als [[https://tools.ietf.org/html/rfc958|RFC 958]] definiert um eine zuverlässige Zeitgabe über Netzwerke mit variabler Paketlaufzeit über das verbindungslose Protokolls **UDP** zu ermöglichen und bekam von der Internet Assigned Numbers Authority den UDP-Ports **123** zugewiesen. Das **RFC958** wurde in den letzten Jahren mehrfach überarbeitet und ergänzt und wurde letztmalig mit **[[https://www.rfc-editor.org/rfc/rfc9109|RFC 9109 - Network Time Protocol Version 4: Port Randomization]]** ergänzt. |
==== Chrony unter Arch Linux installieren ==== | ==== Chrony unter Arch Linux installieren ==== |
Bei der Installation des chrony-Paketes verwenden wir unter **[[https://archlinux.org/|Arch Linux]]** den Paketmanager **''pacman''**. | Bei der Installation des chrony-Paketes verwenden wir unter **[[https://archlinux.org/|Arch Linux]]** den Paketmanager **''pacman''**. |
- Als User: <code> $ sudo pacman -S chrony -y </code> | - Als User: <code> $ sudo pacman -S chrony</code> |
- Als Nutzer mit Root-Rechten entsprechend: <code> $ sudo pacman -S chrony -y </code> | - Als Nutzer mit Root-Rechten entsprechend: <code> # pacman -S chrony</code> |
| |
===== Paketinhalt ===== | ===== Paketinhalt ===== |
++++ | ++++ |
===== Dokumentation ===== | ===== Dokumentation ===== |
Eine ausführliche Onlinedokumentation des Chrony Projekts findet sich auf der entsprechnden Projektseite → https://chrony-project.org/documentation.html Bei der Installation des aktuellen chrony-Paketes z.B. unter Arch Linux finden sich im Verzeichnis **''/usr/share/doc/chrony/''** auch entsprechende FAQs, READMEs, NEWS und Beispiele. | Eine ausführliche Onlinedokumentation des Chrony Projekts findet sich auf der entsprechenden Projektseite → https://chrony-project.org/documentation.html Bei der Installation des aktuellen chrony-Paketes z.B. unter Arch Linux finden sich im Verzeichnis **''/usr/share/doc/chrony/''** auch entsprechende FAQs, READMEs, NEWS und Beispiele. |
# tree /usr/share/doc/chrony/ | # tree /usr/share/doc/chrony/ |
<code>/usr/share/doc/chrony// | <code>/usr/share/doc/chrony// |
| |
# Django : 2024-02-18 | # Django : 2024-02-18 |
server pool.ntp.org iburst | pool pool.ntp.org iburst |
| |
####################################################################### | ####################################################################### |
Die relevanten KOnfigurationsoptionen können wir mit Hilfe von **''grep''** uns auch gerafft anzeigen lassen. | Die relevanten KOnfigurationsoptionen können wir mit Hilfe von **''grep''** uns auch gerafft anzeigen lassen. |
# grep -Ev '(^%|^$|^#|^!|^;)' /etc/chrony.conf | # grep -Ev '(^%|^$|^#|^!|^;)' /etc/chrony.conf |
<code>server pool.ntp.org iburst | <code>pool pool.ntp.org iburst |
driftfile /var/lib/chrony/drift | driftfile /var/lib/chrony/drift |
ntsdumpdir /var/lib/chrony | ntsdumpdir /var/lib/chrony |
MS Name/IP address Stratum Poll Reach LastRx Last sample | MS Name/IP address Stratum Poll Reach LastRx Last sample |
=============================================================================== | =============================================================================== |
^* defiant.tlercher.de 2 10 377 96 +59us[ +988us] +/- 10ms</code> | ^+ time.cnetm.de 2 6 377 7 +755us[ +755us] +/- 17ms |
| ^- frank.askja.de 2 6 377 5 -166us[ -166us] +/- 59ms |
| ^* ntp1.noris.net 2 6 377 72 -154us[ -125us] +/- 12ms |
| ^+ sv1.ggsrv.de 2 6 377 5 +284us[ +284us] +/- 15ms |
| </code> |
| |
Dieses Beispiel zeigt die Abfrage auf unserem zentralen NTP-Server, den wir gerade eingerichtet haben. Nachfolgendes Beispiel zeigt einen Host, der wiederum unseren eigenen zentralen NTP-Server als Quelle benutzt. | Dieses Beispiel zeigt die Abfrage auf unserem zentralen NTP-Server, den wir gerade eingerichtet haben. Nachfolgendes Beispiel zeigt einen Host, der wiederum unseren eigenen zentralen NTP-Server als Quelle benutzt. |
| |
chronyc> sources -v | chronyc> sources -v |
<code> .-- Source mode '^' = server, '=' = peer, '#' = local clock. | <code> |
| .-- Source mode '^' = server, '=' = peer, '#' = local clock. |
/ .- Source state '*' = current best, '+' = combined, '-' = not combined, | / .- Source state '*' = current best, '+' = combined, '-' = not combined, |
| / 'x' = may be in error, '~' = too variable, '?' = unusable. | | / 'x' = may be in error, '~' = too variable, '?' = unusable. |
MS Name/IP address Stratum Poll Reach LastRx Last sample | MS Name/IP address Stratum Poll Reach LastRx Last sample |
=============================================================================== | =============================================================================== |
^* defiant.tlercher.de 2 10 377 246 +59us[ +988us] +/- 10ms | ^+ time.cnetm.de 2 6 377 7 +755us[ +755us] +/- 17ms |
| ^- frank.askja.de 2 6 377 5 -166us[ -166us] +/- 59ms |
| ^* ntp1.noris.net 2 6 377 72 -154us[ -125us] +/- 12ms |
| ^+ sv1.ggsrv.de 2 6 377 5 +284us[ +284us] +/- 15ms |
</code> | </code> |
| |
<code>Name/IP Address NP NR Span Frequency Freq Skew Offset Std Dev | <code>Name/IP Address NP NR Span Frequency Freq Skew Offset Std Dev |
============================================================================== | ============================================================================== |
defiant.tlercher.de 6 5 86m +0.279 0.359 +87us 188us</code> | time.cnetm.de 16 11 782 -0.042 1.299 -35us 292us |
| frank.askja.de 16 9 783 +0.281 0.379 +169us 99us |
| ntp1.noris.net 6 4 452 -0.529 0.977 -304us 43us |
| sv1.ggsrv.de 14 8 784 +0.211 0.264 +434us 70us</code> |
| |
Mit der Option **''-v''** erhalten wir eine Kurzbeschreibung der angezeigten Werte. | Mit der Option **''-v''** erhalten wir eine Kurzbeschreibung der angezeigten Werte. |
Name/IP Address NP NR Span Frequency Freq Skew Offset Std Dev | Name/IP Address NP NR Span Frequency Freq Skew Offset Std Dev |
============================================================================== | ============================================================================== |
defiant.tlercher.de 6 5 86m +0.279 0.359 +95us 188us | time.cnetm.de 16 11 782 -0.042 1.299 -37us 292us |
| frank.askja.de 16 9 783 +0.281 0.379 +178us 99us |
| ntp1.noris.net 6 4 452 -0.529 0.977 -320us 43us |
| sv1.ggsrv.de 14 8 784 +0.211 0.264 +440us 70us |
</code> | </code> |
| |
# chronyc tracking | # chronyc tracking |
| |
<code>Reference ID : C3C98961 (defiant.tlercher.de) | <code>Reference ID : 3E800112 (ntp1.noris.net) |
Stratum : 3 | Stratum : 3 |
Ref time (UTC) : Wed Feb 21 17:44:33 2024 | Ref time (UTC) : Thu Feb 22 12:24:14 2024 |
System time : 0.000000083 seconds slow of NTP time | System time : 0.000030264 seconds slow of NTP time |
Last offset : +0.000929279 seconds | Last offset : +0.000049906 seconds |
RMS offset : 0.000310979 seconds | RMS offset : 0.000355495 seconds |
Frequency : 23.866 ppm fast | Frequency : 23.667 ppm fast |
Residual freq : +0.279 ppm | Residual freq : +0.017 ppm |
Skew : 0.179 ppm | Skew : 0.322 ppm |
Root delay : 0.019519085 seconds | Root delay : 0.016084936 seconds |
Root dispersion : 0.001197367 seconds | Root dispersion : 0.002525240 seconds |
Update interval : 1025.2 seconds | Update interval : 64.5 seconds |
Leap status : Normal</code> | Leap status : Normal</code> |
| |
| |
===== Orchestrierung - Installation und Konfiguration des chronyd mit Hilfe von Ansible ===== | ===== Orchestrierung - Installation und Konfiguration des chronyd mit Hilfe von Ansible ===== |
Natürlich wird man im Jahr 2024 nicht mehr ernsthaft, manuell Server aufsetzen und betreiben wollen. Vielmehr wird amn auf ein Orchestrierungswerkzeug wie z.B. **[[linux:ansible:start|Ansible]]** zurückgreifen. | Natürlich wird man im Jahr 2024 nicht mehr ernsthaft, manuell Server aufsetzen und betreiben wollen. Vielmehr wird man auf ein Orchestrierungswerkzeug wie z.B. **[[linux:ansible:start|Ansible]]** zurückgreifen. |
| |
Wir werden uns nun nachfolgend sowohl die Client- wie auch die Server-Installation und -konfiguration genauer betrachten. | Wir werden uns nun nachfolgend sowohl die Client- wie auch die Server-Installation und -konfiguration genauer betrachten. |
| |
==== Installation und Client-Konfiguration ==== | ==== Installation und Client-Konfiguration ==== |
Setzen wir einen neue virtuellen Host unter Arch Linux neu auf, oder wollen wir bei einem bestehenden Host die Konfiguration aktualisieren, verwenden wir wie zuvor schon angeschnitten **[[https://www.ansible.com/|Ansible]]** als Orchstrierungswerkzeug. So ist sichergestellt dass zum einen all unsere Hosts entsprechend gleich aufgebaut, konfiguriert und betrieben werden. | Setzen wir einen neue virtuellen Host unter Arch Linux neu auf, oder wollen wir bei einem bestehenden Host die Konfiguration aktualisieren, verwenden wir wie zuvor schon angeschnitten **[[https://www.ansible.com/|Ansible]]** als Orchestrierungswerkzeug. So ist sichergestellt dass zum einen all unsere Hosts entsprechend gleich aufgebaut, konfiguriert und betrieben werden. |
| |
=== Rolle === | === Rolle === |
└── vars</code> | └── vars</code> |
| |
Wie wir sehen ist die Rolle durchaus überschaubar, im Task **''main.yaml''** verweisen wir lediglich auf den eigentlichen Task **''chrony-.yml''**. | Wie wir sehen ist die Rolle durchaus überschaubar, im Task **''main.yaml''** verweisen wir lediglich auf den eigentlichen Task **''chrony.yml''**. |
$ vim ~/ansible/roles/chrony_client/tasks/main.yml | $ vim ~/ansible/roles/chrony_client/tasks/main.yml |
<file yaml roles/chrony_client/tasks/main.yml>--- # Playbook/Rolle zur Konfiguration des NTP-Clients | <file yaml roles/chrony_client/tasks/main.yml>--- # Playbook/Rolle zur Konfiguration des NTP-Clients |
<font style="color: rgb(0, 0, 0)">[19:32:39] ↳ chrony: Sofern bereits eine Backupdatei der chrony.conf existiert, diese rücksichern.</font> | <font style="color: rgb(0, 0, 0)">[19:32:39] ↳ chrony: Sofern bereits eine Backupdatei der chrony.conf existiert, diese rücksichern.</font> |
<font style="color: rgb(196, 160, 0)">↳ vml000210 | CHANGED | 661ms</font> | <font style="color: rgb(196, 160, 0)">↳ vml000210 | CHANGED | 661ms</font> |
| <font style="color: rgb(0, 0, 0)">[19:32:40] ↳ chrony: Backupdatei der chrony.conf Konfigurationsdatei erstellen.</font> |
<font style="color: rgb(43, 100, 164)">vml000210 | SKIPPED | 31ms</font> | <font style="color: rgb(43, 100, 164)">vml000210 | SKIPPED | 31ms</font> |
<font style="color: rgb(0, 0, 0)">[19:32:40] ↳ chrony: Änderungen an der chrony.conf mit blockinfile vornehmen.</font> | <font style="color: rgb(0, 0, 0)">[19:32:40] ↳ chrony: Änderungen an der chrony.conf mit blockinfile vornehmen.</font> |
$ vim ~/ansible/roles/chrony_firewalld/tasks/config.yml | $ vim ~/ansible/roles/chrony_firewalld/tasks/config.yml |
| |
<file yaml roles/chrony_firewalld/tasks/config.yml>--- # YAML Start | <file yaml roles/chrony_firewalld/tasks/config.yml>-- # YAML Start |
# Firewall Daemon Regeln für chrony im Daemon-Mode konfigurieren. | # Firewall Daemon Regeln für chrony im Daemon-Mode konfigurieren. |
| |
destination address={{ guest_ip4_1 }}/32 | destination address={{ guest_ip4_1 }}/32 |
accept | accept |
zone: idmz | zone: '{{ guest_zone_1 }}' |
immediate: true | immediate: true |
permanent: true | permanent: true |
destination address={{ guest_ip6_ls_1 }}{{ guest_mask6_1 }} | destination address={{ guest_ip6_ls_1 }}{{ guest_mask6_1 }} |
accept | accept |
zone: idmz | zone: '{{ guest_zone_1 }}' |
immediate: true | immediate: true |
permanent: true | permanent: true |
destination address={{ guest_ip6_gs_1 }}{{ guest_mask6_1 }} | destination address={{ guest_ip6_gs_1 }}{{ guest_mask6_1 }} |
accept | accept |
zone: idmz | zone: '{{ guest_zone_1 }}' |
immediate: true | immediate: true |
permanent: true | permanent: true |
destination address={{ guest_ip4_2 }}/32 | destination address={{ guest_ip4_2 }}/32 |
accept | accept |
zone: intra | zone: '{{ guest_zone_2 }}' |
immediate: true | immediate: true |
permanent: true | permanent: true |
destination address={{ guest_ip6_ls_2 }}{{ guest_mask6_2 }} | destination address={{ guest_ip6_ls_2 }}{{ guest_mask6_2 }} |
accept | accept |
zone: intra | zone: '{{ guest_zone_2 }}' |
immediate: true | immediate: true |
permanent: true | permanent: true |
destination address={{ guest_ip6_gs_2 }}{{ guest_mask6_2 }} | destination address={{ guest_ip6_gs_2 }}{{ guest_mask6_2 }} |
accept | accept |
zone: intra | zone: '{{ guest_zone_2 }}' |
immediate: true | immediate: true |
permanent: true | permanent: true |
guest_dns6_2: | guest_dns6_2: |
</file> | </file> |
| |
| === Playbook === |
| Die definierte Rollen **chrony_client** und **chrony_firewalld** binden wird dann z.B. in das Playbook für die Installation und Konfiguration des **chrony**-Daemon im **Server-Mode** ein. |
| # vim playbooks/arch_chrony_server.yml |
| <file yaml playbooks/arch_chrony_server.yml>--- |
| # Ansible Playbook zum Konfigurieren des Chrony-Daemon im Server-Modus unter Arch-Linux. |
| # Aufruf via $ ansible-playbook playbooks/arch_chrony_client.yml : |
| # $ ansible-playbook playbooks/arch_chrony_server.yml |
| # für einen Host aus der Hostgruppe DMZ. |
| |
| - name: arch_chrony_server.yml # Name des Playbooks |
| hosts: vml010110 # Hostgruppe für die das Playbook gelten soll |
| |
| roles: |
| - role: chrony_client # Chrony-Client installieren und konfigurieren |
| tags: chrony_client # Tag-Kennzeichnung der definierten Rolle |
| - role: chrony_firewalld # Paketfilter-Regeln für Chrony-Server anlegen |
| tags: chrony_firewalld # Tag-Kennzeichnung der definierten Rolle |
| ... |
| </file> |
| |
| === Playbooklauf === |
| Die orchestrierte Variante der Installation und Konfiguration unseres **chrony**-Daemon im **Server-Mode** gestaltet sich ab sofort sehr einfach, brauchen wir doch lediglich die Konfigurationswerte im Inventory zu hinterlegen und zu pflegen und letztendlich das Playbook entsprechend aufzurufen: |
| $ ansible-playbook playbooks/arch_chrony_server.yml |
| |
| <html><pre class="code"> |
| <font style="color: rgb(0, 0, 0)">[23:10:06] Gathering Facts</font> |
| <font style="color: rgb(25, 100, 5)">↳ vml010110 | SUCCESS | 1.79s</font> |
| <font style="color: rgb(0, 0, 0)">[23:10:08] chrony_client : include_tasks</font> |
| <font style="color: rgb(25, 100, 5)">↳ vml010110 | SUCCESS | 24ms</font> |
| <font style="color: rgb(0, 0, 0)">[23:10:08] ↳ chrony: Installation des chrony-Daemons.</font> |
| <font style="color: rgb(25, 100, 5)">↳ vml010110 | SUCCESS | 1.34s</font> |
| <font style="color: rgb(0, 0, 0)">[23:10:10] ↳ chrony: Checken ob es bereits eine Backupdatei der chrony.conf gibt.</font> |
| <font style="color: rgb(25, 100, 5)">↳ vml010110 | SUCCESS | 679ms</font> |
| <font style="color: rgb(0, 0, 0)">[23:10:10] ↳ chrony: Sofern bereits eine Backupdatei der chrony.conf existiert, diese rücksichern.</font> |
| <font style="color: rgb(196, 160, 0)">↳ vml010110 | CHANGED | 626ms</font> |
| <font style="color: rgb(0, 0, 0)">[23:10:11] ↳ chrony: Backupdatei der chrony.conf Konfigurationsdatei erstellen. |
| <font style="color: rgb(43, 100, 164)">vml010110 | SKIPPED | 36ms</font> |
| <font style="color: rgb(0, 0, 0)">[23:10:11] ↳ chrony: Änderungen an der chrony.conf mit blockinfile vornehmen.</font> |
| <font style="color: rgb(196, 160, 0)">↳ vml010110 | CHANGED | 607ms</font> |
| <font style="color: rgb(0, 0, 0)">[23:10:12] ↳ chrony: Änderungen an der chrony.conf mit lineinfile vornehmen.</font> |
| <font style="color: rgb(196, 160, 0)">↳ vml010110 | CHANGED | 3.97s</font> |
| <font style="color: rgb(0, 0, 0)">[23:10:16] ↳ chrony: Sicherstellen, dass der chrony Service reboot(-fest) startet.</font> |
| <font style="color: rgb(25, 100, 5)">↳ vml010110 | SUCCESS | 984ms</font> |
| <font style="color: rgb(0, 0, 0)">[23:10:17] chrony_firewalld : include_tasks</font> |
| <font style="color: rgb(25, 100, 5)">↳ vml010110 | SUCCESS | 36ms</font> |
| <font style="color: rgb(0, 0, 0)">[23:10:17] ↳ config: Port 123/UDP für IPv4 in der Zone IDMZ freischalten.</font> |
| <font style="color: rgb(196, 160, 0)">↳ vml010110 | CHANGED | 848ms</font> |
| <font style="color: rgb(0, 0, 0)">[23:10:17] ↳ config: Port 123/UDP für IPv6 (ULA) in der Zone IDMZ freischalten.</font> |
| <font style="color: rgb(196, 160, 0)">↳ vml010110 | CHANGED | 7276ms</font> |
| <font style="color: rgb(0, 0, 0)">[23:10:18] ↳ config: Port 123/UDP für IPv6 (Global-Scope) in der Zone IDMZ freischalten.</font> |
| <font style="color: rgb(196, 160, 0)">↳ vml010110 | CHANGED | 697ms</font> |
| <font style="color: rgb(0, 0, 0)">[23:10:19] ↳ config: Port 123/UDP für IPv4 in der Zone INTRA freischalten.</font> |
| <font style="color: rgb(196, 160, 0)">↳ vml010110 | CHANGED | 798ms</font> |
| <font style="color: rgb(0, 0, 0)">[23:10:20] ↳ config: Port 123/UDP für IPv6 (ULA) in der Zone INTRA freischalten.</font> |
| <font style="color: rgb(196, 160, 0)">↳ vml010110 | CHANGED | 774ms</font> |
| <font style="color: rgb(0, 0, 0)">[23:10:20] ↳ config: Port 123/UDP für IPv6 (Global-Scope) in der Zone INTRA freischalten.</font> |
| <font style="color: rgb(196, 160, 0)">↳ vml010110 | CHANGED | 804ms</font> |
| <font style="color: rgb(0, 0, 0)">[23:10:21] ↳ config: Regeländerungen auf vml000110 neu laden.</font> |
| <font style="color: rgb(196, 160, 0)">↳ vml010110 | CHANGED | 1.02s</font> |
| <font style="color: rgb(0, 0, 0)">[23:10:22] system</font> |
| <font style="color: rgb(25, 100, 5)">-- Play recap --</font> |
| <font style="color: rgb(196, 160, 0)">vml010110 </font><font style="color: rgb(0, 0, 0)">: </font><font style="color: rgb(25, 100, 5)">ok=16 </font><font style="color: rgb(196, 160, 0)">changed=10 </font>unreachable=0 failed=0 <font style="color: rgb(43, 100, 164)">skipped=1</font> rescued=0 ignored=0</font> |
| </pre> |
| </html> |
| |
| ====== Links ====== |
| * Zurück zu **[[wiki:start|Projekte und Themenkapitel]]** |
| * Zurück zu **[[centos:start|LINUX Installation und Konfiguration]]** |
| * Zurück zu **[[linux:ansible:start|Zurück zur "Ansible"-Übersicht"]]** |
| * Zurück zur **[[http://dokuwiki.nausch.org/doku.php/|Startseite]]** |
| |