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