Category Archives: NTP

Habilitar ntp server con GPS en AlmaLinux 10 para raspberry pi

Ya este escenario lo había probado en Raspbian; me dio un poco de trabajo realmente echarlo a andar.

Así que decirí hoy instalar AlmaLinux 10 en mi Raspberry Pi 4 y probar echar a andar mi servicio de NTP con GPS.

Hace varios meses adquirí un HAT para Raspberry Pi que agrega la opción de un GPS a mi Raspberry, de esta forma puedo tener un servidor de tiempo (NTP) stratum 1 en mi red.

No es sólo el HAT, sino que compré una antena externa para el GPS y un cable para convertir el formato de los conectores:

1- Adafruit Ultimate GPS HAT for Raspberry Pi A+/B+/Pi 2/3/Pi 4 – Mini Kit

2- GPS ANTENNA SMA MALE PLUG ACTIVE ADAPTER CABLE FOR NAVIGATION STEREO SCREEN NEW

3- SMA Female to uFL/u.FL/IPX RF 1.37 Coaxial Cable Adapter Assemb Pick Length (8 inch)

Por supuesto que tanto el HAT como la antena y el convertidor pueden ser de otro fabricante o marca. En mi caso compré este.

Proceso al instalar AlmaLinux:

Una vez tengas instalado AlmaLinux, no olvidar realizar las siguientes configuraciones:

1- Deshabilitar SELinux:

vim /etc/sysconfig/selinux

SELINUX=disabled

2- vim /boot/config.txt

Agregar al final:

# Enable PPS on GPIO 4
dtoverlay=pps-gpio,gpiopin=4

Este paso es fundamental ya que lo que hará es indicarle al raspberry que debe buscar el puerto PPS del GPS en el pin 4, ya que mi HAT envía la señal PPS al pin 4.

Al inicio esto me confundió bastante ya que no me funcionaba el PPS y por tanto mi servicio de gpsd no capturaba los datos del gpsd.

También enfrenté un pequeño problema y es que el raspberry usa el puerto /dev/ttyS0 para su consola serial, y el GPS también lo usa. Entonces lo que hice fue deshabilitar el puerto consola serial. Para ello editas /etc/cmdline.txt y le quitas la parte inicial que dice: console=serial0,115200, dejo el resto igual, por ejemplo:

vim /boot/cmdline.txt
console=console=tty1 root=PARTUUID=530e947f-26ce-402e-8562-a8c34939f03d rootfstype=ext4 rootwait

Instalando gpsd:

dnf install gpsd gpsd-clients

Una vez instalado, edito el archivo de configuración de gpsd dejándolo exactamente así:

/etc/sysconfig/gpsd

# Options for gpsd, including serial devices
OPTIONS="-n /dev/ttyS0"
# Set to 'true' to add USB devices automatically via udev
USBAUTO="true"

El punto es indicarle al servicio de gpsd en qué puerto serial va a encontrar al dispositivo. Esto lo puedes encontrar con:

dmesg -T|egrep tty

por ejemplo en mi caso me decía:

[Sun May 17 22:23:34 2026] fe215040.serial: ttyS0 at MMIO 0xfe215040 (irq = 40, base_baud = 62500000) is a 16550

Configurando chronyd:

Edito /etc/chrony.conf y lo configuro para usar /dev/pps0 de referencia

refclock PPS /dev/pps0 refid PPS precision 1e-7 prefer

server 216.239.35.0 iburst
server 216.239.35.4 iburst
server 216.239.35.8 iburst
server 216.239.35.12 iburst
allow 0.0.0.0/0
allow ::/0
driftfile /var/lib/chrony/drift
rtcsync
makestep 1.0 -1
noclientlog
cmdport 0
minsources 2

Aquí enfrenté un problema y es que /dev/pps0 solo lo puede leer el usuario root, para ello configuré el udev rules para permitir lectura al grupo chrony

echo 'KERNEL=="pps0", OWNER="root", GROUP="chrony", MODE="0660"' > /etc/udev/rules.d/10-pps.rules

Una vez agregado, no olvides reiniciar!

reboot

Ahora podemos probar si nuestro chronyd está leyendo bien a través del device pps los impulsos del servicio de gps. Para ello ejecuto:
cgps -s

Y pasados unos segundos (usualmente menos de 15), tu servicio de GPS estará fijado (Fix), míralo en la línea que dice Status 3D FIX

Conexión de OpenVPN reiniciándose frecuentemente

OpenVPN es uno de los servidores de VPN más populares en nuestro mundo de Linux. En mi caso lo vengo utilizando hace unos 15 años, quizá más.

El día de ayer un cliente amigo (dueño de una PYME) me contactó que las conexiones hacia el servidor de VPN que le instalé hace varios años en su empresa le había comenzado a fallar. Lo que reportaba era que cada pocos minutos, a veces un minuto, a veces un poquito más, la conexión se le cerraba y tenía que volver a reconectarse.

Me llamó mucho la atención pues es un servidor que la verdad no toco, entro infrecuentemente al servidor, poquitas veces al año. Es un servidor puramente dedicado a OpenVPN, no realizan ninguna actividad en él. El servidor simplemente está ahi atendiendo las poquitas conexiones de VPN que maneja.

Es una persona muy proactiva y me envió el log de su cliente de VPN, copio aquí la parte más relevante:

Mon Jan 15 18:36:43 2024 us=578145 Initialization Sequence Completed
Mon Jan 15 18:36:43 2024 us=578145 MANAGEMENT: >STATE:1705361803,CONNECTED,SUCCE
SS,10.8.0.42,1.2.3.4,1194,,
Mon Jan 15 18:40:43 2024 us=841400 [server] Inactivity timeout (--ping-restart),
restarting
Mon Jan 15 18:40:43 2024 us=842159 TCP/UDP: Closing socket
Mon Jan 15 18:40:43 2024 us=842662 SIGUSR1[soft,ping-restart] received, process restarting
Mon Jan 15 18:40:43 2024 us=842662 MANAGEMENT: >STATE:1705362043,RECONNECTING,ping-restart,,,,,
Mon Jan 15 18:40:43 2024 us=842662 Restart pause, 5 second(s)

Encontré muchos comentarios en Internet con posibles soluciones, desde que los algoritmos de cifrado, hasta algo que me interesó mucho y era que el ping del cliente no coincidía con el ping del servidor, o que se debía usar keepalived. En verdad tiene muchas razones.

Pero hay una razón más, que me parece importante, y es que este problema también sale cuando hay una diferencia de hora entre el OpenVPN cliente y el OpenVPN servidor. Incluso si la diferencia de hora es pequeña (en el orden de segundos). Esto puede suceder.

Y me pareció la explicación más lógica porque es un equipo al que no se le hacen mayores cambios. La configuración que se usa es la misma durante varios años, por lo que si fuera un problema de configuración, hubiera sucedido ya hace mucho tiempo.

Alternativas de mitigación

Una propuesta de mitigación que encontré es configurar al servidor para que renegocie el canal (reneg-sec) en un periodo de tiempo más extendido. Por ejemplo, para que se renegocie el canal cada 8 horas. Así al menos la conexión, una vez negociada, duraría quizá 8 horas.

Por defecto el parámetro reneg-sec está en una hora, por lo que la sesión se renegocia cada una hora si esta no está definida.

El problema con reneg-sec es que debe ajustarse tanto en el cliente como en el servidor, ya que OpenVPN usará el menor valor definido en ambos extremos. Por ejemplo, podemos poner reneg-sec 86400 (un día) en el servidor, pero si tenemos reneg-sec 7200 (2 horas) en el cliente, entonces la renegociación ocurrirá cada 2 horas, el valor menor.

Imagínate si tuvieras decenas de clientes en diferentes partes del país, o en diferentes países, cómo cambiarías el reneg-sec en ellos?

Además, como indicaba la persona que proponía el cambio es que esto realmente es una mitigación porque no resuelve el problema, sino que lo dilata para que ocurra una vez cada 8 horas.

Solución propuesta

Y un problema adicional: mi amigo no tiene el parámetro reneg-sec configurado ni en clientes ni en servidor. Por lo tanto el periodo de renegociación es el valor por defecto de 3600 segundos. Y no sé si recuerdan que mencioné que realmente él no podía casi ni navegar, el OpenVPN se le desconectaba cada pocos minutos (1 o 2 minutos).

Entonces noto que la hora del servidor estaba desplazada, estaba adelantada más de 7 segundos respecto a la hora oficial.

Instalé y activé el servicio de NTPd en el servidor y una vez que el servidor tuvo la hora correcta, el problema ya no ocurrió más!

Lo más probable es que este servidor no se había apagado en varios años, pero, en vista de los apagones que han estado sucediendo en el país, posiblemente le pusieron un UPS que no está entregando una frecuencia estable, quizá no está a 60hz y al servidor lentamente la hora se le ha ido corriendo. Esta es mi opinión, puede ser por muchas razones más, pero creo que está relacionada con el problema energético ya que esto le comenzó a suceder recientemente luego de muchos años trabajando normalmente.

Conclusiones

Es importante tener este posible problema en cuenta. En este caso el problema estaba en el servidor. Pero debemos también pensar que puede ocurrir en uno de los clientes. En este último caso el problema se manifestaría solamente en un cliente.

Sugerimos que se instale y mantenga activo un servicio de tiempo (NTPd o Chrony) en nuestros servidores, todos, ya que como podemos ver, el mantener la hora correcta en nuestros servidores es fundamental por muchas razones.