Сервер синхронизации времени NTPD
02-11-2010. Разместил: synergix

Сегодня поговорим о точном времени. Написать об этом статью меня подтолкнул друг, который просил поднять сервис точного времени для синхронизации своих компьютеров, имеющих выход в TAS-IX.
Собственно, опишу кратко сам принцип синхронизации. Практически на всех компьютерах производители устанавливают TOY-микросхемы (time-of-year), которые позволяют хранить системное время, а также инициализировать его при загрузке. Суть демона ntpd состоит в том, чтобы плавно подгонять системное время под точные сигналы с серверов синхронизации. Сама модель включает в себя слоистую структуру. Первый слой, или stratum 0 - это сервера, имеющий источник точного времени, такого как атомные часы, или источник точного времени, такого как CDMA, GPS, etc. Сами сервера Stratum 0 непосредственно к сети не подключены. К ним подключены сервера уровня Stratum 1, с которых собственно и производится синхронизация по сети посредством специально разработанного протокола NTP (Network Time Protocol).
Для получения точного времени в FreeBSD имеется как утилита ntpdate, так и собственно сервер синхронизации ntpd. Различие в том, что ntpdate производит резкую синхронизацию, что может быть критично для некоторых сервисов, если разница во времени будет существенная, например Dovecot при разнице в 2 секунды завершил работу с сообщением об резком изменении системного времени. Так что синхронизировать время с помощью ntpdate имеет смысл только на момент начальной загрузки до старта системных сервисов. Подробно ознакомиться с описанием утилиты и списком опций вы можете набрав man ntpdate.
Собственно, использовать ее очень просто, достаточно в консоли набрать
#ntpdate unix.uz
и утилита проведет синхронизацию вашего системного времени с NTP-сервером unix.uz.Нам же, на сервере, имеющем большой аптайм и редкие перезагрузки, имеет смысл настроить ntpd.
Главный конфигурационный файл называется ntp.conf и находится в директории /etc. Я приведу краткий листинг своего конфига с пояснениями.
#Эта секция описывает сервера,с которых мы будем
#синхронизироваться, количество их должно быть не менее 3,
#иначе мы получим Stratum 16 и компьютеры не будут с нас
#обновляться.
server ntp1.imvp.ru iburst prefer
server ntp3.imvp.ru prefer
server ntp4.imvp.ru prefer
server time.nist.gov prefer
#Далее указываем файл для ведения логов и так называемый
#drift-файл, который нужен для хранении разницы между точным и
#вашим системным временем.
driftfile /var/db/ntp.drift
logfile /var/log/ntp.log
#Тут описываем разрешения - кому можно синхронизироваться, с кого можно, и кому можно менять время.
restrict default nomodify notrap #разрешаю всем синхронизацию со мной
#разрешаю синхронизацию с данными серверами, они должны иметь возможность менять время нашего сервера.
restrict ntp1.imvp.ru noquery notrap
restrict ntp3.imvp.ru noquery notrap
restrict ntp4.imvp.ru noquery notrap
restrict time.nist.gov noquery notrap
#разрешаю все с локалхоста(изменение, синхронизация,управление, etc.)
restrict 127.0.0.1
Сохраняем, и запускаем ntpd
#/etc/rc.d/ntpd start
Смотрим вывод лога на наличие ошибок:
unix# cat /var/log/ntp.log
1 Nov 11:16:28 ntpd[58585]: synchronized to 128.9.176.30, stratum 1
1 Nov 11:16:19 ntpd[58585]: time reset -8.838775 s
1 Nov 11:20:32 ntpd[58585]: ntpd exiting on signal 15
1 Nov 11:20:39 ntpd[58670]: synchronized to 62.117.76.142, stratum 1
1 Nov 11:20:39 ntpd[58670]: kernel time sync status change 2001
1 Nov 11:20:50 ntpd[58670]: ntpd exiting on signal 15
1 Nov 11:43:39 ntpd[58953]: synchronized to 62.117.76.142, stratum 1
1 Nov 11:43:39 ntpd[58953]: kernel time sync status change 2001
1 Nov 18:00:32 ntpd[58953]: ntpd exiting on signal 15
1 Nov 18:00:50 ntpd[61243]: synchronized to 62.117.76.142, stratum 1
1 Nov 18:00:50 ntpd[61243]: kernel time sync status change 2001
1 Nov 18:52:33 ntpd[61243]: ntpd exiting on signal 15
1 Nov 18:52:41 ntpd[31119]: synchronized to 62.117.76.142, stratum 1
1 Nov 18:52:41 ntpd[31119]: kernel time sync status change 2001
2 Nov 00:02:35 ntpd[31119]: kernel time sync status change 6001
2 Nov 00:28:13 ntpd[31119]: kernel time sync status change 2001
2 Nov 04:57:24 ntpd[31119]: kernel time sync status change 6001
2 Nov 05:14:28 ntpd[31119]: kernel time sync status change 2001
2 Nov 05:48:37 ntpd[31119]: kernel time sync status change 6001
2 Nov 06:05:43 ntpd[31119]: kernel time sync status change 2001
2 Nov 07:31:03 ntpd[31119]: kernel time sync status change 6001
2 Nov 07:48:07 ntpd[31119]: kernel time sync status change 2001
unix#
Смотрим на каком сокете слушает демон:
unix# sockstat|grep -v udp6|grep ntpd
root ntpd 31119 3 dgram -> /var/run/logpriv
root ntpd 31119 20 udp4 *:123 *:*
root ntpd 31119 22 udp4 91.212.89.106:123 *:*
root ntpd 31119 25 udp4 127.0.0.1:123 *:*
unix#
Следует отметить, , что после перезапуска демона синхронизация не начнется сразу же. Придется подождать некоторое время, потому что ntpd несколько медлителен и не торопится обновлять время, мне пришлось ждать около двух часов. Для того, чтобы проследить как идут дела с установкой соединения с другими серверами, есть утилита ntpq:
unix# ntpq -c peers
remote refid st t when poll reach delay offset jitter
==============================================================================
*ntp1.imvp.ru .PPS. 1 u 688 1024 377 79.179 0.197 0.430
+ntp3.imvp.ru .PPS. 1 u 612 1024 377 80.477 0.972 0.077
+ntp4.imvp.ru .PPS. 1 u 669 1024 377 79.574 0.133 0.016
-time.nist.gov .ACTS. 1 u 493 1024 213 251.832 9.269 2.644
unix#
Знаки перед именами серверов означают:
пробел - слишком большой уровень, цикл или явная ошибка;
x - фальшивый источник по алгоритму пересечения;
. - исключён из списка кандидатов из-за большого расстояния;
- - удалено из списка кандидатов алгоритмом кластеризации;
+ - входит в конечный список кандидатов;
# - выбран для синхронизации, но есть 6 лучших кандидатов;
* - выбран для синхронизации;
o - выбран для синхронизации, но используется PPS.
Наиболее интересное нам поле: "offset". Это разница между показателями локальных часов компьютера и эталонных NTP серверов. Чем меньше этот показатель, тем точнее идут наши часы. Служба ntpd "умная" и сама отсеивает источники времени слишком выбивающиеся за рамки разумного; через некоторое время после запуска ntpd выберет наиболее достоверные источники данных и будет синхронизироваться с ними. Представленный нами список эталонных NTP серверов регулярно пересматривается службой.
Примерно такой вывод команды говорит о том, что сейчас для синхронизации мне доступны указанные серверы. Теперь, в качестве проверки, можно синхронизировать время на самом сервере с помощью ntpdate:
unix# ntpdate -q localhost
server 127.0.0.1, stratum 2, offset -0.000006, delay 0.02563
server ::1, stratum 2, offset -0.000004, delay 0.02565
2 Nov 08:52:02 ntpdate[56948]: adjust time server 127.0.0.1 offset -0.000006 sec
unix#
И напоследок, нужно добавить демон в автозагрузку:
ntpd_enable="YES"
В том случае, если у вас работает файерволл (а он у вас должен работать), нужно проследить, чтобы порт 123/UDP был открыт.
В IPFW это делается добавлением команды:
ipfw add allow udp from any to me 123 via ${ex_if}
где ex_if - ваш внешний интерфейс. Вот собственно и все.
Если вы решите также поднять свой сервер синхронизации времени, добавьте его в пул http://www.pool.ntp.org, в данный момент там всего 3 активных сервера.
Все ваши замечания и вопросы по данной статье Вы можете опубликовать на форуме.
Вернуться назад