Network Time Protocol (NTP) (f: wikipedia) 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 voy a explicar 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
Los relojes hardware no son demasiado buenos, (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».
1 2 | Security options ---> [*] File POSIX Capabilities |
1 2 3 4 | # 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
1 2 | # 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | # # 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 |
1 | NTPD_OPTS="-u ntp:ntp" |
1 2 3 4 | 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" |
1 | CLOCK_SYSTOHC="yes" |
1 2 3 4 5 6 7 | # 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.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | # # 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 |
1 | NTPD_OPTS="-c /etc/ntpd.conf -g -u ntp:ntp" |
1 2 3 | 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.
1 2 3 4 5 | 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
1 2 3 4 5 6 7 8 9 10 11 | [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 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | [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
1 2 3 4 5 | # 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»
1 2 3 4 5 6 7 8 9 10 11 | $ 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
1 2 3 4 5 6 7 8 | $ 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
1 2 | root #emerge --ask net-misc/openntpd |
Configuración como Daemon
- Programo el reloj y deshabilito el cliente NTP que trae systemd
1 2 3 4 5 | 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
1 2 3 4 5 6 7 8 | # 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | # 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.parchis.org apodix.parchis.org 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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 |