Если информация была полезной для вас, вы можете поблагодарить за труды Яндекс деньгами: 41001164449086 или пластиковой картой:

Правильная настройка сервера времени NTP на Linux

В интернете можно найти целое море мануалов по настройке сервера времени - ntpd, но ирония состоит в том, что 95% из них либо не совсем верны, и авторы этого даже не замечают, либо не дают необходимой информации. Далее я расскажу как организовать NTP сервер под Linux в локальной сети, который будет синхронизировать своё время с серверами в Интернете, а устройства в локальной сети будут уже синхронизировать время с ним.

Немного пред истории. Как и положено, всё началось неожиданно, сервер который я настраивал на кануне ночью, при следующей загрузки завис. «Шикарно» подумал я и полез в логи... В результате в том что сервер вис был повинен ntpd сервис, который из-за неправильной настройки сети не мог связаться внешним сервером для синхронизации. Посмотрев скрипт запуска, я наткнулся на интересную запись:

start() {
	readconf;

	if [ -n "$dostep" ]; then
	    gprintf $"Syncing time for ntpd: "
	    # try hard, some networks/slow machines/... take a while to have DNS
	    local triesleft=7
	    while [ $triesleft -gt 0 ]; do
	        /usr/sbin/ntpdate -s -b $NTPDATE_OPT $tickers
	        RETVAL=$?
	        [ $RETVAL -eq 0 ] && break
	        triesleft=$(($triesleft-1))
	        sleep 1
	    done
	    unset triesleft
	    [ $RETVAL -eq 0 ] && success || failure
	    echo
	    if [ $RETVAL -eq 0 ]; then
	        [ "$SYNC_HWCLOCK" = "yes" ] && sync_hwclock
	    else
	        OPTIONS="$OPTIONS -g"
	    fi
	else
	    # -g can replace the grep for time servers
	    # as it permits ntpd to violate its 1000s limit once.
	    OPTIONS="$OPTIONS -g"
	fi
        # Start daemons.
        gprintf $"Starting $prog: "
        daemon ntpd $OPTIONS
	RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/ntpd
	return $RETVAL
}

А теперь внимание на строку с номером 8. Это начало цикла, в котором целых 7-мь раз будет предпринята попытка начальной, грубой синхронизации времени. Всё бы хорошо, но если у вас неправильно настроена сеть, или DNS, то вызовет подвисание сервера, на 7*( 1 + время проверки доступности DNS, порядка 5 сек ) секунд. В общем ждать минуту меня явно не устраивало, итак приступим.

Настройка начальной, грубой синхронизации

В замечательном файле /etc/ntp/step-tickers, хранятся имена серверов с которыми производиться начальная, грубая (сотни милесекунд) корректировка. Если вы уверены что у вас всегда будет доступ к Internet, можете перечислить в нём имена серверов, например:

pool.ntp.org.

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

Задача: Организовать NTP сервер в локальной сети, который будет синхронизировать своё время с Интернетом, а устройства в локальной сети будут уже синхронизировать время с ним.
Дистрибутив: Mandriva 2010.2 free Версия ntpd: 4.2.4p8

Настройка NTPD

Мир Linux действительно великолепен, все настройки в нём сводятся к простому редактированию файлов конфигураций. ntpd в этом плане не исключение. Итак если у вас ещё не стоит ntpd сервер установим его:

#urpmi ntp

Желающие могут скомпилировать из исходников, или установить его другим способом, в мои же платны входит показать как настроить это чудо, по скольку в интернете можно найти целое море мануалов по настройке ntpd, но ирония состоит в том, что 95% из них либо не совсем верны (и авторы этого даже не замечают при вызове статусов) либо не дают необходимой информации. Итак файл с настройками храниться в /etc/ntp.conf, минимальные настройки примерно такие:

server 0.ru.pool.ntp.org
server 1.ru.pool.ntp.org
server 2.ru.pool.ntp.org
server 3.ru.pool.ntp.org

Каждая строчка указывает на сервер (списки серверов можно найти здесь http://www.pool.ntp.org), с которым будет происходить синхронизация. Четыре строчки с server, соответственно четыре сервера. Хотя на самом деле в данном примере это не совсем так. Каждая запись указывает на пул (группу) серверов. При обращении скажем по адресу 2.ru.pool.ntp.org будет выбран 1 IP адрес сервера, с которым будет происходить синхронизация. Соответствия обновляются 1 раз в час. Теперь на более простом примере. Всего у нас имеется 4 коробки с часами. Мы берём и наугад достаём из каждой коробки 1 часы, всего у нас получается 4 часов, с которыми мы будем сверять наше время. В течении часа, каждый раз когда мы будем сверять время, мы будем брать одни и те же часы. Через час если мы опять обратимся к этим коробкам, то вытащим уже другие часы. Таким образом наше время будет сверяться постоянно с разными часами, и если какие-то из них окажутся не рабочими, то ничего страшного не случиться, ведь за 1 час, наши локальные часы не слишком сильно рассинхронизируются. Ну да мы отвлеклись, продолжим. Прежде чем запускать сервер ntpd, необходимо произвести начальную, грубую установку времени. Можно просто выставить время руками, а можно выполнить команду (разумеется если у нас корректно работает связь с интернетом):

#ntpdate pool.ntp.org

После того как время грубо синхронизировано можно запускать основной сервис (на всякий случае перезапустим его):

#service ntpd restart

После чего выполним команду:

#ntpq -p

В результате должны увидеть что-то на подобии:

     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 mx.kr-pro.ru    62.149.0.30      2 u   26   64    1   22.416   77.711   0.001
 phobos.bsys-net 192.36.143.151   2 u   25   64    1   32.994   64.937   0.001
 webhost.mitht.r 77.105.134.138   3 u   25   64    1   68.134   37.119   0.001
 hornet.itconnec 77.233.172.7     3 u   24   64    1   58.604   38.047   0.001

Небольшие пояснения что есть что. remote - FQDN или IP-адрес сервера; refid - IP-адрес сервера с которым в настоящий момент выполняется синхронизация сервера из столбца remote; st - stratum сервера; t - режим работы сервера: 'u' - unicast, 'm' - multicast, 'b' - broadcast, '-' - manycast; when - время, прошедшее с момента последнего ответа сервера в секундах или '-', если сервер еще ни разу не ответил (скорее всего, "умер", и сведения о нем пора удалить из файла конфигурации); poll - интервал опроса сервера в секундах (после запуска имеет небольшое значение, чтобы синхронизация происходила быстрее, с течением времени значение увеличивается); reach - состояние восьми последних попыток запроса времени у сервера в восьмеричном представлении (в случае успешной попытки устанавливается соответствующий бит); delay - задержка ответа сервера в секундах; offset - самое важное значение - различие локального времени и времени на сервере (с течением времени значение уменьшается, т.к. время становится более точным); jitter - дисперсия, дрожание фазы (более низкие значения обеспечивают более точную синхронизацию). Ждём 10 минут. Повторяем, команду и видем:

     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*mx.kr-pro.ru    62.117.76.142    2 u    5   64  377   20.558   38.662  19.060
+phobos.bsys-net 192.36.143.151   2 u    6   64  377   17.726   38.447  15.132
-webhost.mitht.r 77.105.134.138   3 u    4   64  377   66.744   13.451  16.257
+hornet.itconnec 77.233.172.7     3 u   11   64  377   57.291   43.556  13.327

Ага, вот оно появились всякие дополнительные символы и вот что они означают: '*' - сервер, с которым в настоящий момент выполняется синхронизация, '#' - сервер отобран для синхронизации, но дистанция до него превышает максимально возможную, '?' - сервер отобран для синхронизации и использует сигнал PPS, '+' - сервер добавлен в список серверов, отобранных для синхронизации, 'x' - сервер использует некорректный алгоритм, '.' - сервер выбран из конца списка серверов, отобранных для синхронизации, '-' - сервер отвергнут группирующим алгоритмом, пробел - сервер имеет слишком высокий stratum и/или не может быть проверен; Теперь по простому, если видем '+', '-', '*' синхронизация пошла. offset — отклонение нашего времени и времени удалённого сервера, если значение скажем больше 100, то синхронизация реально не произошла. На некоторых ресурсах можно увидеть следующую картину:

    remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
172.22.128.8    93.185.187.89    3 u  142  256  377    3.906  -450.41  61.937
195.200.216.16  .INIT.          16 u    -   64    0    0.000    0.000   0.000
ams1.x31.com    .INIT.          16 u    -   64    0    0.000    0.000   0.000
mail2.mgts.by   .INIT.          16 u    -   64    0    0.000    0.000   0.000
*LOCAL(1)        .LOCL.          3 l   13   64  377    0.000    0.000   3.906

Видим что половина серверов (2, 3, 4) вообще не работает и реально происходит работа с локальным сервером и с 172.22.128.8. Смотрим значение offset которое говорит что никакой синхронизации нет и в помине! Из листинга можно сделать только один вывод, что сервер засинхронизирован сам с собой, и его время имеет мало общего с действительным. Будьте внимательны, не давайте вас нае... обмануть :) На этом бы можно и остановиться но теперь как говориться усложняем задачу. Нам надо чтоб наш сервер являлся источником времени для локальной сети, но при этом никто не смог сделать ничего плохого с вашим сервером. В чём проблема? В том что для нормальной синхронизации, даже если вы не планируете кому то давать синхронизировать время с вами, У ВАС ДОЛЖЕН быть открытым порт udp 123. После прочтения множества мануалов и дня потерянного времени вот что в /etc/ntp.conf получилось у меня:

01 # Public NPS servers, from we get time
02 server 0.ru.pool.ntp.org
03 server 1.ru.pool.ntp.org
04 server 2.ru.pool.ntp.org
05 server 3.ru.pool.ntp.org
06 server 0.europe.pool.ntp.org
07 server 1.europe.pool.ntp.org
08 
09 # For all other acces denied
10 restrict default 			ignore
11
12 # Public NPS servers can't control our local server
13 restrict 0.ru.pool.ntp.org		nomodify notrap
14 restrict 1.ru.pool.ntp.org		nomodify notrap
15 restrict 2.ru.pool.ntp.org		nomodify notrap
16 restrict 3.ru.pool.ntp.org		nomodify notrap
17 restrict 0.europe.pool.ntp.org		nomodify notrap
18 restrict 1.europe.pool.ntp.org		nomodify notrap
19 
20 # Our server provide NTP service for local network,
21 # and clients can't control our local server
22 restrict 192.168.0.0 mask 255.255.0.0	nomodify notrap nopeer
23 
24 # Need for loopback synchronisation, without it no will work
25 restrict 127.0.0.1			nomodify notrap

Вникаем внимательно. Наш сервер засинхронизирован с 6-тью внешними пулами серверов, строки с 02 по 07. Строка 10, мы запрещаем кому либо чтобы-то не было делать с нашим сервером. Теперь нам надо внести исключение для серверов с которыми наш сервер будет синхронизироваться, строки с 13 по 18. При этом параметры nomodify notrap, говорят о том что запрещено изменять состояние НАШЕГО сервера и отправлять сообщения об исключениях ВНЕШНИМИ серверами, т. е. чтоб никто из этих серверов ничего не натворил. Строка 22, мы разрешаем участникам локальной сети синхронизировать время с нашим сервером, но при этом тоже вводим ограничение. Теперь самая важная строка - 25, будем считать что это локальная петля. Без неё работать не будет. В итоге, наш сервер синхронизируется с внешними серверами, при этом сам является сервером но только для нашей локальной сети, всем остальным доступ запрещён. Ещё раз перезапустим сервис:

#service ntpd restart

Пойдём покурим, выпьем чаю, кофе (нужное подчеркнуть), после чего выполним команду:

#ntpq -p

 

     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*mx.kr-pro.ru    62.117.76.142    2 u    5   64  377   20.558   38.662  19.060
+phobos.bsys-net 192.36.143.151   2 u    6   64  377   17.726   38.447  15.132
-webhost.mitht.r 77.105.134.138   3 u    4   64  377   66.744   13.451  16.257
+hornet.itconnec 77.233.172.7     3 u   11   64  377   57.291   43.556  13.327
+sinister.wzw.tu 129.69.1.153     2 u    1   64  377   80.064   48.067  14.367
+time.sunrise.ne 193.192.225.90   3 u    3   64  377   72.448   22.575  14.584

Видим, наш сервер засинхронизирован, отклонение не превышают и 50мс. Настройка NTPD практически одинакова для всех Xnix систем, и отличается по сути только способом запуска. Всем советую ознакомиться также со статьёй где расписан вариант настройки для FreeBSD. http://www.sergeysl.ru/freebsd-ntpd/ Вот собственно и всё.

Добавить комментарий


Если информация была полезной для вас, вы можете поблагодарить за труды Яндекс деньгами: 41001164449086 или пластиковой картой: