NTP | Servidor local

Un servidor NTP local para sincronizar tus dispositivos

Roberto Lodeiro

Nuestro ordenador, nuestro router y muchos de los dispositivos que utilizamos a diario, sincronizan la hora del sistema con un servidor NTP (Network Time Protocol). Los mas conocidos y utilizados son los de NTP Pool Project.

Si tenemos en mente por ejemplo un proyecto relacionado con la domótica, puede que no queramos que nuestros dispositivos (salvo el servidor local que los gestione) tengan acceso a internet, pero que tengamos la necesidad de que estos tengan la hora correcta para poder consultar los logs de una forma sencilla y eficiente.

Tanto si programamos nosotros los dispositivos desde cero basándonos en Arduino/Wemos o similar, como si compramos dispositivos comerciales y los modificamos por ejemplo con el firmware opensource Tasmota (del que hablare en otro post), sera muy sencillo sincronizar la hora con un servidor NTP local. Paso a explicar como configurarlo en nuestro servidor Linux.


Instalar el cliente NTP

Primero instalaremos el cliente NTP en nuestra Raspberry/Debian/derivado para que sincronizara la hora con los servers externos que elijamos.

  • Deshabilitar la sincronización horaria systemd-timesyncd

    $ sudo systemctl stop systemd-timesyncd
    $ sudo systemctl disable systemd-timesyncd
    
    • Instalar NTP bash $ sudo apt-get install ntp
  • Editar el archivo de configuración con los servers adecuados a tu zona horaria. Los encontrarás en pool.ntp.org

    $ sudo nano /etc/ntp.conf
    

    Quedará algo como lo siguiente

    #/etc/ntp.conf, configuration for ntpd
    
    driftfile /var/lib/ntp/ntp.drift
    statsdir /var/log/ntpstats/
    
    statistics loopstats peerstats clockstats
    filegen loopstats file loopstats type day enable
    filegen peerstats file peerstats type day enable
    filegen clockstats file clockstats type day enable
    
    # You do need to talk to an NTP server or two (or three).
    #server ntp.your-provider.example
    
    # pool.ntp.org maps to more than 300 low-stratum NTP servers.
    # Your server will pick a different set every time it starts up.
    # *** Please consider joining the pool! ***
    # *** ***
    server 0.es.pool.ntp.org
    server 0.europe.pool.ntp.org
    server 1.europe.pool.ntp.org
    
    # By default, exchange time with everybody, but don't allow configuration.
    # See /usr/share/doc/ntp-doc/html/accopt.html for details.
    restrict -4 default kod notrap nomodify nopeer noquery
    restrict -6 default kod notrap nomodify nopeer noquery
    
    # Local users may interrogate the ntp server more closely.
    restrict 127.0.0.1
    restrict ::1
    
    # Clients from this (example!) subnet have unlimited access,
    # but only if cryptographically authenticated
    #restrict 192.168.123.0 mask 255.255.255.0 notrust
    
    # If you want to provide time to your local subnet, change the next line.
    # (Again, the address is an example only.)
    #broadcast 192.168.123.255
    
    # If you want to listen to time broadcasts on your local subnet,
    # de-comment the next lines. Please do this only if you trust everybody
    # on the network!
    #disable auth
    #broadcastclient
    
  • Reiniciar el servicio y probar que sincroniza correctamente

    $ sudo service ntp restart
    $ ntpq -pn
    

    Se mostrará por pantalla algo similar a esto:

    remote refid st t when poll reach delay offset jitter
    ==============================================================================
    *81.27.192.20 195.113.144.238 2 u 26 64 1 58.571 0.797 68.634
    +93.185.101.74 195.113.144.201 2 u 25 64 1 42.282 -1.507 0.477
    +93.185.101.77 195.113.144.201 2 u 24 64 1 41.390 -1.544 68.243
    -91.216.168.42 178.238.46.152 3 u 23 64 1 43.510 1.010 1.094
    

Podemos comprobar que la hora y fecha del sistema es correcta con:

$ date

Configurar el servidor NTP

Ahora vamos a configurar NTP para que esté disponible como servidor local.

  • Editar el archivo de configuración

    $ sudo nano /etc/ntp.conf
    
    • Añadimos lo siguiente: text restrict 192.168.1.0 mask 255.255.255.0

Con esto restringimos el acceso al server a nuestra red local. Cambiar las direcciones según las correspondientes a nuestra red.

broadcast 192.168.1.255
broadcast 224.0.1.1

Aquí cambiaremos la primera dirección por la dirección broadcast de nuestra red. No cambiar la dirección 224.0.1.1, ya que algunos dispositivos de red sincronizan con NTP en esta dirección multicast de forma automática.

  • Reiniciar el servicio bash $ sudo service ntp restart Por último, configuramos en los dispositivos cliente la ip local del servidor como server NTP, y ya tendremos lo hora sincronizada sin necesidad de que estos tengan acceso a internet.
    Espero que sea útil, ¡gracias por leerme!