# Chrony

**Chrony** és una implementació del protocol **NTP** (Network Time Protocol) dissenyada per sincronitzar el rellotge del sistema en entorns moderns. És la solució de sincronització horària per defecte a la majoria de distribucions Linux actuals (RHEL/Fedora des del 2014, Ubuntu des de la versió 22.04, Debian des de la versió 12).

# 1. Història i origen

- Desenvolupat per **Richard Curnow** a finals dels anys 90 com a alternativa a `ntpd`.
- Des del **2008** és mantingut per **Miroslav Lichvar** (Red Hat).
- Distribuït sota llicència **GPL v2**.
- El nom prové de *chronos* (χρόνος), paraula grega per "temps".
- A partir de **RHEL 7 / CentOS 7** (2014) va substituir `ntpd` com a implementació NTP per defecte.
- Codi font allotjat a: <https://chrony-project.org>

# 2. Chrony vs. ntpd vs. systemd-timesyncd

| Característica             | Chrony       | ntpd         | systemd-timesyncd |
|----------------------------|--------------|--------------|-------------------|
| Precisió                   | Molt alta    | Alta         | Baixa/mitjana     |
| Adaptació a xarxes inestables | Excel·lent | Bona      | Limitada          |
| Servidor NTP               | Sí           | Sí           | No                |
| Client NTP                 | Sí           | Sí           | Sí                |
| Ús en portàtils/VM         | Excel·lent   | Regular      | Acceptable        |
| Consum de recursos         | Baix         | Mitjà        | Molt baix         |
| Suport NTPv4               | Sí           | Sí           | Parcial           |
| Suport NTS (NTP Segur)     | Sí (>= 4.0)  | No           | No                |
| Hardware timestamping      | Sí           | Sí           | No                |
| Complexitat de configuració| Mitjana      | Alta         | Mínima            |

# 3. Components principals

| Component     | Descripció |
|---------------|------------|
| `chronyd`     | Dimoni principal que s'executa en segon pla |
| `chronyc`     | Client CLI per interactuar amb `chronyd` |
| `chrony.conf` | Fitxer de configuració principal |

# 4. Instal·lació

## Debian / Ubuntu

```bash
sudo apt install chrony
```

## Fedora / RHEL / CentOS

```bash
sudo dnf install chrony
```

## Arch Linux / Manjaro

```bash
sudo pacman -S chrony
```

## Gestió del servei

```bash
# Iniciar i habilitar a l'arrencada
sudo systemctl enable --now chronyd

# Estat del servei
sudo systemctl status chronyd

# Reiniciar
sudo systemctl restart chronyd
```

> [!NOTE]
> A Ubuntu, el servei pot anomenar-se `chrony` en lloc de `chronyd`.

# 5. Fitxer de configuració

## 5.1. Ubicació per distribució

| Distribució          | Ruta |
|----------------------|------|
| Debian / Ubuntu      | `/etc/chrony/chrony.conf` |
| Fedora / RHEL        | `/etc/chrony.conf` |
| Arch Linux           | `/etc/chrony.conf` |

## 5.2. Estructura bàsica

```ini
# Servidors NTP
pool 2.debian.pool.ntp.org iburst

# Fitxer de deriva del rellotge
driftfile /var/lib/chrony/drift

# Permet correccions grans d'hora a l'inici (< 3 segons, màx 3 vegades)
makestep 1.0 3

# Activa el rellotge de temps real del hardware
rtcsync

# Fitxer de log
logdir /var/log/chrony
```

# 6. Directives de configuració principals

## 6.1. Fonts de temps

```ini
# Servidor NTP individual
server ntp.example.com iburst

# Pool de servidors (recomanat; es connecta a múltiples)
pool pool.ntp.org iburst

# Peer (igual rang, sincronització mútua)
peer ntp2.example.com

# Rellotge de referència local (GPS, PPS, etc.)
refclock SHM 0 refid GPS precision 1e-1 offset 0.9999
```

**Opcions comunes per a `server` i `pool`:**

| Opció          | Descripció                                             |
|----------------|-------------------------------------------------------------------------|
| `iburst`       | Envia una ràfega de paquets a l'inici per sincronitzar ràpidament |
| `burst`        | Envia ràfegues periòdiques (no recomanat en servidors públics) |
| `minpoll N`    | Interval mínim de consulta (2^N segons, per defecte 6 = 64s) |
| `maxpoll N`    | Interval màxim de consulta (2^N segons, per defecte 10 = 1024s) |
| `prefer`       | Prefereix aquesta font sobre les altres |
| `noselect`     | Monitora, però no usa per sincronitzar |
| `offline`      | Marca la font com a fora de línia inicialment |
| `maxdelay N`   | Rebutja mostres amb latència superior a N segons |
| `key ID`       | Usa autenticació NTP simètrica amb la clau indicada |

## 6.2. Control d'accés

```ini
# Permet a una xarxa consultar l'hora (mode client)
allow 192.168.1.0/24

# Permet a tothom
allow all

# Denega accés
deny 10.0.0.5

# Permet però no serveix com a servidor de temps
noserve 192.168.2.0/24

# Permet ordres des de localhost
cmdallow 127.0.0.1
```

## 6.3. Correcció i estabilitat

```ini
# Correcció automàtica al principi (recomanat)
# Si la diferència és < 1s, corregeix fins a 3 cops
makestep 1.0 3

# Fitxer de deriva (guarda la freqüència de correcció)
driftfile /var/lib/chrony/drift

# Sincronitza el rellotge hardware (RTC) amb el del sistema
rtcsync

# Temps màxim de desviació permès (en segons)
maxdistance 1.5

# Correccions suaus d'hora (slewing) en lloc de salts bruscos
# (per defecte activat)
```

## 6.4. Logs

```ini
logdir /var/log/chrony

# Tipus de logs (es poden combinar)
log tracking measurements statistics

# Fitxer de seguiment (resum de l'estat actual)
# tracking: desviació, font seleccionada, deriva
# measurements: mostres de cada font NTP
# statistics: estadístiques de cada font
```

## 6.5. Configuració com a servidor NTP

```ini
# Permetre que clients de la xarxa local sincronitzin
allow 10.0.0.0/8

# Estratum local (si no hi ha accés a internet)
local stratum 10
```

## 6.6. NTS (Network Time Security) — NTPv4 segur

```ini
# Client NTS
server time.cloudflare.com iburst nts

# Servidor NTS (requereix certificat TLS)
ntsserverkey /etc/chrony/server.key
ntsservercert /etc/chrony/server.crt
ntsdumpdir /var/lib/chrony
```



# 7. Ús de `chronyc`

`chronyc` és la interfície de línia d'ordres per consultar i controlar `chronyd`.

## 7.1. Ordres d'estat

```bash
# Resum de l'estat de sincronització
chronyc tracking

# Llista de fonts NTP i la seva qualitat
chronyc sources

# Llista de fonts amb estadístiques detallades
chronyc sourcestats

# Informació sobre l'activitat del dimoni
chronyc activity

# Informació del servidor NTP (si actuem com a tal)
chronyc serverstats
```

## 7.2. Exemple de sortida de `chronyc tracking`

```ini
Reference ID    : C0A80101 (192.168.1.1)
Stratum         : 3
Ref time (UTC)  : Mon Jun 08 10:00:00 2026
System time     : 0.000012345 seconds fast of NTP time
Last offset     : +0.000010234 seconds
RMS offset      : 0.000015678 seconds
Frequency       : 12.345 ppm fast
Residual freq   : +0.001 ppm
Skew            : 0.234 ppm
Root delay      : 0.023456789 seconds
Root dispersion : 0.001234567 seconds
Update interval : 64.3 seconds
Leap status     : Normal
```

## 7.3. Exemple de sortida de `chronyc sources`

```ini
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* ntp1.example.com              2   6   377    45   +123us[ +456us] +/- 5678us
^- ntp2.example.com              2   6   377    46   -234us[ -567us] +/- 6789us
^? ntp3.example.com              0   8     0     -     +0ns[   +0ns] +/-    0ns
```

**Llegenda de la columna `MS`:**

| Símbol | Significat                   |
|--------|------------------------------|
| `*`    | Font seleccionada actualment |
| `+`    | Font acceptable, no seleccionada |
| `-`    | Font descartada per l'algorisme |
| `?`    | Font no accessible |
| `x`    | Font falsa (fals ticker) |
| `~`    | Font amb variació massa alta |

## 7.4. Ordres de control

```bash
# Forçar sincronització immediata
chronyc makestep

# Afegir una font NTP en temps real
chronyc add server ntp.example.com iburst

# Eliminar una font
chronyc delete ntp.example.com

# Posar una font en mode offline/online
chronyc offline
chronyc online

# Recarregar la configuració
chronyc reload sources

# Forçar escriptura del fitxer de deriva
chronyc writertc

# Mode interactiu
chronyc
```

## 7.5. Mode interactiu

```ini
chronyc
chronyc> tracking
chronyc> sources -v
chronyc> sourcestats -v
chronyc> quit
```

# 8. Estrats NTP (Stratum)

El concepte d'**estrat** indica la distància a la font de temps primària:

| Estrat | Descripció                                            |
|--------|-------------------------------------------------------|
| 0      | Rellotge de referència de maquinari (GPS, atòmic, ràdio) |
| 1      | Servidor directament connectat a un rellotge estrat 0 |
| 2      | Servidor sincronitzat amb un estrat 1 |
| 3      | Servidor sincronitzat amb un estrat 2 |
| ...    | ... |
| 15     | Màxim permès (estrats >= 16 = no sincronitzat) |
| 16     | No sincronitzat / no disponible |

# 9. Casos d'ús habituals

## 9.1. Client NTP bàsic (configuració mínima)

```ini
pool pool.ntp.org iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
```

## 9.2. Servidor NTP per a la xarxa local

```ini
pool pool.ntp.org iburst
allow 192.168.0.0/16
local stratum 10
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
logdir /var/log/chrony
log tracking measurements statistics
```

## 9.3. Integració amb Samba AD DC

```ini
pool pool.ntp.org iburst
allow 10.0.2.0/24
local stratum 10
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
# Samba necessita el socket NTP per signar paquets als clients del domini
ntpsigndsocket /var/lib/samba/ntp_signd
```


```bash
# Permisos necessaris per al socket de Samba
sudo chown root:_chrony /var/lib/samba/ntp_signd
sudo chmod 750 /var/lib/samba/ntp_signd
sudo systemctl restart chrony
```

## 9.4. Client en entorn sense internet (servidor intern)

```ini
server 10.0.0.1 iburst prefer
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
```

## 9.5. Màquina virtual (amb temps inestable)

```ini
pool pool.ntp.org iburst
# Correccions més agressives per compensar derives de la VM
makestep 0.1 -1
driftfile /var/lib/chrony/drift
maxdistance 16.0
```

## 9.6. Sincronització segura amb NTS

```ini
server time.cloudflare.com iburst nts
server nts.netnod.se iburst nts
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
ntsdumpdir /var/lib/chrony
```

# 10. Rellotges de referència de maquinari

Chrony pot sincronitzar directament amb dispositius de maquinari com GPS o PPS:

```ini
# GPS via shared memory (gpsd)
refclock SHM 0 refid GPS precision 1e-1 offset 0.9999 noselect

# PPS (Pulse Per Second) via kernel
refclock PPS /dev/pps0 refid PPS lock GPS

# GPS via socket (gpsd >= 3.x)
refclock SOCK /var/run/chrony.ttyS0.sock refid GPS
```

# 11. Autenticació NTP simètrica

```ini
# /etc/chrony/chrony.conf
server ntp.example.com key 1

# /etc/chrony/chrony.keys
1 SHA256 HEX:70C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9C9
```


```bash
# Generar una clau aleatòria
chronyc keygen 1 SHA256 256
```



# 12. Diagnosi i resolució de problemes

## 12.1. Verificar l'estat general

```bash
# Estat de sincronització
chronyc tracking

# Fonts disponibles
chronyc sources -v

# El dimoni corre?
systemctl status chronyd

# Logs del sistema
journalctl -u chronyd -f

# Logs de Chrony
tail -f /var/log/chrony/tracking.log
```

## 12.2. Problemes habituals


**Chrony no sincronitza:**

```bash
# Verificar connectivitat amb el servidor NTP
chronyc sources
# Si apareix '?' a la columna M, no hi ha connectivitat

# Forçar sincronització immediata
sudo chronyc makestep

# Verificar si el firewall bloqueja el port UDP 123
sudo ss -ulnp | grep 123
sudo ufw allow 123/udp   # si cal
```

**Diferència d'hora massa gran:**

```bash
# Chrony rebutja diferències > 1000s per defecte
# Solució temporal: sincronització manual
sudo systemctl stop chronyd
sudo ntpdate pool.ntp.org   # o date --set="..."
sudo systemctl start chronyd
```

**Conflicte amb systemd-timesyncd:**

```bash
# Desactivar systemd-timesyncd si s'usa Chrony
sudo systemctl disable --now systemd-timesyncd
sudo systemctl mask systemd-timesyncd
```

**Verificar que el port 123/UDP és accessible:**

```bash
# Des del client
sudo chronyc -a 'burst 4/4'
# O amb netcat (si disponible)
nc -zuv servidor.ntp.local 123
```

# 13. Seguretat

## 13.1. Bones pràctiques

- Usa `allow` explícit en lloc de `allow all` en producció.
- Activa **NTS** per a xifratge i autenticació en lloc de NTP simple.
- Limita `cmdallow` a `127.0.0.1` (per defecte).
- Usa el directori `/var/lib/chrony/` amb permisos restrictius.
- En servidors públics, activa `ratelimit` per evitar abús:

```ini
# Limita consultes per evitar amplificació DDoS
ratelimit interval 3 burst 8 leak 2
```


## 13.2. Firewall

```bash
# Obrir port NTP (si actua com a servidor)
sudo ufw allow 123/udp

# Amb firewalld (Fedora/RHEL)
sudo firewall-cmd --add-service=ntp --permanent
sudo firewall-cmd --reload
```

# 14. Fitxers i directoris importants

| Ruta                              | Descripció                             |
|-----------------------------------|----------------------------------------|
| `/etc/chrony/chrony.conf`         | Configuració principal (Debian/Ubuntu) |
| `/etc/chrony.conf`                | Configuració principal (Fedora/RHEL) |
| `/var/lib/chrony/drift`           | Fitxer de deriva del rellotge |
| `/var/lib/chrony/`                | Dades persistents de Chrony |
| `/var/log/chrony/`                | Logs de Chrony |
| `/run/chrony/`                    | Sockets i PID en temps d'execució |
| `/etc/chrony/chrony.keys`         | Claus d'autenticació NTP |


# 15. Recursos oficials

- **Web oficial:** <https://chrony-project.org>
- **Documentació:** <https://chrony-project.org/documentation.html>
- **Pàgina man:** `man chronyd`, `man chronyc`, `man chrony.conf`
- **Codi font:** <https://gitlab.com/chrony/chrony>
- **RFC 5905 (NTPv4):** <https://tools.ietf.org/html/rfc5905>

#### Versions d'aquest document

+ HTML - [chrony.html](https://proferamon.com/tic/chrony.html)
+ PDF - [chrony.pdf](https://proferamon.com/tic/docs/chrony.pdf)
+ ODT - [chrony.odt](https://proferamon.com/tic/odt/chrony.odt)
+ MD - [chrony.md](https://proferamon.com/tic/md/chrony.md)

[Domini Públic (CC0)](https://creativecommons.org/publicdomain/zero/1.0/deed.ca)

