Настройка NTP на сервере
Настройка NTP на сервере
В операционных системах существует немало служб, нормальное функционирование которых зависит от точности хода системных часов. Если на сервере не установлено точное время, это может стать причиной различных проблем.
Например, в локальной сети требуется, чтобы часы машин, совместно использующих файлы, были синхронизированы — иначе невозможно будет правильно устанавливать время модификации файлов. Это, в свою очередь может стать причиной конфликта версий или перезаписи важных данных.
Если на сервере не установлено точное время, возникнут проблемы с заданиями Cron — неясно, когда они будут запускаться. Будет очень трудно анализировать журналы системных событий для диагостики причин сбоев и неисправностей…
Продолжать можно долго…
Чтобы избежать всех описанных проблем, необходимо настроить синхронизацию системных часов. В Linux для этого используется протокол NTP (Network Time Protocol). В этой статье мы подробно расскажем о том, как на сервере осуществить установку и настройку NTP. Начнем с небольшого теоретического введения.
Как работает протокол NTP
В основе протокола NTP лежит иерархическая структура серверов точного времени, в которой выделяются различные уровни (англ. strata). К уровню 0 относятся эталонные часы (атомные часы или часы GPS). На нулевом уровне NTP-серверы не работают.
С эталонными часами синхронизируются NTP-серверы первого уровня, которые являются источниками для серверов уровня 2. Серверы уровня 2 синхронизируются с серверами уровня 1, но могут также синхронизироваться и между собой. Аналогичным образом работают серверы уровня 3 и ниже. Всего поддерживается до 256 уровней.
Иерархическая структура протокола NTP характеризуется отказоустойчивостью и избыточностью. В случае отказов соединения с вышестоящими серверами резервные серверы берут процесс синхронизации на себя. За счет избыточности обеспечивается постоянная доступность NTP-серверов. Синхронизируясь с несколькими серверами, NTP использует данные всех источников, чтобы рассчитать наиболее точное время.
Установка и настройка NTP-сервера
Самым известным и распространенным программным средством для синхронизации времени является демон ntpd. В зависимости от настроек, указанных в конфигурационном файле (об этом еще пойдет речь ниже), он может выступать как в качестве сервера, так и в качестве клиента (т.е может как принимать время с удаленных хостов, так и раздавать его другим хостам). Ниже мы подробно расскажем о том, как осуществляется установка и настройка этого демона в OC Ubuntu.
Установка
Программа NTP входит в состав дистрибутивов большинства современных Linux-систем и устанавливается при помощи стандартного менеджера пакетов:
Настройка
По завершении установки откроем в текстовом редакторе файл /etc/ntp.conf. В нем хранятся все настройки программы. Рассмотрим их более подробно.
Параметры логирования
Первая строка конфигурационного файла выглядит так:
В ней указывается файл для хранения информации о частоте смещения времени. В этом файле хранится значение, получаемое в результате предшествующих корректировок времени. Если внешние NTP-серверы по той или иной причине становятся недоступными, значение будет взятого из него.
Далее указывается файл, в который будут сохраняться логи синхронизации:
Список серверов для синхронизации
В конфигурационном файле указывается список NTP-серверов, с которыми будет осуществляться синхронизация. По умолчанию он выглядит так:
Каждая строка означает группу серверов, которые будут cообщать нашему серверу корректное время. Повысить точность синхронизации можно с помощью опции iburst (она указывает, что на сервер для синхронизации нужно посылать не один, а несколько пакетов):
Можно также указать предпочитаемый сервер при помощи опции prefer:
NTP-серверы разбросаны по всему миру (вот, например, список доступных публичных NTP-серверов ). Чтобы обеспечить более точную установку системных часов, рекомендуется синхронизироваться только с ntp-серверами того региона, в котором географически расположен наш сервер. Для этого в конфигурационном файле /etc/ntp.conf нужно указать в адресах серверов региональный поддомен для pool.ntp.org:
- Азия — asia.pool.ntp.org;
- Европа — europe.pool.ntp org;
- Африка — africa.pool.ntp.org;
- Северная Америка — north-america.pool.ntp.org;
- Южная Америка — south-america.pool.ntp.org;
- Океания — oceania.pool.ntp.org.
Можно также указывать поддомены для отдельных стран (подробнее см. здесь ). Имеется свой поддомен и для России — ru.pool.ntp.org
Резервный сервер точного времени
NTP-сервер, по какой-либо причине отключенный от Интернета, может передавать для синхронизации данные своих системных часов. Для этого в конфигурационный файл нужно добавить следующую строку:
Ограничения
В последнее время участились случаи использования NTP-серверов для усиления трафика в DDoS-атаках (подробнее об этом см., например, здесь ). Чтобы наш сервер не стал жертвой злоупотреблений, нелишним будет установить ограничения на доступ для внешних клиентов. По умолчанию в файлe /etc/ntp.conf установлены следующие ограничения:
Параметры nomodify, notrap, nopeer и noquery запрещают сторонним клиентам изменять что-либо на сервере. Параметр kod (эта аббревиатура означает kiss of death — «поцелуй смерти») обеспечивает дополнительную защиту: клиент, отправляющий слишком частые запросы, сначала получит так называемый kod-пакет (предупреждение об отказе в обслуживании), а затем будет отключен от сервера.
Чтобы с NTP-сервером могли синхронизироваться машины из локальной сети, добавим в конфигурационный файл следующую строку:
Для локального хоста можно установить доступ к NTP-серверу без ограничений:
Проверка синхронизации
После того, как все необходимые изменения внесены в конфигурационный файл и сохранены, перезапустим NTP-сервер:
Затем выполним следующую команду:
Ее вывод будет представлен в виде таблицы:
В таблице указываются следующие параметры:
- remote — адрес сервера точного времени (в этой графе отображаются серверы из списка в конфигурационном файле);
- refid — вышестоящий сервер (тот, от которого сервер из предыдушей графы получает синхронизацию);
- st — уровень (stratum) сервера;
- t — тип пира (u- unicast, m- multicast);
- when — время последней синхронизации;
- poll — время в секундах, за которое демон NTP синхронизируется с пиром;
- reach — состояние доступности сервера; после восьми успешных попыток синхронизации значение этого параметра становится равным 377;
- delay — время задержки ответа от сервера;
- offset — разница времени между нашим сервером и сервером синхронизации; положительное значение этого параметра означает, что наши часы спешат, отрицательное — что отстают;
- jitter — смещение времени на удаленном сервере.
Слева от адреса сервера могут быть указаны следующие символы:
- * сервер выбран для синхронизации;
- + сервер, пригодный для обновления (с которым можно синхронизироваться);
- — с сервером синхронизироваться не рекомендуется;
- х сервер недоступен.
Проверить, пригоден ли сервер из списка для синхронизации, можно при помощи команды:
Из приведенного вывода видно, что сервер пригоден для синхронизации, его уровень — 2, смещение — 0,127936 мс, задержка — 0.026 мс.
О том, как проходила синхронизация (успешно или с ошибками) можно также узнать из логов:
Установка локальной даты и времени
С помощью команды ntpdate можно установить на сервере локальную дату и время, отправив соответствующий запрос к NTP-серверу:
Linux как настроить синхронизацию времени
FreeBSD поставляется с сервером NTP ntpd(8), который можно использовать для опроса других серверов NTP для установки часов на вашей машине или предоставления услуг точного времени. Написанное в статье в равной степени справедливо и для многих других *nix систем (Linux). Как настроить синхронизацию времени в Windows, читайте здесь .
Для синхронизации времени FreeBSD с другой системой служит программа ntpdate, обычно вызываемая планировщиком cron в заданные интервалы времени. Если вам нужно только синхронизировать ваши часы при загрузке машины, вы можете воспользоваться утилитой ntpdate(8). Кроме того, синхронизацию времени может делать демон ntpd. Программа ntpd(8) изменяет время постепенно, тогда как ntpdate(8) устанавливает время вне зависимости от того, насколько велика разница между текущим временем машины и точным временем. Дока man ntpdate говорит, что весь функционал ntpdate теперь реализован в демоне ntpd, и со временем ntpdate прекратит существование (перестанет поставляться в дистрибутиве), поэтому лучше сразу использовать ntpd. Демон ntpd может эмулировать поведение ntpdate, если указать опции -q и -g, при этом ntpd просто синхронизирует время и завершает работу.
Демон ntpd специально предназначен для установки и поддержания системного времени в синхронизме со стандартными серверами времени в Интернете. По умолчанию используется протокол NTP (порт 123 UDP) версии 4, но также поддерживается совместимость с версиями 3 (RFC-1305), а также 1 и 2 (RFC-1059 и RFC-1119). Демон ntpd периодически (с настроенным интервалом) обменивается сообщениями с одним или несколькими серверами NTP, доступными в Интернете (или в локальной сети). Если разница времени между локальным хостом и сервером NTP превышает 1000 секунд, то требуется вмешательсто оператора для ручной установки времени. При этом в лог пишется panic-сообщение, и демон прекращает работу. Опция -g отменяет такое поведение (время синхронизируется при любой разнице времени), однако если синхронизация была неуспешной (разница во времени превышает 1000 секунд), ntpd все равно прекращает работу. Для работы ntpd может использовать специальный файл для хранения параметров ухода часов, по умолчанию это /etc/ntp.drift. Конфигурация для ntpd по умолчанию хранится в файле /etc/ntp.conf.
Вариантов настройки синхронизации много, но я выбрал для себя простейший режим — запуск ntpd по крону с указанием опций -q и -g. Процесс по шагам.
1. Создаем файл /etc/ntp.conf.
# touch /etc/ntp.conf
2. Находим и проверяем сервера времени. Я нашел сервера server ntp0.zenon.net, ns.arc.nasa.gov, tick.usno.navy.mil, time.nist.gov.
# nmap -sU -p123 ntp0.zenon.net
# nmap -sU -p123 -P0 ns.arc.nasa.gov
# nmap -sU -p123 tick.usno.navy.mil
# nmap -sU -p123 time.nist.gov
Среди серверов лучше определить один, до которого кратчайший маршрут (с помощью утилиты traceroute), чтобы его потом указать в /etc/ntp.conf с опцией prefer. У меня такой сервер оказался ntp0.zenon.net.
3. Добавляем сервера в /etc/ntp.conf
server ntp0.zenon.net prefer
server ns.arc.nasa.gov
server tick.usno.navy.mil
server time.nist.gov
4. Теперь можно синхронизировать время простой командой ntpd -q -g. Здесь опция -q указывает ntpd закончить работу после синхронизации времени, а опция -g отключает проверку sanity-интервала в 1000 секунд. Этими опциями эмулируется поведение устаревающей программы ntpdate.
5. На Red Hat Linux команда ntpd -q -g заработала даже без создания и правки файла /etc/ntp.conf, поскольку после установки этот файл появился автоматически. На FreeBSD оказалось все не так гладко — время засинхронизировалось, но со смещением -3 часа. Как я понял, это из-за того, что неправильно настроен часовой пояс. После настройки часового пояса все заработало нормально.
6. Добавляем назначенное задание. Например, для FreeBSD нужно в файл /etc/crontab добавить строчку:
0 1 * * * root ntpd -q -g
Это будет запускать ntpd -q -g каждый день в 01.00
Настройка синхронизации времени между серверами.
Для синхронизации внутренних часов серверов с внешним источником или между собой применяется протокол NTP.
Для начала немного теории для понимания того, что мы делаем. И главное — зачем?
Начнём с того, что время между серверами синхронизировать не просто можно, но и нужно. Практически в обязательном порядке. В том случае, если время на серверах (логических разделах) сильно разнится, то вы рискуете получить огромное количество проблем. И что самое забавное, не всегда источник этих проблем можно будет определить. Самый простой пример — Kerberos. В случае рассинхронизации времени между клиентом, сервером Kerberos, и сервером приложений, вполне вероятна ситуация, когда клиент не сможет получить сервис у сервера приложений. И это не смотря на то, что тикет с Kerberos сервера будет успешно получен. Почему? Да потому что, серверу приложений может показаться что тикет клиента устарел ещё пол-часа назад. А всё из-за разницы во времени. И это самый простой пример. Можно упомянуть и HACMP c delay timers. И стандартные системы аутентификации AIX (начиная с compat и заканчивая LDAP). И многое, многое другое… Будем считать, что в необходимости синхронизации времени мы вас убедили. ?
Роли серверов:
Сервер(server) – по запросу дает точное время клиентам. Роль могут брать на себя сервера различного уровня (stratum).
Пир(peer) – берет время с сервера и по запросу может его отдавать. Обычно эта роль может применяться для серверов с уровнем 1 или 2.
Клиент – компьютеры, которые получают время от серверов с низким уровнем(обычно 1 или 2), но никогда его не отдает.
Несколько слов о безопасности NTP. NTP при работе использует UDP и TCP. Порт 123. Очень важно правильно настроить firewall в вашей сети. В противном случае вы рискуете нарваться на атаку «компрометация сервера времени». Что чревато отказом в обслуживании со стороны серверов приложений и серверов аутентификации. Да и внешний источник времени надо выбирать аккуратно. По тем же причинам.
Для повышения уровня безопасности можно в конфигурационный файл добавить строку:
restrict default noserve noquery
Наличие такой строки запрещает узлу отвечать на внешние запросы связанные со временем.
Уровень(stratum) – все сервера времени распределены на уровни. Сервер уровня 1 берет время из внешнего источника(уровень 0). Сервера уровня 2 берут время от сервера уровня 1 и так далее. Максимальный уровень сервера может быть 15, т.е уровней всего 16.
В качестве источника точного времени можно использовать всё что угодно. Вы можете определить источником точного времени сервер в Internet, можете получать время с подключенного GPS приёмника. Да хоть солнечные часы. Главное что бы вы смогли с них данные снять.
Итак начнем настраивать AIX в соответствии с выбраной схемой.
На каждом сервере необходимо выполнить несколько действий:
1.Настройка файла конфигурации NTP /etc/ntp.conf
2.Синхронизация с источником времени предыдущего уровня.
3.Старт xntpd демона. Команда smitty xntpd -> выбрать «both» (запустить сейчас и после перезагрузки).
4.Проверить синхронизацию командой ntpq -p
Настройка /etc/ntp.conf для сервера(уровень 1)
server 127.127.1.0
fudge 127.127.1.5 stratum 1
server pool.ntp.org # пул серверов точного времени в интернете или какой-нибудь другой источник времени
driftfile /etc/ntp.drift
tracefile /etc/ntp.trace
Настройка /etc/ntp.conf для серверов 2го уровня.
server 127.127.1.0
fudge 127.127.1.5 stratum 2
server 10.1.1.100 # ip адрес или имя сервера более низкого уровня в локальной сети
peer 10.1.1.150 # ip адрес пира, находящегося на том же уровне
driftfile /etc/ntp.drift
tracefile /etc/ntp.trace
Настройка /etc/ntp.conf для клиентов:
server 127.127.1.0
fudge 127.127.1.0 stratum 3
server 10.1.1.150 # ip адрес или имя сервера более низкого уровня в локальной сети
server 10.1.1.151 # ip адрес или имя сервера более низкого уровня в локальной сети
driftfile /etc/ntp.drift
tracefile /etc/ntp.trace
Для упрощения можно оставить только уровень сервера верхнего уровня и уровень клиентов.
Решено: Сбивается время при переходе между Linux и Windows
Многие новички Linux оставляют у себя на компьютере второй запасной операционной системой Windows. Но при переходе то в одну, то во вторую систему наблюдается неприятный момент — время начинает «убегать» на несколько часов то вперед, то назад. Это происходит потому, что Linux и Window хранят время в разных форматах.
В компьютере используется два вида часов. Первые — аппаратные часы, которые идут всегда, даже тогда, когда компьютер выключен (питаются от батарейки на материнской плате компьютера). Вторые часы — программные. Вот именно этими часами пользуется операционная система. При включении компьютера первоначальное время берется из аппаратных часов и записывается в программные часы. И вся проблема как раз в том, что разные операционные системы по-разному работают с программными часами. Есть два варианта работы:
- UTC — аппаратные и программные часы идут по Гринвичу. И эти часы дают универсальное время с нулевым смещением (нулевой часовой пояс). А уже локально к этому времени прибавляется ваш часовой пояс (с плюсом или минусом). Чаще всего так время идет на серверах, с которыми потом синхронизируются рабочие станции пользователей и уже локально у всех пользователей происходит поправка на их часовой пояс.
- Localtime — в данном случае программные часы тоже идут по Гринвичу, а вот аппаратные часы идут по времени локального часового пояса. Пользователь особой разницы не заметит, т.к. все равно нужно добавлять или вычитать поправку на свой часовой пояс. И вот тут появляется проблема. Windows при загрузке и(или) синхронизации времени делает поправку на часовой пояс пользователя для того, чтобы программное время было верным. В Linux не так.
Именно поэтому, при каждой перезагрузке из одной системы в другую будет происходить смещение времени на величину поправки на часовой пояс. И единственный способ это устранить — это заставить обе системы (и Windows, и Linux) работать со временем в одном формате. Сделать это можно двумя путями:
- Заставить Windows работать по UTC, как Linux;
- Заставить Linux работать в формате localtime.
Переключение Windows на работу по UTC
Для решения проблемы сбивающегося времени достаточно добавить всего один ключ в реестр Windows. Это можно сделать с помощью ввода команды в консоли.
Чтобы открыть консоль от имени администратора в Windows 10 нужно поставить курсор мыши в левый нижний угол экрана и нажать правую кнопку мыши. В появившемся контекстном меню нужно выбрать «Командная строка (администратор)».
Для 32-х битной Windows вводим (это одна команда, вводится в одну строку):
Reg add HKLMSYSTEMCurrentControlSetControlTimeZoneInformation /v RealTimeIsUniversal /t REG_DWORD /d 1
Для 64-х битных нужно ввести (это одна команда, вводится в одну строку):
Reg add HKLMSYSTEMCurrentControlSetControlTimeZoneInformation /v RealTimeIsUniversal /t REG_QWORD /d 1
Однако, это еще не все. Служба времени Windows все равно продолжит сохранять время в старом формате при его обновлении через Интернет. Поэтому, службу нужно отключить. Либо это сделать руками через «Панель управления» Windows, либо быстрее и проще в той же командной строке, запущенной от имени администратора, выполнить:
sc config w32time start=disabled
Как вернуть настройки времени в Windows обратно?
В командной строке, запущенной от имени администратора, выполняем (это одна команда, вводится в одну строку):
Reg add HKLMSYSTEMCurrentControlSetControlTimeZoneInformation /v RealTimeIsUniversal /t REG_DWORD /d 0
и запускаем службу синхронизации времени Windows:
sc config w32time start=demand
Перевод Linux на работу с Localtime
По умолчанию Linux хранит временя в формате UTC, но можно переключить систему так, чтобы она хранила в аппаратном таймере местное время. Рассмотрим на примере Ubuntu-Linux (работает даже в старых версиях, например в 16.04).
Чтобы посмотреть текущее состояние аппаратных и программных часов, нужно выполнить:
Начнем исправлять проблему сбивающихся часов. Для этого выполняем команду:
sudo timedatectl set-local-rtc 1 —adjust-system-clock
Готово! Еще проще, чем в Winsdows!
Однако, в более старых Ubuntu придется отредактировать файл /etc/default/rcS, внутри которого заменить UTC=yes на UTC=no.
Как вернуть настройки времени в Linux обратно?
Вернуть все как было можно с помощью команды:
sudo timedatectl set-local-rtc 0
И в старых дистрибутивах Ubuntu поправить файл /etc/default/rcS, внутри которого заменить UTC=no на UTC=yes.
На этом проблема сбивающегося времени в Windows и Linux (любой дистрибутив, не обязательно Ubuntu) решена.