Configurando data e hora em servidor atrás de firewall com porta NTP bloqueada

Publicado por Thomas Pirajá Hansen em 05/10/2012

[ Hits: 11.951 ]

 


Configurando data e hora em servidor atrás de firewall com porta NTP bloqueada



Essa dica é para quem tem um servidor GNU/Linux rodando atrás de um firewall que bloqueie a porta 123 (NTP).

Por padrão, o GNU/Linux é capaz de sincronizar o relógio interno do seu computador via protocolo NTP (você pode configurar isso para ser automático utilizando o comando ntpdate - há diversos tutoriais para isso na rede).

Além disso, atualizar a data e hora costuma não ser muito crítico - exceto quando você está rodando o seu servidor em ambiente de virtualização.

Explico: Dependendo da solução de virtualização adotada, quando você suspende uma máquina, ela também suspende o RELÓGIO dela, de forma que, quando ela volta ao ar, está com a data e hora de quando foi desligada!

O que fazer nessa hora? Bom, você tem duas alternativas básicas:

1 - Corrigir a data manualmente, via sudo date -s, toda vez que você reativar a sua VM com GNU/Linux;
2 - Seguir esta dica! :D

Bom, esta solução é baseada em texto. Primeiro, vamos usar Wget, grep e sed, para obter a hora do servidor da Google:

wget -S --spider "http://www.google.com/" 2>&1 | grep -E -m1 '^[[:space:]]*[dD]ate:' | sed 's/^[[:space:]]*[dD]ate:[[:space:]]*//'

Não vou explicar detalhadamente o que o comando a seguir faz, mas de uma forma geral, é:
  • Resgata o index da Google;
  • Acha a linha que tem a data e hora do sistema;
  • Limpa essa linha, deixando apenas a data e a hora do sistema.

OK, testou bonitinho? Já sabe que funciona? Então, vamos utilizar essa linha como input no comando date -s, para atualizar o relógio do sistema!

Lembrando que você precisa de permissões de superusuário para isso, então, vamos utilizar o sudo:

sudo date -s "`wget -S --spider "http://www.google.com/" 2>&1 | grep -E -m1 '^[[:space:]]*[dD]ate:' | sed 's/^[[:space:]]*[dD]ate:[[:space:]]*//'`"

O shell vai pedir a senha de seu usuário privilegiado, e atualizar a data do sistema. Fácil, né?

Então, a penúltima parte: Vamos deixar isso automatizado no boot! digite:

sudo nano /etc/rc.local

Edite o arquivo, copiando a seguinte linha ANTES do comando: exit 0

date -s "`wget -S --spider "http://www.google.com/" 2>&1 | grep -E -m1 '^[[:space:]]*[dD]ate:' | sed 's/^[[:space:]]*[dD]ate:[[:space:]]*//'`"


Note que aqui, você não precisa de sudo, já que o script "rc.local" é executado como superusuário.

Agora, seu computador atualiza a hora toda vez que você o reinicia!

Só faltou uma coisa: O caso das VMs! Bom, aí você tem que criar uma regrinha no Crontab, para que o comando seja executado automaticamente a cada 5 ou 10 minutos, e assim, manter o sistema atualizado.

Bom, para isso, você precisa configurar o Crontab do superusuário, e não o seu! Por isso, vamos invocar o editor de Crontab com sudo:

sudo crontab -e

Obs.: Se ele perguntar qual editor você quer utilizar, selecione o Nano, que é o mais fácil deles.

Vá no fim do arquivo, e digite a seguinte linha:

5 * * * * date -s "`wget -S --spider "http://www.google.com/" 2>&1 | grep -E -m1 '^[[:space:]]*[dD]ate:' | sed 's/^[[:space:]]*[dD]ate:[[:space:]]*//'`"


Isso vai configurar o seu sistema para, a cada 5 minutos, executar o comando acima e sincronizar o seu sistema!

Boa sorte a todos!

Outras dicas deste autor

Configurando atalho para terminal no Linux Mint 16 Cinnamon

Corrigindo falta de rede em uma Máquina Virtual (VM) Linux copiada

Gitso - Suporte remoto em redes com internet compartilhada

Mudando o lado dos ícones do Google Chrome, no Ubuntu

Leitura recomendada

Login automático em máquinas remotas

Erro: 'locale: Cannot Set LC_ALL' no Slackware [Resolvido]

Fedora 12 e Vmplayer 3.0

Sistema Personalizado - Recuperação após formatação

Iniciando Debian 8 em modo texto (bem simples)

  

Comentários
[1] Comentário enviado por henriquepk em 08/01/2016 - 18:57h

Não tem como fazer esse comando

5 * * * * date -s "`wget -S --spider "http://www.google.com/" 2>&1 | grep -E -m1 '^[[:space:]]*[dD]ate:' | sed 's/^[[:space:]]*[dD]ate:[[:space:]]*//'`"


executar em segundos?



Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts