Saudações. Vou te ensinar a criar um servidor NTP (Network Time Protocol) local sincronizado com os principais servidores do Brasil.
O NTP é a base de um sistema coerente: criptografia, logs, bancos de dados não podem prover consistência sem ter a data e hora fielmente precisa.
Pré-requisitos (constam em outros artigos aqui do blog):
- Instalação do Linux (Debian) e programas básicos;
- Internet fixa no servidor para sincronismo com os servidores NTP;
1 – Conceitos
O protocolo NTP fornece aos sistemas operacionais a possibilidade de obter a data e hora de baixa precisão (mili segundo) ou alta precisão (micro segundo e pico segundo).
A data e hora deve possuir uma fonte (relógio central) que determina a hora oficial no planeta Terra.
Definições e conceitos do tempo computacional:
- Relógio: artifício capaz de medir a passagem do tempo;
- Timestamp: registro de ano, mês, dia, segundo, mili segundo, micro segundo, … da data e hora em que se consulta um relógio, todo relógio precisa de um timestamp inicial para servir como fonte de data/hora. Exemplo: ao dar reset no relógio do carro, ele volta a data de 2017-01-01 00:00:00 – isso significa que o fabricante tem esse timestamp como padrão, e você deve ajustar oferecendo o timestamp coreto manualmente;
- Unix Timestamp: tempo relativo padrão Unix para armazenar data/hora em números inteiros. Mede a quantidade de segundos desde a data-zero que é 1970-01-01-00:00:00. Normalmente possui precisão de segundos, outras variações adicionam precisão adicional para transmitir e armazenar mili segundos, micro segundos, etc…;
- Relógio de quartzo/microcomponentes: principal mecanismo de medir a passagem do tempo em um computador, é usado pela BIOS para manter o relógio funcionando mesmo quando o computador/servidor está desligado, é chamado de relógio de hardware;
- Relógio de software: calcula a passagem do tempo usando os ciclos da CPU, normalmente é a fonte de data/hora e timestamp que todos os softwares em um sistema operacional;
- Relógio atômico: relógio que mede a passagem do tempo com precisão ultra-exata monitorando um núcleo de Césio (uso científico) ou Rubídio (uso profissional);
- Tempo universal: fonte de data/hora baseado em posição espacial:
- UTC: Coordinated Universal Time, fornece o padrão de data e hora do planeta Terra (não é “universal” de verdade!);
- LTC: Coordinated Lunar Time, fornece o padrão de data e hora na lua;
- MTC: fornece o padrão de data e hora em marte;
- Greenwich Mean Time (GMT): define que o horário no Meridiano de Greenwich (longitude 0). É o tempo oficial do planeta Terra;
- Leap Seconds: segundos que devem ser adicionados ou subtraídos de tempos em tempos (anos) na data/hora oficial devido ajustes de medição na rotação e translação do planeta;
- TAI (International Atomic Time): é o relógio oficial do planeta Terra, responsável pela data/hora oficial terrestre. É a média de 80 relógios atômicos espalhados em vários países. Fornece amostra de data/hora incluindo correções (leap seconds);
- GNSS (Global Navigation Satellite System) – satnav: sistema de satélites em órbita do planeta que possuem identificação, frequências de transmissão e órbita fixa. Cada satélite tem seu próprio relógio atómico a bordo e transmite o timestamp ultra preciso. Um receptor pode triangular a distância entre os satélites para determinar sua localização na superfície do planeta (GPS);
- Timezone (TZ): haja visto que o planeta Terra é redondo (geoide), cada “fatia” possui seu horário local, no Brasil estamos no UTC-3 (principal: America/Sao_Paulo), ou seja, nossa data e hora local é calculado subtraindo 3 horas da data/hora oficial GMT;
- Se um evento ocorre em 2023-12-25 10:45:29 UTC-3 ou apenas 2023-12-25 10:45:29, significa que aconteceu no horário local (-3 horas do GMT);
- A data/hora oficial e global do evento é 2023-12-25 13:45:29 UTC ou 2023-12-25 13:45:29 GMT;
- Profissionalmente, deve-se sempre adicionar após a data/hora qual é o fuso (UTC-x, UTC+x, UTC ou GMT);
- Stratum: fonte de data/hora precisa:
- Stratum 0 (zero): fonte de data/hora sincronizada ao TAI, com ou sem correção de leap seconds (cuidado), diz-se que um servidor está conectado a um stratum zero quando ele recebe o epoch (timestamp, amostra) de data/hora diretamente conectado em um relógio atômico TAI, sem intermediários ou buffer;
- Stratum 1 (um): quando o servidor/computador recebe o timestamp de data/hora UTC de um intermediário, normalmente é o tipo mais comum, pois contabiliza de maneira segura a média de vários servidores Stratum 0;
- Stratum 2 (dois) em diante (3, 4, 5): determina o número de saltos de intermediários entre o cliente NTP e a fonte de data/hora precisa. Quanto maior pior;
- NTP: protocolo que define os padrões para medir e transmitir timestamps entre cliente e servidor com o propósito de sincronizar relógios;
- Para que a latência e o jitter da rede entre o cliente NTP e o servidor NTP não causem ajustes constantes, o protocolo mede esse atraso para compensar o atraso do timestamp enviado pelo servidor, logo:
- (timestamp do servidor) + (atraso de transmissão) => timestamp_cliente;
- NTPSEC: o protocolo NTP utiliza pacotes UDP para transmissão das amostras, sem criptografia ou segurança de autenticidade, isso infelizmente permite que o NTP seja interceptado e fraudado, induzindo erros nos clientes NTP, que poderão ter seus relógios maculados. O NTPSEC adiciona camada TLS para criptografar a comunicação e prover segurança máxima;
Existem as seguintes formas de montar um servidor NTP (vou criar planos pra melhor entendimento):
- ULTRA: participar do grupo TAI, requer investimento absurdo, stratum zero, vou considerar como inviável – precisão sub nano-segundo;
- PREMIUM: adquirir hardware com relógio atômico baseado em Césio para medir a passagem do tempo com precisão e obter o timestamp por meio de GNSS, requer adição de leap seconds – precisão de pico-segundos;
- MAX: fazer a mesma operação acima, porem usando um hardware mais barato, como um relógio atômico de Rubídio (normalmente uma placa PCI Express) – precisão de micro-segundos;
- SOFTCLOCK: montar um servidor que consulte vários servidores NTP e faça uma mediana estável de latência até eles e então calcula um valor aceitável – precisão de milisegundos;
Obviamente, se você opera uma infra de TI e Telecom relevante e geograficamente distribuída por vários estados e países, deve montar um servidor PREMIUM em cada localidade.
Por padrão todos sistema operacional consulta um endereço de servidor NTP padrão (NTP da Apple, NTP.org, NTP da Microsoft).
Em ambientes de telecomunicações e TI de alta segurança, garantir um servidor NTP privado, confinado e protegido é a opção mais indicada.
Esse artigo visa a montagem de um servidor NTP SOFTCLOCK local, que futuramente poderá evoluir para um “MAX” ou “PREMIUM“!
2 – Instalando softwares
Instalando e ativando programas:
# Instalar servidor NTP:
apt -y install ntpsec;
apt -y install fping;
# Ativar durante o boot do Debian:
systemctl enable ntpsec;
# Fazer backup da config original:
CONF=/etc/ntpsec/ntp.conf;
ORIG=/etc/ntpsec/orig-ntp.conf;
[ -f "$ORIG" ] || cp -rav "$CONF" "$ORIG";
3 – Escolher servidores NTP de baixa latência
Esse passo é opcional, mas recomendado. Para garantir um relógio preciso e estável é desejável que consultemos apenas servidores de stratum 1 com latência estável e baixa.
Lista de principais servidores NTP do Brasil:
a.ntp.br
b.ntp.br
c.ntp.br
a.st1.ntp.br
gps.ntp.br
gps.jd.ntp.br
time.cloudflare.com
Repositório internacional de servidores NTP:
Teste o ping para os servidores, escolha pelo menos 4 servidores com a menor latência:
# Efetuar 10 pings ICMP por servidor:
# - Ping em IPv4:
fping -4 -C 10 -q -B1 -r1 -i1 \
a.ntp.br b.ntp.br c.ntp.br \
a.st1.ntp.br gps.ntp.br gps.jd.ntp.br \
time.cloudflare.com;
# Exemplo de resultado do comando acima:
# a.ntp.br : 49.8 49.9 49.8 49.8 49.8 49.8 49.9 49.8 49.8 49.8
# b.ntp.br : 50.2 50.2 50.2 50.2 50.1 50.1 50.1 50.1 50.1 50.1
# c.ntp.br : 54.5 54.5 54.6 54.6 54.5 54.6 54.6 54.5 54.5 54.6
# a.st1.ntp.br : 50.1 50.1 50.1 50.1 50.1 50.1 50.1 50.0 50.1 50.1
# gps.ntp.br : 52.8 52.8 52.8 52.8 52.8 52.8 52.8 52.8 52.8 52.8
# gps.jd.ntp.br : 52.8 52.7 52.7 52.7 52.7 52.7 52.7 52.7 52.7 52.7
# time.cloudflare.com : 24.6 24.6 24.6 24.5 24.5 24.5 24.5 24.5 24.5 24.6
#
# - Ping em IPv6, caso possua IPv6 no servidor:
fping -6 -C 10 -q -B1 -r1 -i1 \
a.ntp.br b.ntp.br c.ntp.br \
a.st1.ntp.br gps.ntp.br gps.jd.ntp.br \
time.cloudflare.com;
# Exemplo de resultado do comando acima:
# a.ntp.br : 49.8 49.8 49.8 49.8 49.9 49.9 49.8 49.8 49.8 49.8
# b.ntp.br : 50.2 50.2 50.2 50.2 50.2 50.2 50.2 50.1 50.2 50.2
# c.ntp.br : 54.5 54.5 54.5 54.6 54.5 54.6 54.6 54.5 54.6 54.6
# a.st1.ntp.br : 50.1 50.1 50.1 50.1 50.1 50.1 50.1 50.1 50.1 50.1
# gps.ntp.br : 52.8 52.7 52.7 52.7 52.7 52.8 52.7 52.7 52.8 52.8
# gps.jd.ntp.br : 52.7 52.7 52.8 52.8 52.7 52.8 52.7 52.7 52.7 52.7
# time.cloudflare.com : 23.1 23.0 23.1 23.0 23.0 23.2 23.1 23.0 23.0 23.1
#
Podemos observar que a latência para a CloudFlare (time.cloudflare.com) é melhor por conta da natureza Anycast-BGP dos serviços dela.
4 – Configurando o servidor NTP
A configuração inicial fica assim (/etc/ntpsec/ntp.conf):
driftfile /var/lib/ntpsec/ntp.drift
leapfile /usr/share/zoneinfo/leap-seconds.list
tos maxclock 11
tos minclock 4 minsane 3
pool time.cloudflare.com iburst
pool a.ntp.br iburst
pool b.ntp.br iburst
pool c.ntp.br iburst
restrict default kod nomodify nopeer noquery limited
restrict 127.0.0.1
restrict ::1
Script simplificado (basta colar):
# Preencher a config:
(
echo;
echo 'driftfile /var/lib/ntpsec/ntp.drift';
echo 'leapfile /usr/share/zoneinfo/leap-seconds.list';
echo;
echo 'tos maxclock 11';
echo 'tos minclock 4 minsane 3';
echo;
echo 'pool time.cloudflare.com iburst';
echo 'pool a.ntp.br iburst';
echo 'pool b.ntp.br iburst';
echo 'pool c.ntp.br iburst';
echo;
echo 'restrict default kod nomodify nopeer noquery limited';
echo 'restrict 127.0.0.1';
echo 'restrict ::1';
echo;
) > /etc/ntpsec/ntp.conf;
# Reiniciar ntpsec:
systemctl restart ntpsec;
# Consultar lista de sincronismo NTP esterno (servidores NTP na internet)
ntpq -p;
# Saida (exemplo):
# remote refid st t when poll reach delay offset jitter
#===================================================================================
# time.cloudflare.com .POOL. 16 p - 256 0 0.0000 0.0000 0.0001
# a.ntp.br .POOL. 16 p - 256 0 0.0000 0.0000 0.0001
# b.ntp.br .POOL. 16 p - 256 0 0.0000 0.0000 0.0001
# c.ntp.br .POOL. 16 p - 64 0 0.0000 0.0000 0.0001
# time.cloudflare.com 10.196.8.27 3 u - 64 1 23.0239 -0.7812 0.0079
#*time.cloudflare.com 10.196.8.27 3 u 1 64 1 24.6341 -1.5069 0.0262
# time.cloudflare.com 10.196.8.27 3 u 1 64 1 26.0819 -2.3131 0.0638
#+time.cloudflare.com 10.196.8.27 3 u 1 64 1 26.0266 -2.3102 0.0315
# a.ntp.br 76.127.35.142 2 u - 64 1 49.7502 -7.4152 0.1528
# a.ntp.br 200.160.7.186 2 u - 64 1 49.8853 -7.4619 0.0179
# b.ntp.br 200.20.186.76 2 u 3 64 1 53.2170 -28.7261 0.0439
#-b.ntp.br 200.20.186.76 2 u - 64 1 138.1674 18.6254 0.2541
4 – Configurando clientes
Exemplos de equipamentos e seus comandos para configurar NTP. Nos exemplos vou colocar os IPs dos servidores a.ntp.br e b.ntp.br, você deverá trocar pelo IP do seu servidor NTP próprio.
Huawei
# Timezone (Brasil: -3 no leste, -4 no oeste)
clock timezone BR minus 03:00:00
# Desativar servidor NTP local (opcional)
ntp-service server disable
ntp-service ipv6 server disable
# NTP como cliente:
# - a.ntp.br ( 200.160.0.8 2001:12ff::8 )
# - b.ntp.br ( 200.189.40.8 2001:12f8:9:1::8 )
# Usar servidor NTP - transporte via IPV4
ntp-service unicast-server 200.160.0.8
ntp-service unicast-server 200.189.40.8
# ou:
ntp-service unicast-server 200.160.0.8 source-interface LoopBack 0
ntp-service unicast-server 200.189.40.8 source-interface LoopBack 0
# Usar servidor NTP - transporte via IPV6
ntp unicast-server ipv6 2001:12ff::8
ntp unicast-server ipv6 2001:12f8:9:1::8
# ou:
ntp unicast-server ipv6 2001:12ff::8 source-interface LoopBack 0
ntp unicast-server ipv6 2001:12f8:9:1::8 source-interface LoopBack 0
# Aplicar (linha N, NE e CE apenas):
commit
# Salvar:
run save
y
# Verificar:
display clock
display clock utc
display ntp status
Datacom (DMOS)
config
sntp client
sntp server 200.160.0.8
sntp source interface loopback-0
end
commit
Juniper
delete system ntp
set system ntp boot-server 200.160.0.8
set system ntp server 200.160.0.8
set system ntp server 200.189.40.8
set system ntp source-address 45.255.128.2
commit
VyOS
# Configurar timezone
set system time-zone America/Sao_Paulo
# Configurar servidores NTP
delete service ntp server
set service ntp server 200.160.0.8
set service ntp server 200.189.40.8
commit
save
Cisco
# Configurar
configure terminal
clock timezone EST -3
ntp source Loopback0
ntp server 200.160.0.8
ntp server 200.189.40.8
end
# Salvar
write
copy runn start
# Conferir:
show ntp associations
show ntp status
show clock
Mikrotik v6
/system clock
set time-zone-autodetect=no time-zone-name=America/Sao_Paulo
/system ntp client
set enabled=yes primary-ntp=200.160.0.8 secondary-ntp=200.189.40.8
Mikrotik v7
/system clock
set time-zone-autodetect=no time-zone-name=America/Sao_Paulo
/system ntp client
set enabled=yes ervers=200.160.0.8,200.189.40.8
Debian (outro que não seja o servidor NTP)
# Definindo como America/Sao_Paulo (UTC-3):
timedatectl set-timezone America/Sao_Paulo;
# Instalar pacote de sincronismo NTP via systemd (costuma vir instalado):
apt -y install systemd-timesyncd;
# Ativar durante o boot:
systemctl enable systemd-timesyncd;
# Backup da config original:
ORIG=/etc/systemd/orig-timesyncd.conf;
CONF=/etc/systemd/timesyncd.conf;
[ -f "$ORIG" ] || cp -rav "$CONF" "$ORIG";
# Configurando manualmente:
(
echo;
echo '[Time]';
echo 'NTP=200.160.0.8 200.189.40.8';
echo 'FallbackNTP=200.20.186.75 200.20.186.94';
echo 'RootDistanceMaxSec=5';
echo 'PollIntervalMinSec=32';
echo 'PollIntervalMaxSec=2048';
echo 'ConnectionRetrySec=30';
echo 'SaveIntervalSec=60';
echo;
) > /etc/systemd/timesyncd.conf;
# Reiniciando o servico de timesync:
systemctl restart systemd-timesyncd;
# Conferindo servidores NTP em uso:
timedatectl show-timesync;
timedatectl show-timesync --all;
Terminamos por hoje!
Patrick Brandão, patrickbrandao@gmail.com