Sincronize seus dispositivos Linux ou BSD




NTP e NTS com Chrony

O Chrony é uma implementação moderna e versátil do NTP. É seguro e confiável e recomenda-se seu uso para as funções de cliente e servidor.

Em particular, para a função de cliente NTP, o Chrony é a principal recomendação do NTP.br . Isso por diversas razões: se configurado como aqui sugerido o chrony vai se comportar apenas como um cliente NTP, ou seja, não vai abrir um socket na porta 123 UDP e atender requisições. Ele também já suporta a RFC 9109, ou seja, suas requisições de origem usam portas altas e aleatórias, isso vai permitir seu funcionamento mesmo que seu provedor de Internet bloqueie o tráfego na porta 123, o que não é usual, mas as vezes é feito por provedores que atendem usuários domésticos, por razões de segurança. Além de tudo isso, ele funciona bem em situações em que a conectividade da rede é instável. Sua configuração é simples e suporta NTS.

Para GNU/Linux, FreeBSD, OpenBSD e outros sistemas baseados em Unix, utilize o método de instalação apropriado para sua distribuição. Aqui o exemplo utiliza o apt-get, usado em distribuições Linux como Debian e Ubuntu. Podem haver métodos alternativos para a instalação, por isso é recomendável consultar a documentação da sua distribuição ou sistema operacional.

apt-get install chrony

Segue recomendação para o arquivo de configuração para o cliente NTP (/etc/chrony/chrony.conf):


# servidores publicos do NTP.br com NTS disponível
server a.st1.ntp.br iburst nts
server b.st1.ntp.br iburst nts
server c.st1.ntp.br iburst nts
server d.st1.ntp.br iburst nts
server gps.ntp.br iburst nts

# caso deseje pode configurar servidores adicionais com NTS, como os da cloudflare e netnod
# nesse caso basta descomentar as linhas a seguir
# server time.cloudflare.com iburst nts
# server nts.netnod.se iburst nts

# arquivo usado para manter a informação do atraso do seu relógio local
driftfile /var/lib/chrony/chrony.drift

# local para as chaves e cookies NTS
ntsdumpdir /var/lib/chrony

# se quiser um log detalhado descomente as linhas a seguir
#log tracking measurements statistics
#logdir /var/log/chrony

# erro máximo tolerado em ppm em relação aos servidores
maxupdateskew 100.0

# habilita a sincronização via kernel do real-time clock a cada 11 minutos
rtcsync

# ajusta a hora do sistema com um "salto", de uma só vez, ao invés de
# ajustá-la aos poucos corrigindo a frequência, mas isso apenas se o erro
# for maior do que 1 segundo e somente para os 3 primeiros ajustes
makestep 1 3

# diretiva que indica que o offset UTC e leapseconds devem ser lidos
# da base tz (de time zone) do sistema
leapsectz right/UTC

Para reiniciar o serviço pode se utilizar o comando a seguir, ou veja as instruções apropriadas para sua distribuição ou sistema operacional:

service chrony restart

Para verificar o correto funcionamento e a correção do tempo, bem como o uso do NTS, os seguintes comandos podem ser utilizados:

# chronyc tracking
Reference ID    : 427DF641 (gps.jd.ntp.br)
Stratum         : 2
Ref time (UTC)  : Mon Jan 17 21:44:00 2022
System time     : 0.000008274 seconds fast of NTP time
Last offset     : +0.000028648 seconds
RMS offset      : 0.000020744 seconds
Frequency       : 0.073 ppm fast
Residual freq   : -0.017 ppm
Skew            : 0.296 ppm
Root delay      : 0.001207425 seconds
Root dispersion : 0.001151366 seconds
Update interval : 64.8 seconds
Leap status     : Normal

# chronyc sources
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^+ a.st1.ntp.br                  1   6   377    31    -83us[  -85us] +/- 1681us
^- b.st1.ntp.br                  1   6   377    33   +330us[ +329us] +/- 8236us
^? c.st1.ntp.br                  2   7   104   285   -212us[ -216us] +/- 9380us
^+ d.st1.ntp.br                  1   6   377    32    +74us[  +73us] +/- 4755us
^* gps.jd.ntp.br                 1   6   377    31    +23us[  +21us] +/- 1675us

# chronyc -N authdata
Name/IP address             Mode KeyID Type KLen Last Atmp  NAK Cook CLen
=========================================================================
a.st1.ntp.br                 NTS     1   15  256 1145    0    0    8  104
b.st1.ntp.br                 NTS     1   15  256 1144    0    0    8  100
c.st1.ntp.br                 NTS     1   15  256 1145    0    0    5  100
d.st1.ntp.br                 NTS     1   15  256 1145    0    0    8  100
gps.ntp.br                   NTS     1   15  256 1144    0    0    8  104




NTP e NTS com NTPsec

O NTPsec é uma versão segura, melhorada, auditada, simplificada e moderna do NTP. Derivada da implementação de referência do NTP, de David Mills. Suporta NTS. Recomenda-se seu uso para as funções de cliente e de servidor. Note que não é recomendado o uso da implementação de referência disponível em ntp.org.

O NTPsec é uma boa escolha para um servidor NTP, mas para um host que precisa apenas da função cliente é preferível utilizar o Chrony. O NTPSec sempre vai abrir um socket e atender a requisições na porta UDP 123, ou seja, sempre vai se comportar também como um servidor. Um firewall stateful ou uma rede que utiliza NAT podem evitar que as requisições cheguem ao computador. O NTPSec ainda não suporta a RFC 9109, ou seja, todas as requisições do cliente tem como porta de origem também a porta UDP 123. Ou seja, a implementação utiliza a porta UDP 123 tanto para origem, como para destino dos pacotes. Isso torna mais complexos firewalls visando evitar seu uso como servidor, deixando as opções de se utilizar um firewall stateful, ou de se utilizar regras estáticas que permitem apenas pacotes com destino à porta UDP 123 vindos dos servidores utilizados na configuração.

Para GNU/Linux, FreeBSD, OpenBSD e outros sistemas baseados em Unix, utilize o método de instalação apropriado para sua distribuição. Aqui o exemplo utiliza o apt-get, usado em distribuições Linux como Debian e Ubuntu. Podem haver métodos alternativos para a instalação, por isso é recomendável consultar a documentação da sua distribuição ou sistema operacional.

apt-get update
apt-get install ntpsec

Após instalar o ntp, crie o arquivo ntp.drift com o comando:

touch /var/lib/ntpsec/ntp.drift

Segue recomendação para o arquivo de configuração para o cliente NTP (/etc/ntpsec/ntp.conf):

# este é o caminho para o arquivo da base de dados de tz que lista
# os leap seconds, verifique se na sua distribuição específica
# ou sistema operacional o local está correto, caso não, ajuste
leapfile /usr/share/zoneinfo/leap-seconds.list

# "memoria" para o erro de frequencia do seu relógio
driftfile /var/lib/ntpsec/ntp.drift

# caso deseje guardar logs detalhados
# crie a pasta /var/log/ntpsec/ e descomente as linhas a seguir 
# statsdir /var/log/ntpsec/
# 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

# servidores publicos do NTP.br com NTS disponível
server a.st1.ntp.br iburst nts
server b.st1.ntp.br iburst nts
server c.st1.ntp.br iburst nts
server d.st1.ntp.br iburst nts
server gps.ntp.br iburst nts

# caso deseje pode configurar servidores adicionais com NTS, como os da cloudflare e netnod
# nesse caso basta descomentar as linhas a seguir
# server time.cloudflare.com iburst nts
# server nts.netnod.se iburst nts

# configuracoes de restricao de acesso
restrict default kod nomodify nopeer noquery limited
restrict 127.0.0.1
restrict ::1

É importante ressaltar que no NTPd era necessário acrescentar a linha disable monitor . Ela desabilitava o comando monlist, que podia ser explorado para gerar ataques amplificados de negação de serviço. Isso não é necessário no NTPsec.

Note que o NTPsec, como o NTPd original, ainda funciona simultaneamente como cliente e servidor. No uso exclusivo como cliente é importante configurar um firewall stateful evitando seu uso como servidor. Ou um firewall estático que bloqueie todos os pacotes entrantes para a porta UDP 123, com exceção daqueles originados dos servidores configurados no arquivo ntp.conf.

Para reiniciar o serviço pode se utilizar o comando a seguir, ou veja as instruções apropriadas para sua distribuição ou sistema operacional:

service ntpsec restart

Para verificar o correto funcionamento e a correção do tempo, bem como o uso do NTS, os seguintes comandos podem ser utilizados:

# ntpq -c rl
associd=0 status=0015 leap_none, sync_unspec, 1 event, clock_sync,
leap=00, stratum=2, precision=-24, rootdelay=1.235, rootdisp=193.219, refid=76.127.35.142,
reftime=e5906468.3488a82d 2022-01-17T21:55:52.205Z, tc=6, peer=17767, offset=0.04316, frequency=-0.193451, sys_jitter=0.076167,
clk_jitter=0.014379, clock=e5906583.33efaa5e 2022-01-17T22:00:35.202Z, processor="x86_64", system="Linux/5.10.0-10-amd64",
version="ntpd ntpsec-1.2.0 2021-06-17T05:15:04Z", clk_wander=0.000115, tai=37, leapsec="2017-01-01", expire="2022-06-28T", mintc=0

root@spo:/etc/chrony# ntpq -p
     remote                                   refid      st t when poll reach   delay   offset   jitter
=======================================================================================================
*a.st1.ntp.br                            .ONBR.           1 8   26   64   37   1.2346   0.1246  10.6169
+b.st1.ntp.br                            .ONBR.           1 8   24   64   37  16.5146  -0.3432   0.4991
 c.st1.ntp.br                            200.160.7.186    2 7   96   64    2   9.2888   0.3461   0.0000
+d.st1.ntp.br                            .ONBR.           1 8   27   64   37   9.5159   0.0381   0.0407
+gps.jd.ntp.br                           .GPS.            1 8   24   64   37   1.2771   0.1226   0.0470





OpenNTPD

O OpenNTPd é a alternativa criada pela comunidade do OpenBSD para o NTP, mas disponível também para outros sistemas. Ele é uma implementação parcial do protocolo, baseado nas RFCs 2030 e 1305. Ele é pequeno, seguro e fácil de configurar. Embora seja menos exato que o ntpsec ou chrony e por isso não recomendado para uso em servidores de tempo, é uma boa alternativa para sincronizar servidores em ambientes onde segurança e simplicidade sejam fundamentais. Contudo, não suporta NTS.

O OpenNTPD é exclusivamente um cliente. Não funciona como servidor. Ele também já suporta a RFC 9109, ou seja, suas requisições de origem usam portas altas e aleatórias, isso vai permitir seu funcionamento mesmo que seu provedor de Internet bloqueie o tráfego na porta 123, o que não é usual, mas as vezes é feito por provedores que atendem usuários domésticos, por razões de segurança. Dentre as três opções aqui apresentadas, este é o menor software, com menos linhas de código, e com um processo de auditoria de segurança mais sofsticado. Sua configuração é simples e à prova de erros: apenas uma linha indicando o pool de servidores. Contudo, não implementa a RFC 5905, apenas as RFCs 2030 e 1305. Ou seja, não implementa todos os algoritmos especificados no padrão NTP, apenas o formato compatível de troca de mensagens para consulta da hora certa, por isso é o menos preciso entre todos. Importante dizer que mesmo sendo o menos preciso, sua precisão é aceitável para a maioria das aplicações. Ele também não implementa a RFC 8915, o NTPSec, por isso recomenda-se utilizá-lo para a função de cliente apenas quando os servidores estiverem na rede local.

Para GNU/Linux, FreeBSD, OpenBSD e outros sistemas baseados em Unix, utilize o método de instalação apropriado para sua distribuição. Aqui o exemplo utiliza o apt-get, usado em distribuições Linux como Debian e Ubuntu. Podem haver métodos alternativos para a instalação, por isso é recomendável consultar a documentação da sua distribuição ou sistema operacional.

apt-get install openntpd

Segue recomendação para o arquivo de configuração para o cliente NTP (/etc/openntpd/ntpd.conf):

servers pool.ntp.br

Para verificar o funcionamento pode ser usado o seguinte comando:

# ntpctl -s all
8/8 peers valid, clock synced, stratum 2

peer
   wt tl st  next  poll          offset       delay      jitter
200.186.125.195 from pool pool.ntp.br
    1 10  2    6s   32s        -0.331ms     8.987ms     0.072ms
200.160.7.186 from pool pool.ntp.br
    1 10  1   11s   33s         0.041ms     1.491ms     0.394ms
200.20.186.76 from pool pool.ntp.br
    1 10  1   12s   32s         0.007ms     9.590ms     0.093ms
2001:12ff:0:7::197 from pool pool.ntp.br
 *  1 10  1   17s   33s         0.021ms     1.193ms     0.109ms
2001:12ff:0:7::186 from pool pool.ntp.br
    1 10  1    7s   30s         0.158ms     1.437ms     0.482ms
2001:12ff::8 from pool pool.ntp.br
    1 10  2    9s   33s         0.098ms     1.318ms     0.273ms
2001:12f8:b:1::8 from pool pool.ntp.br
    1 10  2   18s   31s        -0.645ms    17.158ms     0.540ms
2001:12f8:9:1::8 from pool pool.ntp.br
    1 10  2   17s   34s       -33.672ms   110.619ms     0.140ms




systemd-timesyncd

O systemd é o sistema de inicialização da maior parte das distribuições modernas de Linux. O systemd-tiesyncd é um daemon que foi adicionado ao systemd para sincronizar o relógio. Ele implementa um cliente SNTP e não o NTP completo. É executado com privilégios mínimos e está interligado ao networkd, de forma que é ativado apenas quando conectividade de rede está disponível. O deamon ainda salva o relógio em /etc/systemd/timesyncd.conf.d a cada sincronização, de forma a ajustar na inicialização sistemas que não possuem RTC, como o Raspberry Pi e sistemas embarcados, minimizando o erro do relógio. Ele também já suporta a RFC 9109, ou seja, suas requisições de origem usam portas altas e aleatórias.

O systemd-timesyncd é uma alternativa importante como cliente NTP porque já vem instalada e configurada por padrão na maioria das distribuições linux modernas. Ele pode ser perfeitamente mantido como cliente em desktops. Ou mesmo como cliente NTP para servidores Linux, quando as referências NTP estiverem na rede local.

Caso sua instalação seja necessária:

apt-get install systemd-timesyncd

Segue recomendação para o arquivo de configuração para o cliente NTP (/etc/systemd/timesyncd.conf):

[Time]
NTP=a.st1.ntp.br b.st1.ntp.br c.st1.ntp.br d.st1.ntp.br gps.ntp.br a.ntp.br b.ntp.br c.ntp.br

Para ativar:

# timedatectl set-ntp true
# service systemd-timesyncd restart

Para verificar o funcionamento podem ser usados os seguintes comandos:

# timedatectl status
               Local time: Tue 2022-01-18 21:01:12 EST
           Universal time: Wed 2022-01-19 02:01:12 UTC
                 RTC time: Wed 2022-01-19 02:01:13
                Time zone: America/New_York (EST, -0500)
System clock synchronized: yes
              NTP service: active
          RTC in local TZ: no

# timedatectl timesync-status
       Server: 2001:12ff:0:7::186 (a.st1.ntp.br)
Poll interval: 1min 4s (min: 32s; max 34min 8s)
         Leap: normal
      Version: 4
      Stratum: 1
    Reference: ONBR
    Precision: 1us (-22)
Root distance: 1.220ms (max: 5s)
       Offset: +743us
        Delay: 1.230ms
       Jitter: 0
 Packet count: 1
    Frequency: +37.826ppm

# timedatectl show-timesync
SystemNTPServers=a.st1.ntp.br b.st1.ntp.br c.st1.ntp.br d.st1.ntp.br gps.ntp.br a.ntp.br b.ntp.br c.ntp.br
FallbackNTPServers=0.debian.pool.ntp.org 1.debian.pool.ntp.org 2.debian.pool.ntp.org 3.debian.pool.ntp.org
ServerName=a.st1.ntp.br
ServerAddress=2001:12ff:0:7::186
RootDistanceMaxUSec=5s
PollIntervalMinUSec=32s
PollIntervalMaxUSec=34min 8s
PollIntervalUSec=1min 4s
NTPMessage={ Leap=0, Version=4, Mode=4, Stratum=1, Precision=-22, RootDelay=0, RootDispersion=1.022ms, Reference=ONBR, OriginateTimestamp=Tue 2022-01-18 21:05:05 EST, ReceiveTimestamp=Tue 2022-01-18 21:05:05 EST, TransmitTimestamp=Tue 2022-01-18 21:05:05 EST, DestinationTimestamp=Tue 2022-01-18 21:05:05 EST, Ignored=no PacketCount=1, Jitter=0 }
Frequency=12991




Servidores

Em alguns casos, quando por exemplo você tem uma rede muito grande, ou com equipamentos legados que não suportam NTS, pode ser conveniente ter servidores Linux, ou *BSD na função de servidores NTP. Os servidores NTP não precisam ser servidores dedicados para isso, visto que são muito leves. Três servidores são recomendados para redundância e melhor aproveitamento das características do NTP em relação a detecção de erros de sincronismo (o NTP compara os servidores entre si para decidir quais estão OK e quais estão com a hora errada). Nem todos os virtualizadores funcionam bem com NTP, em alguns o relógio segue sempre o relógio do host. Em outros não, o relógio também é virtualizado. Tome cuidado ao escolher instalar um servidor NTP em uma máquina virtual, prefira servidores físicos, se houver possibilidade.

No NTPSec a configuração sugerida para cliente já funciona também como servidor, bastando abrir a porta UDP 123 no firewall.

No Chrony é necessário acrescentar as diretivas allow apropriadas no arquivo de configuração, além da liberação no firewall da porta UDP 123.

# sua rede
allow 2001:db8::/32
allow 192.0.2.0/24

Em ambos os casos, seus servidores estarão consultando o NTP.br usando NTS, mas não serão em si servidores NTS. Caso você deseje criar servidores NTS o processo é um pouco mais complexo, exigindo alguns passos:

  • seu servidor tem que ter IPs públicos (v6 e v4, ou ao menos um deles) e um nome de domínio válido na Internet (para uso do certbot e letsencrypt);
  • você deve criar e instalar os certificados (usando por exemplo certbot e letsencrypt);
  • deve fazer a liberação no firewall das portas UDP 123 (NTP), TCP 4460 (NTS-KE) para as redes apropriadas, e TCP 80 (HTTP para o certbot funcionar);
  • deve fazer a configuração correta do NTPSec ou Chrony;

Para o NTPSec. Note que neste caso a restrição de para quais redes seu servidor vai funcionar deve ser feita no firewall:

# instalação do certbot (letsencrypt)
apt install ca-certificates certbot
certbot register --agree-tos --email seu-email@seudominio.com.br --no-eff-email
certbot certonly --standalone --preferred-chain "ISRG Root X1" --domain seu-servidor-ntp.com.br
cp -L -v /etc/letsencrypt/live/seu-servidor-ntp.com.br/fullchain.pem /etc/ntpsec/cert-chain.pem
cp -L -v /etc/letsencrypt/live/seu-servidor-ntp.com.br/privkey.pem /etc/ntpsec/key.pem
chown -R -v ntpsec: /etc/ntpsec

# exemplo de configuração de firewall
# nesse exemplo 192.168.100.1/24 e 2001:db8::/32 são suas redes
ufw allow proto udp from 192.168.100.1/24 to any port 123 comment 'NTP'
ufw allow proto udp from 2001:db8::/32 to any port 123 comment 'NTP'
ufw allow proto tcp from 192.168.100.1/24 to any port 4460 comment 'NTS-KE'
ufw allow proto tcp from 2001:db8::/32 to any port 4460 comment 'NTS-KE'
ufw allow 80/tcp comment 'HTTP'

# exemplo de configuração do /etc/ntpsec/ntp.conf para NTP e NTS 
driftfile /var/lib/ntpsec/ntp.drift
leapfile /usr/share/zoneinfo/leap-seconds.list
nts cert /etc/ntpsec/cert-chain.pem
nts key /etc/ntpsec/key.pem
nts enable
statsdir /var/log/ntpsec/
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
tos maxclock 11
server a.st1.ntp.br iburst nts
server b.st1.ntp.br iburst nts
server c.st1.ntp.br iburst nts
server d.st1.ntp.br iburst nts
server gps.ntp.br iburst nts
restrict default kod nomodify nopeer noquery limited
restrict 127.0.0.1
restrict ::1

Para o Chrony. Note que no caso do Chrony a restrição de para quais redes o servidor vai funcionar pode ser feita no firewall e no arquivo de configuração do próprio Chrony:

# instalação do certbot (letsencrypt)
apt install ca-certificates certbot
certbot register --agree-tos --email seu-email@seudominio.com.br --no-eff-email
certbot certonly --standalone --preferred-chain "ISRG Root X1" --domain seu-servidor-ntp.com.br
cp -L -v /etc/letsencrypt/live/seu-servidor-ntp.com.br/fullchain.pem /etc/chrony/cert-chain.pem
cp -L -v /etc/letsencrypt/live/seu-servidor-ntp.com.br/privkey.pem /etc/chrony/key.pem
chown -R -v chrony: /etc/chrony

# exemplo de configuração de firewall
# nesse exemplo 192.168.100.1/24 e 2001:db8::/32 são suas redes
ufw allow proto udp from 192.168.100.1/24 to any port 123 comment 'NTP'
ufw allow proto udp from 2001:db8::/32 to any port 123 comment 'NTP'
ufw allow proto tcp from 192.168.100.1/24 to any port 4460 comment 'NTS-KE'
ufw allow proto tcp from 2001:db8::/32 to any port 4460 comment 'NTS-KE'
ufw allow 80/tcp comment 'HTTP'

# exemplo de configuração do /etc/ntpsec/ntp.conf para NTP e NTS 
# 192.168.100.1/24 e 2001:db8::/32 são suas redes
allow 2001:db8::/32
allow 192.168.100.1/24
driftfile /var/lib/chrony/chrony.drift
keyfile /etc/chrony/chrony.keys
leapsectz right/UTC
log measurements statistics tracking rtc refclocks tempcomp
logdir /var/log/chrony
makestep 1 3
maxntsconnections 1024
maxupdateskew 100.0
ntsdumpdir /var/lib/chrony
ntsprocesses 4
ntsservercert /etc/chrony/cert-chain.pem
ntsserverkey /etc/chrony/key.pem
rtcsync
server a.st1.ntp.br iburst nts
server b.st1.ntp.br iburst nts
server c.st1.ntp.br iburst nts
server d.st1.ntp.br iburst nts
server gps.ntp.br iburst nts