Outils pour utilisateurs

Outils du site


sysadmin:linux:serveur-ntp

Installer serveur ntp

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:

  • https
  • cache DNS

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

Installation

$ sudo apt-get install ntp

Configuration

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
Chaque entrée server ou pool peut avoir une option iburst qui autorise le service à rattraper rapidement le temps de référence.

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

Gestion du service

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 les valeurs des colonnes reach, delay offset, jitter sont à 0, la communication avec les serveurs n'est pas établie. Vérifier la configuration du serveur et du réseau.

Si le serveur écoute sur toutes les interfaces, vérifier la présence de la directive interface:

interface listen lan

Le client ntpdate

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.

ntpdate n'utilise pas le fichier de configuration /etc/ntp.conf, il faut donc préciser avec quel serveur on souhaite synchroniser le système. Sans cet argument on obtient une erreur.
ntpdate ne peut pas s'utiliser si le daemon ntpd s'exécute, on obtient alors le message suivant :
[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  ]

Le client sntp

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

Le client sntp de systemd

systemd intègre un client sntp, voir le wiki synchronisation du temps par systemd.

Paramétrage du pare-feu

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.

after.rules
#
# 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

Troubleshooting

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.

  • redéfinir le comportement du client DHCP pour empêcher qu'il modifie le serveur NTP
  • redéfinir le service via systemd

Références

1)
Network Time Protocol
sysadmin/linux/serveur-ntp.txt · Dernière modification : 2022/01/08 18:48 de yoann