NTP1) permet de distribuer l'heure sur le réseau. L'heure du système impacte le fonctionnement de nombreux services. Une heure locale fortement décalée peut perturber/interrompre le fonctionnement normal de certains services notamment:
Le système est pyramidal pour éviter la surcharge des serveurs. Les sources sont de niveau 0 (strate), Chaque serveur est configuré sur un serveur parent
$ sudo apt-get install ntp
Le protocole NTP communique en UDP sur le port 123 pour se synchroniser avec les serveurs distants.
La configuration du serveur se fait via /etc/ntp.conf. Ici on définit les serveurs de référence:
server 0.fr.pool.ntp.org server 1.fr.pool.ntp.org server 2.fr.pool.ntp.org server 3.fr.pool.ntp.org #server 4.ntp.exemple iburst
Une machine peut être à la fois serveur de temps et cliente de son propre service, dans ce cas ntpd assure le service et ntpdate le rôle de client.
La configuration du client ntp se fait via /etc/ntpdate.conf
Après modification du fichier de configuration, redémarrer le service ntp à l'aide de la commande service:
$ sudo service ntp restart
Pour vérifier l'état du serveur NTP:
ss -nlpu
La commande ntpq (NTPQuery) permet d'afficher la liste des serveurs distants
$ ntpq -p
L'option -p permet de lister les serveurs pairs.
Si le serveur écoute sur toutes les interfaces, vérifier la présence de la directive interface:
interface listen lan
Le daemon ntpd resynchronise progressivement le temps du système local par rapport au temps de référence. Si un gros écart est constaté, on peut utiliser l'utilitaire ntpdate qui se chargera de resynchroniser directement le temps du système local.
[root@www etc]# ntpdate 192.9.200.9 24 Apr 17:31:57 ntpdate[9183]: the NTP socket is in use, exiting
Pour resynchroniser directement le système, arrêter le daemon ntpd, faire la synchronisation en invoquant ntpdate et relancer le daemon :
[root@www etc]# /etc/init.d/ntpd stop Arrêt de ntpd : [ OK ] [root@www etc]# ntpdate ntp-server.domain 24 Apr 17:46:23 ntpdate[12874]: step time server ntp-server.domain offset 499.818895 sec [root@www etc]# /etc/init.d/ntpd start Démarrage de ntpd : [ OK ]
Pour tester la communication avec le serveur depuis le bash, on peut installer le client sntp:
# installation du client sudo apt-install sntp # test de connexion au serveur sntp server.fqdn
Toute requête vers le serveur retourne le message:
sntp 4.2.8p12@1.3728-o (1)
Can't open KOD db file /var/lib/sntp/kod for writing: Permission denied
sock_cb: 192.168.33.254 not in sync, skipping this server
Le client n'utilise pas le serveur car celui-ci n'est pas correctement synchronisé. Revoir les paramétrages du serveur.
sntp ntp.phobos.lan
sntp 4.2.8p12@1.3728-o (1)
Can't open KOD db file /var/lib/sntp/kod for writing: Permission denied
2022-01-06 19:35:32.058110 (-0100) +0.906487 +/- 0.678315 ntp.phobos.lan 192.168.33.254 s4 no-leap
systemd intègre un client sntp, voir le wiki synchronisation du temps par systemd.
Si l'on souhaite contrôler précisément le trafic NTP au travers d'un pare-feu restrictif, il est possible de créer des règles exploitant les ensembles (ipsets).
création d'un ensemble ipset
# création de l'ensemble ipset create set_ntp_servers hash:ip maxelem 64 # peuplement de l'ensemble avec les adresses des serveurs dig +short 0.fr.pool.ntp.org | xargs --max-args=1 ipset add set_ntp_servers dig +short 1.fr.pool.ntp.org | xargs --max-args=1 ipset add set_ntp_servers dig +short 2.fr.pool.ntp.org | xargs --max-args=1 ipset add set_ntp_servers dig +short 3.fr.pool.ntp.org | xargs --max-args=1 ipset add set_ntp_servers
Création/test des règles netfilter
# Journalise le trafic NTP sortant iptables -A ufw-after-output -o wan -m set --match-set set_ntp_servers dst -p udp --dport 123 -j ufw-logging-allow # Autorise le trafic NTP sortant iptables -A ufw-after-output -o wan -m set --match-set set_ntp_servers dst -p udp --dport 123 -j ACCEPT
Si le système utilise UFW, on ne peut pas créer directement de règle exploitant les ipset via la commande ufw. Néanmoins il est possible d'intégrer des règles iptables au framework UFW en les ajoutant dans le fichier /etc/ufw/after.rules. Ce fichier script, s'il est exécutable est utilisé par lors du démarrage/arrêt du pare-feu UFW.
# Rendre le script exécutable pour qu'il soit automatiquement appelé par ufw-init chmod ug+x /etc/ufw/after.rules # Sauvegarder les ensembles existants pour qu'ils puissent être rechargés ipset save > /etc/ufw/sets.ipset
Modifier le fichier /etc/ufw/after.rules, dans la section start, on reconstruit les ensembles ipset à partir du fichier de sauvegarde puis on crée les règles via les appels iptable. Dans la section stop, les ensembles sont détruits.
# # Copyright 2013 Canonical Ltd. # # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License version 3, # as published by the Free Software Foundation. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with this program. If not, see <http://www.gnu.org/licenses/>. # set -e case "$1" in start) # typically required if [ -r /etc/ufw/sets.ipset ] then ipset -f /etc/ufw/sets.ipset restore # Journalise et autorise le trafic NTP a destination des serveurs des pools *.fr.pool.ntp.org iptables -A ufw-after-output -o wan -m set --match-set set_ntp_servers dst -p udp --dport 123 -j ufw-logging-allow -m comment --comment "Autorise trafic NTP vers fr.pool.ntp.org" iptables -A ufw-after-output -o wan -m set --match-set set_ntp_servers dst -p udp --dport 123 -j ACCEPT -m comment --comment "Autorise trafic NTP vers fr.pool.ntp.org" fi ;; stop) # typically required ipset destroy ;; status) # optional ;; flush-all) # optional ;; *) echo "'$1' not supported" echo "Usage: after.init {start|stop|flush-all|status}" ;; esac
Même après redémarrage du service, le serveur ne semble pas prendre en compte les modifications apportées dans le fichier de configuration /etc/ntp.conf
En consultant les traces dans les journaux système, dans ce cas, la ligne de commande indique que le fichier de configuration effectivement utilisé est celui généré par le client DHCP:
janv. 06 21:47:56 nucleus systemd[1]: Starting Network Time Service... janv. 06 21:47:56 nucleus ntpd[14576]: ntpd 4.2.8p15@1.3728-o Wed Sep 23 11:46:38 UTC 2020 (1): Starting janv. 06 21:47:56 nucleus ntpd[14576]: Command line: /usr/sbin/ntpd -p /var/run/ntpd.pid -g -c /run/ntp.conf.dhcp -u 116:122 . . .
systemd exécute le script /usr/lib/ntp/ntp-systemd-wrapper
. Dans ce script, si un fichier /run/ntp.conf.dhcp
existe, il est utilisé comme fichier de configuration.
Si on stoppe le service, qu'on supprime le fichier et qu'on relance le service, le serveur se comporte comme souhaité et charge le fichier de configuration /etc/ntp.conf
.
# Arret du serveur NTP systemctl stop ntp.service # suppression du fichier de configuration ntp généré par le client DHCP rm /run/ntp.conf.dhcp # Redémarra du serveur NTP systemctl start ntp.service
Ci dessous les traces au redémarrage:
janv. 06 22:39:52 nucleus systemd[1]: Starting Network Time Service... janv. 06 22:39:52 nucleus ntpd[20816]: ntpd 4.2.8p15@1.3728-o Wed Sep 23 11:46:38 UTC 2020 (1): Starting janv. 06 22:39:52 nucleus ntpd[20816]: Command line: /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 116:122 . . .
via la commande ntpq on s'assure que les pools définis dans la configuration sont à présent utilisés:
ntpq -p -n remote refid st t when poll reach delay offset jitter ============================================================================== 0.fr.pool.ntp.o .POOL. 16 p - 64 0 0.000 +0.000 0.000 1.fr.pool.ntp.o .POOL. 16 p - 64 0 0.000 +0.000 0.000 2.fr.pool.ntp.o .POOL. 16 p - 64 0 0.000 +0.000 0.000 3.fr.pool.ntp.o .POOL. 16 p - 64 0 0.000 +0.000 0.000 162.159.200.1 10.19.12.255 3 u 31 64 1 13.507 -396.96 0.000 37.187.5.167 131.188.3.222 2 u 31 64 1 17.812 -397.75 0.000 151.80.211.8 212.83.158.83 3 u 32 64 1 16.706 -396.85 0.000
Les pools définis dans le fichier de configuration /etc/ntp.conf sont bien utilisés après suppression du fichier /run/ntp.conf.dhcp cependant la modification n'est que temporaire car il sera recréé et reutilisé au prochain démarrage.