Как синхронизировать время в linux

Введение

Любая работа с сервером после чаще всего начинается со стандартных обязательных действий, без которых либо не получится продвинуться дальше, либо будет неудобно работать. Например, вам в любом случае необходимо выполнить сетевые настройки, желательно обновить систему и установить часовой пояс. Рекомендуется сразу настроить автообновление времени, подрихтовать параметры sshd, установить midnight commander и выполнить другие настройки.

Об этом я хочу рассказать в статье. Я буду делиться своим реальным опытом работы. Это не значит, что нужно делать так, как я. Я могу в чем-то ошибаться, что-то делать не так удобно, как можно было бы сделать. Это просто советы, которые кому-то помогут узнать что-то новое, а кто-то возможно поделится со мной чем-то новым для меня, либо укажет на мои ошибки. Мне бы хотелось, чтобы это было так. Своими материалами я не только делюсь с вами знаниями, но и сам узнаю что-то новое в том числе и из комментариев и писем на почту.

Введение

Во время установки Debian, сервер автоматически настраивает системное время на основе информации из bios. Инсталлятор предлагает вам выбрать только часовой пояс. При этом, если вы не правильно указали часовой пояс (timezone), его без проблем можно изменить после установки.

Так же ситуация, когда необходимо изменить время или часовой пояс, может возникнуть, если вы арендуете сервер за границей и вам разворачивают систему из готового образа. В таком случае timezone может быть указана не такая, как вы хотите. Надо будет изменить.

Зачем, собственно, следить за точным временем на сервере, кроме непосредственно удобства восприятия этого времени? Причин может быть много. Перечислю основные, которые пришли в голову.

Точное время на сервере необходимо для корректного логирования всех событий и последующего расследования инцидентов. Более того, одинаковое время должно быть на всех серверах, которые участвуют в работе информационной системы. Если это не так, то расследование инцидентов становится затруднительным.
В доменной середе Windows для корректной работы протокола аутентификации Kerberos требуется примерно одинаковое время на всех участниках домена

Если ваш сервер Debian является членом домена, важно, чтобы его время не сильно отличалось от времени контроллера домена. Его нужно обязательно синхронизировать с ним.
На сервере может располагаться какой-то сервис, который взаимодействует с пользователями

Например, новостной сайт, где в статьях указано точное время публикации. Если неправильно настроить часы или timezone, может возникнуть ситуация, когда для некоторых пользователей опубликованные материалы будут отображаться со временем из будущего.
Планировщик cron в своей работе использует системные часы. Если вы хотите предсказуемое поведение запланированных задач, время и часовой пояс должны быть настроены правильно.

Для избежания этих и других проблем, предлагаю приступить к настройке времени, даты и часового пояса на сервере под управлением системы Debian.

Синхронизация времени с помощью ntpdate, timedatectl

После того, как вы настроили правильную дату и нужный часовой пояс, стоит поработать над тем, чтобы часы всегда показывали точное значение минут и часов. Для этого надо настроить синхронизацию времени. Тут традиционно для linux есть несколько способов и вариантов настройки.

Первый и самый простой способ синхронизации времени в ubuntu — воспользоваться известной утилитой ntpdate.

sudo apt install ntpdate

В качестве параметра ntpdate принимает адрес сервера точного времени, с которого будет произведена синхронизация локальных часов. Я предлагаю воспользоваться популярным пулом серверов точного времени — pool.ntp.org.

sudo ntpdate pool.ntp.org

Пул автоматически выбрал сервер точного времени, с которым мы синхронизировали свои часы. Один из способов автоматизации этого процесса является запуск ntpdate через cron. Но это не очень удобное решение, так как есть более эффективные способы. Например, с помощью локальной службы ntp или chrony, а так же компонента systemd — timesyncd.

После установки системы вам стоит проверить, а не запущена ли у вас уже синхронизация времени с помощью timesyncd. Проверяем:

timedatectl timesync-status

Так и есть. В большинстве современных дистрибутивов, где установлена systemd, уже запущена timesyncd. Параметры этой службы находятся в конфигурационном файле /etc/systemd/timesyncd.conf, где можно посмотреть, какой сервер используется для синхронизации времени и в случае необходимости, заменить. В Ubuntu это ntp.ubuntu.com. Большого смысла менять его на другой сервер нет. Если только вы не хотите синхронизировать время с какого-то своего локального сервера. Как это сделать, я расскажу отдельно ниже.

Клиент ntp

Если вас по какой-то причине не устраивает служба timesyncd, можете ее отключить.

sudo systemctl stop systemd-timesyncd
sudo systemctl disable systemd-timesyncd

А в место нее установить, к примеру, ntp, работающую в режиме клиента.

sudo apt install ntp

Поясню немного, зачем это может понадобиться. Если вам необходимо только синхронизировать время, то утилиты timesyncd вполне хватает для этой простой задачи. Но иногда вам нужен более широкий функционал. Например, вы хотите настроить в своей локальной сети свой собственный сервер времени, чтобы остальные компьютеры сверяли свои часы с ним. В этом случае вам нужна будет служба ntp. А раз вы ее и так поставите, то зачем вам дублирование функционала? В этом случае имеет смысл отключить timesyncd и оставить только ntp. Она умеет работать и в качестве сервера времени, и в качестве клиента синхронизации.

Итак, установили ntp. Для того, чтобы синхронизировать время, достаточно ее просто запустить:

sudo systemctl enable --now ntp

Проверяем статус синхронизации:

sudo systemctl status ntp

Видим пул серверов времени, с которыми наш ubuntu server будет синхронизировать свои часы. Настройки службы находятся в конфигурационном файле /etc/ntp.conf. Посмотреть информацию о работе ntp можно с помощью утилиты ntpq:

ntpq -p

Далее рассмотрим вариант, когда вам нужен свой сервер времени в локальной сети. Для этого донастроим установленную службу ntp.

Указываем сетевые параметры

Итак, у нас в наличии только что установленная система. Узнать или проверить ее версию можно командами:

# uname -a
Linux debian10 4.19.0-5-amd64 #1 SMP Debian 4.19.37-5 (2019-06-19) x86_64 GNU/Linux
# lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 10 (buster)

Release: 10
Codename: buster

Посмотреть список пакетов, готовых к обновлению, можно с помощью команды:

# apt list —upgradable

Ключ upgrade
выполняет только обновление одной версии пакета на другую, более свежую. Он не будет устанавливать или удалять пакеты, даже если это необходимо для обновления других. Это наиболее безопасный и надежный вариант обновления, но он может обновить не все. Например, с ее помощью не обновить ядро до более свежей версии.

Ключ dist-upgrade
или full-upgrade
(это одно и то же) в дополнение к upgrade обрабатывает все изменения зависимостей для новых пакетов и во время работы может удалять ненужные и ставить необходимые пакеты для обновления. Вот выдержка из документации по поводу этих двух ключей.

Так что после обычного обновления, делаем еще full-upgrade.

# apt full-upgrade
Reading package lists… Done
Building dependency tree
Reading state information… Done
Calculating upgrade… Done
The following packages were automatically installed and are no longer required:
dh-python guile-2.0-libs libbind9-140 libdns162 libicu57 libisc160 libisccc140 libisccfg140 liblvm2app2.2 liblvm2cmd2.02 liblwres141 libperl5.24
libpython3.5-minimal libpython3.5-stdlib linux-image-4.9.0-3-amd64 python3-distutils python3-lib2to3 python3.5 python3.5-minimal rename sgml-base tcpd
xml-core
Use «apt autoremove» to remove them.
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.

Мне предлагается удалить старые пакеты, которые больше уже не нужны. Это зависимости от старых версий софта, который уже обновился и получил новые пакеты из зависимостей, а эти ему больше не нужны. Очистим их командой:

На этом обновление системы закончено. Если вы хотите обновить версию релиза, например , то читайте отдельный материал.

Синхронизация времени с помощью ntp и ntpdate

Если вам по какой-то причине не подходит описанная выше синхронизация, либо вам нужен свой сервер времени в сети, то timesyncd можно выключить.

# systemctl stop systemd-timesyncd
# systemctl disable systemd-timesyncd

Проверяем.

# timedatectl

Отключение systemd-timesyncd

Покажу теперь простую утилиту ntpdate, с помощью которой можно разово синхронизировать время, не автоматически. Для начала ее нужно установить в систему.

# apt install ntpdate

Дальше запускаем для разовой синхронизации.

# ntpdate pool.ntp.org
ntpdate: adjust time server 85.21.78.91 offset -0.020548 sec

В данном случае pool.ntp.org — адрес сервера времени. Можно использовать любой. Все, время синхронизировано и никаких автоматических служб не запущено.

Если у вас ntpdate выдает ошибку — the NTP socket is in use, exiting, значит у вас уже установлена и запущена служба ntp, которая заняла udp порт 123, необходимый для работы ntpdate. Установкой и настройкой этой службы мы и займемся далее. Также, если ntpdate не работает, посмотрите материал, может это ваш случай.

Для обновления времени сервера можно воспользоваться службой ntp. Ее так же надо установить отдельно.

# apt install ntp

Это старая проверенная служба времени, которую использовали еще задолго до появления systemd и его юнитов. Запустим ее и добавим в автозагрузку.

# systemctl start ntp
# systemctl enable ntp

После запуска она сразу же автоматически синхронизирует время. Проверим статус службы ntp в Debian.

# systemctl status ntp

Настройка ntp

Синхронизация времени через ntp заработала сразу же. Дополнительная настройка не нужна, если вас не интересует свой сервер времени, который мы настроим ниже.

При этом, для проверки статуса службы времени ntp можно использовать утилиту ntpq. Посмотрим статус синхронизации.

# ntpq -p

Статус синхронизации времени ntp

Поясню значения каждого столбца.

remote Адрес удаленного эталона времени, с которого была синхронизация
refid Указывает, откуда каждый эталон получает точное время. Это могут быть другие сервера времени, система GPS и другое
st Stratum (уровень) это число от 1 до 16, которое указывает на точность эталона. 1- максимальная точность, 16 — сервер недоступен. Уровень вашего сервера будет равен уровню наименее точного удаленного эталона плюс 1.
poll Интервал в секундах между опросами
reach Восьмеричное представление массива из 8 бит, отражающего результаты последних восьми попыток соединения с эталоном. Бит выставлен, если удаленный сервер ответил.
delay Время задержки ответа на запрос о точном времени
offset Разница между вашим и удаленным сервером
jitter Дисперсия (Jitter) — это мера статистических отклонений от значения смещения (поле offset) по нескольким успешным парам запрос-ответ. Чем меньше значение дисперсии, тем лучше, поскольку позволяет точнее синхронизировать время.

Ошибки синхронизации времени

TIME_ERROR: 0x2041: Clock Unsynchronized

Иногда в логе /var/log/ntp.log или системном логе /var/log/syslog вы можете наблюдать ошибку — kernel reports TIME_ERROR: 0x2041: Clock Unsynchronized

На нее можно не обращать внимание, так как реально это не ошибка, а информационное сообщение. Нам просто сообщают о том, что в момент страта службы ntp, ядро linux еще не синхронизировало время

the NTP socket is in use, exiting

Если при запуске синхронизации времени с помощью ntpdate вы видите ошибку — the NTP socket is in use, exiting, то это значит, что у вас уже запущена служба ntp. Для того, чтобы не было конфликтов при изменении времени, должно работать что-то одно, либо ntpdate, либо ntp, но не оба одновременно. Чтобы эта ошибка исчезла, достаточно просто остановить ntp и запустить ntpdate еще раз.

no server suitable for synchronization found

Еще одна популярная ошибка, которая может возникнуть при запуске ntpdate. Она означает, что не получается по какой-то причине установить соединение с сервером времени. В общем случае это означает, что есть какие-то сетевые проблемы, но не обязательно. Вы можете попробовать запустить ntpdate c ключом -u. Он означает, что будет использован локальный не 123-й порт udp, как обычно, а другой из непривилегированного диапазона. Иногда это помогает, так как многие провайдеры из-за известной уязвимости протокола ntp блокируют исходящий 123 порт.

ntpdate -u pool.ntp.org

Служба ntp не запускается после загрузки сервера

Если ntp не стартует после загрузки сервера, то связано это может быть в первую очередь с тем, что не отключена служба timesyncd. Отключите ее и проверьте еще раз:

sudo timedatectl set-ntp no

Ubuntu меняет время и часовой пояс в bios

Убунта имеет дурную привычку при синхронизации времени устанавливать в bios часовой пояс UTC. В общем случае это не доставляет проблем, но если у вас установлена параллельно еще какая-то система на компьютере, то это может создавать проблемы. Чтобы Ubuntu не трогала часы в bios, необходимо выполнить следующую команду:

sudo timedatectl set-local-rtc 1

Настройка ssh

Теперь внесем некоторые изменения в настройки сервера ssh
. Я рекомендую его запускать на нестандартном порту для исключения лишних общений с ботами, которые регулярно сканируют интернет и подбирают пароли пользователей по словарям.

Существует расхожее мнение, что менять порт ssh это наивность, а не защита. Надо просто настроить сертификаты, fail2ban или еще каким-то образом защитить ssh порт, к примеру, с помощью ограничений iptables, и т.д. Тем не менее, я все же рекомендую порт сменить на нестандартный. Даже если у вас все защищено от подбора паролей, так как вы используете сертификаты, лишние запросы к ssh порту тратят ресурсы сервера, хоть и не очень большие. Идет установка соединения, обмен рукопожатиями и т.д. Зачем вам это нужно?

По-умолчанию в Debian, впрочем как и в любом другом дистрибутиве Linux, ssh сервер работает на 22 порту. Изменим этот порт, к примеру, на 23331. Так же я еще изменяю конфигурацию для разрешения подключения по ssh пользователя root с использованием пароля. В Debian из коробки пользователь root по ssh паролем авторизовываться не может. Изменим и это. Открываем файл настроек:

# nano /etc/ssh/sshd_config

И изменяем там следующие строки. Приводим их к виду:

Port 23331
PermitRootLogin yes

Сохраняем изменения и перезапускаем сервер ssh следующей командой:

# service sshd restart

Проверяем изменения:

# netstat -tulnp | grep ssh
tcp 0 0 0.0.0.0:23331 0.0.0.0:* LISTEN 925/sshd
tcp6 0 0:::23331:::* LISTEN 925/sshd

Все в порядке, сервер слушает 23331 порт. Теперь новое подключение будет осуществлено только по порту 23331. При этом, после перезапуска ssh, старое подключение не будет разорвано.

Я знаю, что многие возражают против подключения рутом к серверу. Якобы это небезопасно и т.д. и т.п. Мне эти доводы кажутся не убедительными. Не понимаю, в чем может быть проблема, если у меня нормальный сложный пароль на root, который не получится подобрать или сбрутить. Ни разу за всю мою работу системным администратором у меня не возникло проблем с этим моментом. А вот работать так значительно удобнее, особенно, когда необходимо оперативно куда-то подключиться по форс мажорным обстоятельствам.

Отдельно тему подключения к серверу под root я рассмотрел в статье про . Кому интересно, переходите в нее и делитесь своим мнением на этот счет.

Установка, настройка и изменение часового пояса

Команды тестировались для Ubuntu 20.04.1 LTS.

  1. Обновим список timezone на сервере:
    apt update && apt upgrade tzdata
  2. Вывести список европейских timezоne:
    timedatectl list-timezones | grep Europe
  3. Смена часового пояса:
    timedatectl set-timezone EuropeKiev

Настройка сервера времени NTP (ntpd)

NTP (Network Time Protocol — протокол сетевого времени) — сетевой протокол для синхронизации внутренних часов компьютера с серверами точного времени. NTP, основан на алгоритме Марзулло, использует для своей работы протокол UDP и учитывает время передачи.

ntpd — (Network Time Protocol (NTP) daemon) для FreeBSD.

#включим ntpd при загрузке сервера
> echo 'ntpd_enable="YES"' >> /etc/rc.conf
> man ntpd
...
FILES
     /etc/ntp.conf   the default name of the configuration file
     /etc/ntp.drift  the default name of the drift file
     /etc/ntp.keys   the default name of the key file

SEE ALSO
     ntp.conf(5), ntpdate(8), ntpdc(8), ntpq(8)
...

> ee /etc/ntp.conf
#
#ntp.time.in.ua 62.149.0.30
server 62.149.0.30 prefer iburst
#tick.usask.ca 128.233.3.100
server 128.233.3.100 iburst
#ntp2.imvp.ru 62.117.76.141
server 62.117.76.141 iburst
#ntp0.mao.kiev.ua 194.44.35.24
server 194.44.35.24  iburst
#
server 0.freebsd.pool.ntp.org iburst maxpoll 9
server 1.freebsd.pool.ntp.org iburst maxpoll 9
server 2.freebsd.pool.ntp.org iburst maxpoll 9


#опция prefer задает предпочитаемый сервер.
#опция iburst позволяет ntpd ускорить начальный процесс синхронизации.

# NTP drift file - хранит информацию об отклонениях времени
driftfile /etc/ntp.drift
# Log ntpd
logfile /var/log/ntpd.log

#default: deny for all
restrict default ignore
# allow for localhost
restrict 127.0.0.1
# allow our network
restrict 10.26.95.0 mask 255.255.255.0 nomodify notrap
restrict 195.x.x.x mask 255.255.255.224 nomodify notrap
restrict 194.x.x.x mask 255.255.255.248 nomodify notrap

# сервера с которыми мы синхронизируемся
# должны иметь возможность менять время нашего сервера
restrict 62.149.0.30 noquery notrap
restrict 128.233.3.100 noquery notrap
restrict 62.117.76.141 noquery notrap
restrict 194.44.35.24 noquery notrap
restrict ntp2.time.in.ua noquery notrap

restrict не подходит к 0.ubuntu.pool.ntp.org, т.к. этот домен имеет несколько IP

# host 0.ubuntu.pool.ntp.org
0.ubuntu.pool.ntp.org has address 158.37.91.134
0.ubuntu.pool.ntp.org has address 85.10.240.253
0.ubuntu.pool.ntp.org has address 91.121.25.33
0.ubuntu.pool.ntp.org has address 123.108.225.6

Поэтому прописывать непосредственно 0.ubuntu.pool.ntp.org бесполезно так как он попадет по правило по умолчанию restrict default. Который в нашем случае все запрещает. Обойти это можно или прописав все IP данного пула в restrict или убрать restrict default ignore и использовать для защиты сервера времени фаервол.

Запускаем ntpd и командой sockstat смотрим процессы ntpd:

> /etc/rc.d/ntpd start
> sockstat | grep -v udp6 | grep ntpd
root     ntpd       65762 3  dgram  -> /var/run/logpriv
root     ntpd       65762 20 udp4   *:123                 *:*
root     ntpd       65762 22 udp4   10.26.95.254:123      *:*

Утилитой ntpq можно проверить какие сервера доступны для синхронизации:

> ntpq -c peers
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*ntp.time.in.ua  .GPS.            1 u   50   64   37    7.457  -28.883  16.186
 128.233.3.100   .STEP.          16 u    -   64    0    0.000    0.000   0.000
+ntp2.imvp.ru    .IMVP.           1 u   58   64   37  102.083  -28.363  16.256
+194.44.35.24    .PPS.            1 u   16   64   37    8.238  -32.665  16.859

Проверочный запрос к нашему серверу утилитой Консольная утилита ntpdate для синхронизации времени. -q указывает не изменять время; -d отладочный режим без изменения времени

> ntpdate -q localhost
server 127.0.0.1, stratum 2, offset -0.000013, delay 0.02571
server ::1, stratum 2, offset -0.000016, delay 0.02574
10 Jan 01:14:48 ntpdate: adjust time server 127.0.0.1 offset -0.000013 sec

Трассировка NTP маршрута утилитой ntptrace

> ntptrace 
localhost: stratum 3, offset 0.001832, root distance 0.028646
mail.v.com.ua: stratum 2, offset 0.000255, root distance 0.008628
ntp.time.in.ua: stratum 1, offset 0.000001, root distance 0.000000, refid 'GPS'

Нужно разрешить в фаерволе 123 UDP порт.

Chrony

Была еще одна попытка заменить старый NTP более безопасный аналог. Chrony в отличие от NTPSec написан с нуля и предназначен для надежной работы в широком диапазоне условий, включая нестабильные сетевые соединения, частичная доступность или перегрузки сети и изменения температуры. Кроме того chrony обладает и другими преимуществами:

  • chrony может быстрее синхронизировать системные часы с большей точностью;
  • chrony меньше, потребляет меньше памяти и обращается к процессору только тогда, когда это необходимо. Для экономии ресурсов и энергии это большой плюc;
  • chrony поддерживает метки времени на аппаратном уровне в Linux, что обеспечивает чрезвычайно точную синхронизацию в локальных сетях.

Впрочем, в chrony отсутствуют некоторые возможности старого NTP такие, как широковещательный и многоадресный (multicast) клиент / сервер. В добавок классический NTP поддерживает большее число ОС и платформ.

Для отключения функциональности сервера и NTP запросов к процессу chronyd достаточно прописать port 0 в файл chrony.conf. Это делается в тех случаях, когда нет нужды обслуживать время для NTP клиентов или одноранговых узлов. Начиная с версии 2.0, порт сервера NTP открыт только в тех случаях, когда доступ разрешен директивой allow или соответствующей командой, либо же настроен одноранговый узел NTP, или используется директива broadcast.

Программа состоит из двух модулей.

  • chronyd — сервис, работающий в фоновом режиме. Он получает информацию о разнице системных часов с внешним сервером времени и корректирует локальное время. Он также реализует протокол NTP и может выступать в качестве клиента или сервера.
  • chronyc — утилита командной строки для мониторинга и контроля программы. Используется для тонкой настройки различных параметров сервиса, например позволяет добавлять или удалять серверы NTP в то время, как chronyd продолжает работать.

Начиная с 7-й версии RedHat Linux использует chrony в качестве службы синхронизации времени. Пакет также доступен для остальных дистрибутивов Linux. Последняя стабильная версия 3.5, готовится к выходу v4.0.

Как настроить собственный удаленный сервер chrony в интернете для синхронизации времени в офисной сети. Далее пример настройки на VPS.

Пример настройки Chrony на RHEL / CentOS на VPS

Давайте теперь немного потренируемся и поднимем свой собственный NTP сервер на VPS. Это очень просто, достаточно выбрать подходящий тариф на сайте RuVDS, получить готовый сервер и набрать с десяток несложных команд. Для наших целей вполне подойдет такой вариант.

Переходим к настройке сервиса и первым делом ставим пакет chrony.

RHEL 8 / CentOS 8 используют другой пакетный менеджер.

После установки chrony нужно запустить и активировать сервис.

При желании можно внести правки в /etc/chrony.conf, заменив сервера NPT на ближайшие локальные для сокращения времени отклика.

Далее настраиваем синхронизацию NTP сервера с узлами из указанного пула.

Необходимо также открыть наружу NTP порт, иначе межсетевой экран будет блокировать входящие соединения от клиентских узлов.

На стороне клиента достаточно правильно выставить часовой пояс.

В файле /etc/chrony.conf указывает IP или название хоста нашего VPS сервера, на котором запущен NTP server chrony.

И наконец запуск синхронизации времени на клиенте.

В следующий раз расскажу, какие есть варианты синхронизации времени без интернета.

Источник

Как проверить текущий часовой пояс

Проверка часового пояса через командную строку

Откройте приложение терминала через поиск в Панели запуска приложений следующим образом:

Вы можете получить доступ к Панели запуска приложений через клавишу Super / Windows на своем ноутбуке.

Затем введите следующую команду для просмотра информации о вашем системном времени и часовом поясе:

$ timedatectl

Вы также можете просмотреть эту информацию с помощью следующей команды:

$ ls -l /etc/localtime

Проверить часовой пояс через пользовательский интерфейс

Чтобы просмотреть информацию о текущем часовом поясе через пользовательский интерфейс, вам необходимо получить доступ к настройкам даты и времени. Это можно сделать с помощью Панели запуска приложений следующим образом:

Нажмите на результат поиска по дате и времени, чтобы открыть следующее представление настроек:

Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Техноарена
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: