ntp

NTP es un protocolo de Internet para sincronizar los relojes de los sistemas informáticos conmutando paquetes de datos en redes con latencia variable. NTP utiliza el protocolo UDP como su capa de transporte (puerto 123). Está diseñado para resistir a los efectos de la latencia variable.

En este apunte explico cómo configurar NTP en un equipo GNU/Linux (distribución Gentoo) para ajustar la hora y que se mantenga, a la vez que pueda hacer de servidor horario en tu red casera.


NTP + NTP-CLIENT

La calidad de los relojes: El sistema mantendrá el reloj a través de técnicas software mientras que el servidor está arrancado, pero una vez que apagas el servidor, el reloj HW puede que se quede bastante desincronizado, esa es la razón por la que forzaré una sincronización del reloj durante el re-arranque del sistema.

Voy a ejecutar el daemon NTP como un servicio y lo ejecutaré con un usuario diferente a root. Para poder ejecutar ntp como un usuario diferente a root es necesario configurar lo siguiente en ciertas versiones del Kernel y activar el USE “caps”.

Security options  --->
    [*] File POSIX Capabilities

NTP

net-misc/ntp                    ipv6 ssl zeroconf caps

Requerido por NTP

net-dns/avahi                   mdnsresponder-compat

Instalación

Ejecuto la instalación de ntpd y ntpclient

# emerge -v ntp ntpclient

El programa ntpd tiene que ejecutarse como un servicio y el programa ntp-client tiene que ejecutarse durante el arranque. Si es la primera vez que vas a sincronizar, te recomiendo hacer lo siguiente: añade los servicios, cambia la hora con ntp-client (para ajustar el reloj software) y rearranca el equipo, para que se cambie el reloj hardware y luego se arranquen ntpd de forma normal.

Ejecución con openrc

Configuro los ficheros de apoyo. El daemon ntpd utiliza por defecto el fichero /etc/ntp.conf

#
# Equipos que me dan la hora
server 0.gentoo.pool.ntp.org
server 1.gentoo.pool.ntp.org
server 2.gentoo.pool.ntp.org
server 3.gentoo.pool.ntp.org
#
# Equipo que me da la hora en caso de caida de internet, uso mi reloj hardware
server 127.0.0.1
fudge 127.0.0.1 stratum 10
#
# Interfaces en las que voy a servir la hora
interface ignore wildcard
interface listen 127.0.0.1
interface listen 192.168.1.1
#
# Ficheros de trabajo
logfile         /var/log/ntpd.log
driftfile   /var/lib/ntp/ntp.drift
#
# Restricciones, trabajo sin peers y solo doy la hora en loopback e intranet
restrict default nomodify nopeer
restrict 127.0.0.1
restrict 192.168.1.0 mask 255.255.255.0 nomodify nopeer notrap

NTPD_OPTS="-u ntp:ntp"

NTPCLIENT_CMD="ntpdate"
NTPCLIENT_OPTS="-s -b -u \
    0.gentoo.pool.ntp.org 1.gentoo.pool.ntp.org \
    2.gentoo.pool.ntp.org 3.gentoo.pool.ntp.org"

CLOCK_SYSTOHC="yes"

Activación

# rc-update add ntpd default
# rc-update add ntp-client default
:
# /etc/init.d/ntp-client start
:
# reboot

Ejecución con systemd

Configuro los ficheros de apoyo. El daemon ntpd utiliza por defecto el fichero /etc/ntp.conf pero en mi caso he preferido cambiarle el nombre. NOTA: Esto es una decisión personal porque creo que tiene más sentido añadir la “d” de daemon, así que recordar que he cambiado el nombre del fichero de configuración a /etc/ntpd.conf e indicaré al ejecutable que lo utilice en el fichero ntpd.service.

#
# Equipos que me dan la hora
server 0.gentoo.pool.ntp.org
server 1.gentoo.pool.ntp.org
server 2.gentoo.pool.ntp.org
server 3.gentoo.pool.ntp.org
#
# Equipo que me da la hora en caso de caida de internet, uso mi reloj hardware
server 127.0.0.1
fudge 127.0.0.1 stratum 10
#
# Interfaces en las que voy a servir la hora
interface ignore wildcard
interface listen 127.0.0.1
interface listen 192.168.1.1
#
# Ficheros de trabajo
logfile         /var/log/ntpd.log
driftfile   /var/lib/ntp/ntp.drift
#
# Restricciones, trabajo sin peers y solo doy la hora en loopback e intranet
restrict default nomodify nopeer
restrict 127.0.0.1
restrict 192.168.1.0 mask 255.255.255.0 nomodify nopeer notrap

NTPD_OPTS="-c /etc/ntpd.conf -g -u ntp:ntp"

NTPCLIENT_OPTS="-s -b -u \
    0.gentoo.pool.ntp.org 1.gentoo.pool.ntp.org \
    2.gentoo.pool.ntp.org 3.gentoo.pool.ntp.org"

Programo el reloj y deshabilito el cliente NTP que trae systemd.

cortafuegix ~ # timedatectl set-local-rtc 0
cortafuegix ~ # timedatectl set-timezone Europe/Madrid
cortafuegix ~ # timedatectl set-time "2012-10-30 18:17:16" <= Ponerlo primero en hora.
cortafuegix ~ # timedatectl set-ntp false

Configuro los .service de ntp y ntp-client

[Unit]
Description=Network Time Service
After=ntp-client.service
Conflicts=systemd-timesyncd.service

[Service]
ExecStart=/usr/sbin/ntpd -c /etc/ntpd.conf -g -n -u ntp:ntp
PrivateTmp=true

[Install]
WantedBy=multi-user.target
[Unit]
Description=Set time via NTP using ntpdate
After=network-online.target nss-lookup.target
Before=time-sync.target
Wants=time-sync.target
Conflicts=systemd-timesyncd.service

[Service]
Type=oneshot
EnvironmentFile=/etc/conf.d/ntp-client
ExecStart=/usr/sbin/ntpdate $NTPCLIENT_OPTS
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Habilito el servicio

# systemctl enable ntp-client
# systemctl enable ntpd
:
# reboot

Gestión de NTPD

Puede llegar a tardar hasta 4 horas calibrar el reloj antes de llegar al estado correcto de Stratum (dado que estás sincronzando con servidores stratum 2, tu estado debería ser de stratum 3). De hecho la razón por la que ejecuto ntp-client (antes que ntpd) es para poner el equipo en hora y que este proceso sea más rápido. Cuando ntpd arranque y vea que la hora del equipo coincide con la de sus servidores, tardará muy poco en sincronizar. Si el estado no ha cambiado tras un rato es que algo está fallando. Lo correcto es que diga que es “stratum=3”

$ ntpq -c readvar
assID=0 status=06f4 leap_none, sync_ntp, 15 events, event_peer/strat_chg,
version="ntpd 4.2.4p7@1.1607-o lun ago 17 07:38:15 UTC 2009 (1)",
processor="x86_64", system="Linux/2.6.30-gentoo-r4", leap=00, stratum=3,        <=====
precision=-20, rootdelay=81.469, rootdispersion=176.829, peer=59651,
refid=147.83.175.41,
reftime=ce33fdf3.a893739b  Mon, Aug 17 2009 18:04:03.658, poll=6,
clock=ce33fe7e.4d15c9c5  Mon, Aug 17 2009 18:06:22.301, state=4,
offset=-46.921, frequency=11.491, jitter=79.033, noise=3.260,
stability=0.876, tai=0

Si después de una horas tu servidor sigue en stratum 16 entonces es que algo está fallando. Mira esta guía. Puedes comprobar contra qué servidores estás conectados

$ ntpq -c peers
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
-clip.dia.fi.upm 193.204.114.232  2 u    5   64  377   45.026  -44.194  71.461
+matillas.uc3m.e 194.117.9.130    3 u   57   64  377   44.340  -46.080   2.409
+alertas.efor.es 193.79.237.14    2 u    1   64  377   64.722  -47.021  64.068
*abridoc.upc.es  158.227.98.15    2 u   50   64  377   58.230  -48.697  79.016

OpenNTP

A continuación muestro un ejemplo de configuración para varios equipos Linux con systemd. He configurado dos como Servidores NTP con “OpenNTPD” y el resto usarán el cliente embebido en systemd.

Servidores con Openntpd

OpenNTPD es una versión ligera del servidor NTP que se ha portado desde OpenBSD. Configuro dos equipos como servidores: cortafuegix y apodix.

  • Instalación
root # emerge --ask net-misc/openntpd

Configuración como Daemon

  • Programo el reloj y deshabilito el cliente NTP que trae systemd
cortafuegix ~ # timedatectl set-local-rtc 0
cortafuegix ~ # timedatectl set-timezone Europe/Madrid
cortafuegix ~ # timedatectl set-time "2012-10-30 18:17:16" <= Ponerlo primero en hora.
cortafuegix ~ # timedatectl set-ntp false
  • Configuro el fichero para que actúe como servidor
# Configuración como Servidor NTP
listen on *

# Sincronizo con los servidores del pool ntp
servers 0.gentoo.pool.ntp.org
servers 1.gentoo.pool.ntp.org
servers 2.gentoo.pool.ntp.org
servers 3.gentoo.pool.ntp.org
  • Programo el daemon para que arranque en el siguiente boot y lo activo
cortafuegix ~ # systemctl enable ntpd
cortafuegix ~ # systemctl start ntpd
:
cortafuegix ~ # timedatectl
      Local time: sáb 2015-05-30 08:22:51 CEST
  Universal time: sáb 2015-05-30 06:22:51 UTC
        RTC time: sáb 2015-05-30 06:22:51
       Time zone: Europe/Madrid (CEST, +0200)
     NTP enabled: no                           <== En el Servidor aparece como "NO"
NTP synchronized: yes                          <== En el Servidor aparece como "yes"
 RTC in local TZ: no
      DST active: yes
 Last DST change: DST began at
                  dom 2015-03-29 01:59:59 CET
                  dom 2015-03-29 03:00:00 CEST
 Next DST change: DST ends (the clock jumps one hour backwards) at
                  dom 2015-10-25 02:59:59 CEST
                  dom 2015-10-25 02:00:00 CET

Cliente con systemd-timesyncd

Para los equipos cliente utilizo el que incluye systemd

#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.
#
# You can override the directives in this file by creating files in
# /etc/systemd/timesyncd.conf.d/*.conf.
#
# See timesyncd.conf(5) for details

[Time]
NTP=cortafuegix.tudominio.com apodix.tudominio.com
FallbackNTP=0.gentoo.pool.ntp.org 1.gentoo.pool.ntp.org 2.gentoo.pool.ntp.org 3.gentoo.pool.ntp.org
  • Programo el reloj y deshabilito el cliente NTP que trae systemd
gentoo ~ # timedatectl set-local-rtc 0
gentoo ~ # timedatectl set-timezone Europe/Madrid
gentoo ~ # timedatectl set-time "2012-10-30 18:17:16" <= Ponerlo primero en hora.
gentoo ~ # timedatectl set-ntp true
:
gentoo ~ # timedatectl
      Local time: sáb 2015-05-30 08:22:29 CEST
  Universal time: sáb 2015-05-30 06:22:29 UTC
        RTC time: sáb 2015-05-30 06:22:30
       Time zone: Europe/Madrid (CEST, +0200)
     NTP enabled: yes                           <== En los Clientes aparece como "YES"
NTP synchronized: no                            <== En los Clientes aparece como "NO"
 RTC in local TZ: no
      DST active: yes
 Last DST change: DST began at
                  dom 2015-03-29 01:59:59 CET
                  dom 2015-03-29 03:00:00 CEST
 Next DST change: DST ends (the clock jumps one hour backwards) at
                  dom 2015-10-25 02:59:59 CEST
                  dom 2015-10-25 02:00:00 CET