ANUNCIE AQUI
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 servidor de fonte de data/hora. Exemplo: ao dar reset no relógio do carro, ele volta a data de 2017-01-01 00:00:00, 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 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);
- 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 utiliza;
- 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 a cada ano 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, responsável pela data/hora oficial terrestre. É a média de 80 relógios atômicos espalhados em vários paises. 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: 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 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 calculada diretamente de um relógio atômico, sem intermediários – diretamente conectado;
- 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;
- 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:
Bash
# Instalar servidor NTP: apt -y install ntp; 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:
Servidores NTP – 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:
Bash
# 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.
3 – Configurando o servidor NTP
A configuração inicial fica assim (/etc/ntpsec/ntp.conf):
/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):
Bash
# 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
Terminal
# 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)
Terminal
config sntp client sntp server 200.160.0.8 sntp source interface loopback-0 end commit
Juniper
Terminal
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
Terminal
# 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
Terminal
# 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
Terminal
/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
Terminal
/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)
Terminal
# 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