
Cuando nos enfrentamos ante una infraestructura amplia de servidores que deben trabajar con un mínimo de sincronización, es importante que todos ellos compartan la misma hora, y ajustar manualmente la hora de cada uno no solo es una tarea tediosa, sino que además es inútil ya que la precisión es muy baja, y la latencia del hardware de reloj de un servidor normal puede retrasarlo hasta 2 segundos a la semana. Insostenible a largo plazo.
Afortunadamente, existe un protocolo llamado Network Time Protocol (NTP, Protocolo de Tiempo de Red) que nos permite mediante un sistema jerárquico de clientes-servidores sincronizar a través de una red la hora de los servidores contra una o varias fuentes. Es decir, que los servidores pueden pedirse la hora unos a otros siguiendo un modelo escalonado, manteníendo todos la misma hora con un margen de diferencia mínimo.

Como comentamos, NTP tiene una estructura jerárquica dividida en ESTRATOS. El número de estrato de un servidor indica cuán lejos está de una fuente de hora original, siendo los servidores de estrato 1 los que constituyen una fuente de final de hora. Este tipo de servidores de estrato 1 son máquinas especiales equipadas con hardware específico capaz de obtener la hora en función de condiciones físicas externas, como por ejemplo los datos de un satelite de GPS o el eje de inclinación de la tierra. Este tipo de hardware es desorbitadamente caro, quepa decirlo. Ejemplos de este tipo de servidores de estrato 1 son los relojes atómicos de Greenwich (que miden el tiempo mediante las vibraciones del átomo de cesio) o los relojes astronómicos de la NASA.
En los siguientes estratos se van montando servidores que toman la hora de uno o varios estrato 1 y la sirven a estratos inferiores, con el objetivo de no saturar la carga de los servidores de más alto estrato y hacer más precisa su información. Los servidores de estrato 1 no suelen facilitar información a clientes, sólo a otros servidores. Técnicamente, no existe un limite en cuanto al número de estratos que puede haber en una jerarquía NTP, pero como convencíon podemos decir que 12 es el número máximo.
¿Como funciona NTP a nivel lógico? Sencillamente, cuando un cliente solicita información de hora a un servidor, este le devuelve su hora local, su huso horario y su estrato. Si no está configurado para ser fuente directa, en lugar de su hora local devuelve la hora del servidor o servidores con los que esté sincronizado. El cliente es el que se encarga de hacer los cálculos para decir que hora se queda.
Y ahora, ¿como se implementa? NTP es tremendamente sencillo. Veamos como se implementa en Windows y en Linux:
IMPLEMENTACIÓN DEL SERVIDOR
Windows:
Para implementar un servidor NTP en Windows, simplemente debemos descargar el servidor desde la web de Meinberg, que realiza el desarrollo para Windows. La licencia es libre.
Ejecutamos el fichero descargado y seguimos las instrucciones para instalación completa. Acto seguido, comenzamos a configurar el servidor:

En este menú, podemos dejar por defecto la ruta del fichero de configuración. A continuación marcamos la casilla “Crear configuración inicial”. Podemos elegir entre sincronizar contra fuentes estándar del pool de NTP.org en la primera pestaña, o especificar una lista de servidores personalizados en el cuadro de abajo. Puedes dejarlo vacío si quieres que la única fuente sea el reloj interno del servidor.
NOTA-YA-TE-LO-DIJE: No es buena idea utilizar el reloj interno del servidor como fuente de hora NTP por su imprecisión, salvo que este esté sincronizado a su vez con otra fuente por otro medio (como un controlador de dominio). Tampoco es conveniente tener muchas fuentes de hora: no te darán más precisión, si cabe menos. Es mejor tener dos o tres fuentes cerca de tu área geográfica que 14 de todo el mundo.
También se puede especificar si se va a usar la característica iburst. Más inforamción sobre esta característica en la web de Meinberg. En la siguiente casilla especificaremos que estrato tiene el servidor, útil si estás montando tu propia jerarquía.
Una vez instalado y configurado, dispones del siguiente menú en Inicio para controlar el servicio:

Haciendo click en la opción Start ya lo tendremos listo para aceptar peticiones.
Linux/Unix:
En los sistemas Linux/Unix es habitual que el demonio ntpd venga instalado de serie. Si no lo estuviese, es tán sencillo como instalarlo empleando los sistemas de paquetería habituales.
Los usuarios de Mandriva harán:
# su
# urpmi ntpd
Los usuarios de Debian harán:
# su
# apt-get install ntpd
Y si usas Solaris debes descargar el paquete desde Sun Freeware y ejecutar:
# su
# gunzip ntp-4.2.6-sol10-sparc-local.gz
# pkgadd -d ntp-4.2.6-sol10-sparc-local
A continuación procedemos a configuar el servicio. Si tienes un asistente gráfico, mejor que mejor, sino edita el ficero /etc/ntp.conf con tu editor de texto habitual. Veamos como es el fichero con su explicación:
# Esta línea permite que otros se sincronicen con nosotros,
# pero sin modificarnos.
restrict default kod nomodify notrap nopeer noquery
# Permitimos todas las conexiones por la interfaz de loopback,
# para sincronizarnos nosotros mismos
restrict 127.0.0.1
restrict -6 ::1
# En esta línea podemos dar permisos especiales a un determinado rango de red.
# Pon los rangos de red y la máscara de subred que se puedan conectar a tí.
# Más información sobre esto en ntpd.og.
#restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
# Aquí indicamos que si no hay ninguna fuente disponible, utilicemos
# nuestro reloj de hardware como fuente, indicando el estrato.
fudge 127.127.1.0 stratum 10
# Este fichero contiene la varianza entre la hora cedida y la cargada.
# No lo toques.
driftfile /var/lib/ntp/drift
# Fichero de claves para uso de criptografía cruzada.
# No lo toques-.
keys /etc/ntp/keys
# A continuación especificamos los servidores con los que nos vamos a sincronizar,
# así como las reglas que vamos a aplicar con cada uno de ellos.
# Si no hay nada se empleará la fuente local.
server 192.168.13.238
restrict 192.168.13.238 mask 255.255.255.255 nomodify notrap noquery
Para crear un servidor, únicamente debemos especificar los servidores a los que vamos a sincronizar o la línea fudge para ser nosotros fuente, y especificar el rango de red que podrá solicitar sincronización.
Después, arrancamos el servicio según nuestro sistema operativo.
IMPLEMENTACION DEL CLIENTE:
Al ser un servicio estándar, para configurar el cliente es irrelevante el SO del servidor. Todos funcionan con todos. Veamos lo sencillo que es configurar un cliente:
Windows:
En Windows la forma más sencilla de configurar NTP es hacer doble click sobre el reloj. En el cuadro que se despliega seleccionamos la pestaña Sincronización de Hora de Internet y dentro marcamos la casilla “Sincronizar automáticamente con un servidor de hora“. Indicamos en la pestaña el nombre del servidor y pinchamos en “Actualizar ahora“.Si todo va bien debería coger la hora sin problemas.

Linux/Unix:
Para sincronizar con Linux y Unix, igualmente debemos tener instalado el paquete ntpd. Lo instalamos si no lo tenemos como hemos explicado antes.
Desde una consola, ejecutamos el siguiente comando:
# ntpq -p host-ntp
Donde host-ntp es el nombre de host o IP del servidor NTP que hemos configurado. Con este comando testeamos si somos capaces de sincronizar con el servidor. Si funciona, nos devolverá una línea por cada fuente configurada del servidor. En este ejemplo el servidor sólo tiene configurada com ofuente su hora local:
# ntpq -p time.server.com
remote refid st t when poll reach delay offset jitter
==============================================================================
*LOCAL(0) .LOCL. 12 l 35 64 377 0.000 0.000 0.001
Una vez hemos comprobado que llegamos, simplemente editamos el fichero /etc/ntp.conf y añadimos las siguientes líneas al final por cada fuente:
server [host]
restrict [host] mask [subnet] nomodify notrap noquery
Arrancamos o reiniciamos el demonio ntpd y podremos comprobar como ahora servidor y cliente comparten al segundo la misma hora.












