el correo llega a su hora

30 de noviembre de 2008

La mejor manera de no encontrar discrepancias entre las cabeceras de los correos y los logs de los servidores por donde pasa, es tener el servidor correctamente sincronizado. Cuando tú servidor procesa un correo le añade su cabecera junto con su marca de tiempo.

Received: from mail.amperisblog.com (LHLO mail.amperisblog.com)
 (192.168.1.6) by mail.amperisblog.com with LMTP; Sun, 19 Oct 2008 19:31:11
 +0200 (CEST)
Received: by mail.amperisblog.com (Postfix, from userid 500)
 id 208951B74EE; Sun, 19 Oct 2008 19:31:11 +0200 (CEST)

En Linux la manera de sincronizar el reloj es utilizando uno de los protocolos más antiguos de Internet (se creo en 1985): el ntp. Este protocolo se basa en paquetes udp, y aun utilizando paquetes udp está especialmente diseñado para resistir el retardo entre el servidor que proporcionan la hora y el cliente que la recibe.

El ntp utiliza una variación de un algoritmo llamado “algoritmo de Marzullo” el cual intenta encontrar un intervalo de tiempo que tenga un número máximo de solapamientos con las diferentes respuestas de los servidores de tiempo. Para entendernos mejor, lo que hace es hacer una especie de “media matemática” de entre todas las respuestas de tiempo que recibe. Siempre teniendo en cuenta las latencias de la red. Aquí tenéis unas transparencias interesantes sobre la problemática de la sincronización de los sistemas informáticos.

Si un reloj de un sistema (en nuestro caso el servidor de correo) es incorrecto, lo que hace ntp es desacelerarlo o acelerarlo hasta llegar a la hora correcta. El reloj nunca se atrasa en un sistema informático, en todo caso se desacelera. No esperes que tú reloj tenga la hora correcta nada más arrancar el cliente de ntp.

Todos los sistemas tienen implementado ntp y este es el caso de Linux. En mi caso el servidor de correo está en Fedora.

Lo primero que vamos hacer es asegurarnos de tener todo lo necesario. Normalmente ya lo tendremos instalado. Si no es así hacemos un “yum install ntp”:
# rpm –q –a | grep ntp
ntp-4.2.4p0-2.fc7

Ahora haremos una configuración manual de nuestro reloj. Cuando decimos reloj me refiero tanto a la fecha como a la hora.
Lo primero que haremos es seleccionar correctamente nuestra zona horaria basada en una escala de UTC. Como en España somos más chulos que nadie tenemos dos alternativas: la UTC+1 (o CET Central European Time) y UTC+2 en verano (CEST Central European Summer Time).

En sistemas basados en redhat podemos utilizar el comando "system-config-date" para seleccionar nuestra zona horaria. En mi caso “European/Madrid” con UTC.

Ahora ponemos manualmente nuestra fecha y hora. Son las 18:12 del 30 de noviembre del 2008:
# date -s "30 nov 2008 18:12:00"
Sun Nov 30 18:12:00 CET 2008

Le llega el turno al ntp. Lo primero que voy hacer es ver si soy capaz desde mi servidor de correo conectarme a un servidor de tiempo. Por ejemplo “clock.redhat.com”.
# ntpq –p clock.redhat.com
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*HOPF_S(0)       .CDMA.           0 l    -   16  377    0.000    0.003   0.015

Si por cualquier motivo nos diera un error del tipo “request timeout” tendríamos que asegurarnos de tener abierto hacia afuera el puerto UDP 123 pues es donde debe conectarse el cliente ntp.

Ahora que parece que todo está correcto podemos lanzar la primera sincronización contra un servidor de tiempo. Utilizamos ntpdate para forzar una sincronización:
# ntpdate clock.redhat.com
30 Nov 18:34:45 ntpdate[534]: adjust time server 66.187.233.4 offset 0.038592 sec

Como último paso podemos lazar el demonio ntp para que nuestro servidor de correo se sincronice automáticamente el solito:
# service ntpd start
Starting ntpd:                                             [  OK  ]

El archivo de configuración de ntp se encuentra dentro de /etc/ntpd.conf. Si lo editamos veremos que el parámetro más importante es “server”. En el se especifican los servidores a los que se les preguntará el tiempo.
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
server 0.fedora.pool.ntp.org dynamic
server 1.fedora.pool.ntp.org dynamic
server 2.fedora.pool.ntp.org dynamic

Como veis, se utiliza una lista de servidores pertenecientes al “NPT pool project” el cual recopila servidores de tiempo repartidos por el mundo. A estos servidores se les conoce como servidores de estrato 1. En el estrato 0 se encuentran directamente los relojes GPS o WWV.

Como yo soy de España, hago honor a mi tierra y utilizo mis servidores más cercanos. Para ello editamos /etc/ntpd.conf, borramos todos los servers que encontremos y ponemos estos otros tal como nos indica el “NTP pool Project”:
server 3.es.pool.ntp.org
server 3.europe.pool.ntp.org
server 2.europe.pool.ntp.org

Más información:
+ NTP en Wikipedia
+ El padre del NTP
+ Procolo oficial: NTP
+ The Tuxgraphics AVR NTP clock