Последнее изменение текста: 20110713
Скопировано с www.bog.pp.ru: 2023.06.02
Bog BOS: ntpd (xntpd) - сервер NTP4 (NTP3)
Пакет NTP4 представляет собой реализацию сервера протокола NTP версии 4,
используемого для синхронизации времени.
Обеспечивается совместимость с версиями 3 и 2 (поддержка версии 1
удалена из-за проблем с безопасностью).
Доступен для бесплатного использования, включая исходные тексты.
Текущая (на 14 февраля 2005) стабильная версия - 4.2.0 от 2003/10/15.
В статье описывается его установка и настройка.
Требуется предварительное знакомство с
механизмами обработки времени в UNIX и протоколом
NTP (там же приводится список доступных NTP серверов).
Отличия версии 4 от версии 3:
xntpd переименован в ntpd
IPv6
улучшенный алгоритм "дрессировки" системных часов, позволяющий увеличить
интервал опроса до суток
вместо библиотеки DES, запрещенной к экспорту, используется openssl
(в поставку не включена, поэтому проблем с экспортом нет ;)
возможно использование аутентификации с открытым ключом
(Autokey Version 2)
возможна автоматическая конфигурация клиентов на основе Autokey и
IP multicast
режимы быстрой настройки часов (burst, iburst)
в протокол добавлено сообщение kiss-of-death, позволяющее серверу
"отвязаться" от клиента
Предварительно необходимо проделать дырки
в сетевом экране (UDP/123) для всех хостов, на которых работает
сервер NTP, получающий информацию снаружи
(ipchains, Cisco IOS).
Дырку в местном сетевом экране процедура /etc/rc.d/init.d/ntpd в RH
проделывает самостоятельно.
Пакет ntp входит в состав дистрибутива (xntp3-5.93 для RH 6.2,
ntp-4.0.99j для RH 7.0, ntp-4.1.0 для RH 7.2, ntp-4.1.1a для RH 8.0,
ntp-4.1.2 для RH 9.0, ntp-4.2.0 для FC3).
Пакет ntp3 (ntp) состоит из
/etc/ntp.conf
/etc/ntp/
drift (поправка к частоте системных часов),
перенесён в /var/lib/ntp/drift
keys (ключи аутентификации для удаленной настройки)
step-tickers (сюда надо положить список серверов,
с которых будет браться точное время при запуске ntp сервера,
и не совпадающих с серверами в /etc/ntpd.conf)
/etc/rc.d/init.d/xntpd [или ntpd] (для автоматического запуска и остановки
необходимо сделать линки в /etc/rc.d/rc{2,3}.d с {K,S}31xntpd
на ../init.d/xntpd), для первого раза запустить вручную
(chkconfig --level 2345 ntpd on; service ntpd start)
/etc/sysconfig/ntpd (в новых версиях RH содержит ключи запуска ntpd -
"-U ntp" - используемые /etc/rc.d/init.d/ntpd)
/usr/doc/xntp3-5.93/ (/usr/share/doc/ntp-4.1.0)
/usr/bin/ntpstat (состояние местного сервера и ожидаемая ошибка)
/usr/sbin/ (только для ntp4: ntp-genkeys, ntp-wait, ntptimeset)
Если DHCP сервер раздаёт адреса NTP серверов,
то на сервере NTP необходимо добавить в /etc/sysconfig/network строку PEERNTP=no,
иначе dhclient будет "улучшать" /etc/ntp.conf.
Перед первым запуском xntpd лучше подстроить часы
вручную (ntpdate -B; дождаться завершения!).
В любом случае местное время не должно отличаться больше, чем на 1000 секунд
(CLOCK_WAYTOOBIG), время прохождения пакета и получение ответа
д.б. меньше 1 секунды, ошибка частоты д.б. меньше 390 ppm.
Для тех компьютеров, на которых точное (30мс) время не так
важно, можно не занимать память громадным xntpd/ntpd (2 MB),
а запускать каждый час следующую команду: ntpdate -B имя-NTP-сервера1имя-NTP-сервера2 ...
Установка ntpd 4.2 в RH 4.1 не удалась и ntpdate не работает. Вывернулся так:
исправить /usr/include/sched.h (добавить подчёркивание перед _P)
закоментировать структуры IP6 в /usr/include/linux/in.h
добавить в rc.local (скрипт работоспособен только после перехода сервера в устоявшийся режим,
на сервере нельзя задавать noquery для данного клиента):
ntpq -c rv ntp.systud.msk.su | grep 'clock=' | awk '{if ( $3 == "Jan" ) m = "01"; else if ( $3 == "Feb" ) m = "02"; else if ( $3 == "Mar" ) m = "03"; else if ( $3 == "Apr" ) m = "04"; else if ( $3 == "May" ) m = "05"; else if ( $3 == "Jun" ) m = "06"; else if ( $3 == "Jul" ) m = "07"; else if ( $3 == "Aug" ) m = "08"; else if ( $3 == "Sep" ) m = "09"; else if ( $3 == "Oct" ) m = "10"; else if ( $3 == "Nov" ) m = "11"; else if ( $3 == "Dec" ) m = "12"; print m $4 substr($6,1,2) substr($6,4,2) $5 "." substr($6,7,2)}'
Предварительно необходимо проделать дырки
в сетевом экране (UDP/123) для всех хостов, на которых работает
сервер NTP, получающий информацию снаружи
(Cisco IOS).
./configure --disable-all-clocks --enable-LOCAL-CLOCK
(драйверы аппаратных часов отключить)
make (не забудь добавить /usr/ccs/bin к PATH)
make check
make install
оторвать системные часы от батареечных (tickadj -s)
скрипт для автоматического запуск (/etc/rc2.d/S99xntpd)
#!/bin/sh
if [ $1 = "start" ]; then
if [ -x /usr/local/bin/xntpd ]; then
echo "Starting NTP daemon, takes about 1 minute... "
# The following line is unnecessary if you turn off
# dosynctodr in /etc/system.
/usr/local/bin/tickadj -s
/usr/local/bin/ntpdate -v server1 server2
sleep 60
/usr/local/bin/xntpd
fi
else
if [ $1 = "stop" ]; then
pid=`/usr/bin/ps -e | /usr/bin/grep xntpd | /usr/bin/sed -e 's/^*//' -e 's/ .*//'`
if [ "${pid}" != "" ]; then
echo "Stopping Network Time Protocol daemon "
/usr/bin/kill ${pid}
fi
fi
fi
запуск сервиса вручную для первого раза
Для тех компьютеров, на которых точное (30мс) время не так
важно, можно не занимать память громадным xntpd/ntpd (2 MB),
а запускать каждый час следующую команду: ntpdate -B имя-NTP-сервера1имя-NTP-сервера2 ...
сосед: peer address [key key] [version version] [prefer]
[minpoll minpoll] [maxpoll maxpoll]
где address - адрес
симметричного сервера, key - 32-битный ключ для поля
аутентификации (по
умолчанию без оной), prefer -
предпочитать данный сервер при прочих равных
условиях, minpoll -
минимальный интервал запросов (в
секундах, степень двойки, от 4 - 16с -до 14 - ═16384с, по
умолчанию 6 - 64с), maxpoll -
максимальный интервал запросов (по
умолчанию 10 - 1024с)
Внимание! разрешение имен
происходит
параллельно и приводит к run-time
реконфигурации сервера
посредством пакетов mode 7.
сервер: server address [key key] [version version]
[prefer] [mode mode]
префикса: постоянная часть имени файла,
задается либо при
компиляции, либо statsdir
имя файла:
добавляется к префиксу без косой черты, две точки
запрещены, может быть изменена ключом file
суффикс:
генерируется в
зависимости от typename:
none - один обычный файл
pid - при каждом запуске xntpd
создается новый файл (к префиксу и имени файла
добавляются точка и номер
процесса)
day - каждый день
создается новый файл (день в
координатах UTC) (к префиксу и имени файла
добавляются .yyyymmdd)
week - каждую неделю
создается новый файл (к префиксу и имени файла
добавляются .yyyyWww)
month - каждый месяц
создается новый файл (к префиксу и имени файла
добавляются .yyyymm)
year - каждый год
создается новый файл (к префиксу и имени файла
добавляются .yyyy)
age - новый файл
создается каждые 24 часа (к
префиксу и имени файла
добавляются .a и 8-значное
количество секунд на момент
создания файла от момента запуска xntpd)
file задает
специфический набор файлов, к
которому относится команда filegen
(например, peerstats)
link/unlink - по
умолчанию создается жесткая ссылка от файла без
суффикса к текущему элементу набора (это
позволяет обратиться к текущему файлу из
набора используя
постоянное имя)
enable/disable
разрешают/запрещают запись в
соответствующий набор файлов
restrict numeric-address [ mask numeric-mask ] [flag]
...
ограничение доступа: ACL
сортируются по адресам (можно
использовать слово default) и маскам,
берется исходный адрес и
последовательно
сравнивается (and по маскам), от
последнего удачного
сравнения берется флаг доступа:
нет флагов - дать доступ
ignore -
игнорировать все пакеты
noquery -
игнорировать пакеты NTP 6 и 7 (запрос и
модификация состояния)
nomodify -
игнорировать пакеты NTP 6 и 7
(модификация состояния)
lowpriotrap -
обслуживать ловушки, но
прекращать
обслуживание, если более
приоритетный клиент
потребует этого (сервер
обслуживает максимум 3 ловушки)
noserve -
обслуживать только запросы mode 6 и 7
nopeer -
обслуживать хост, но не
синхронизоваться с ним
notrust - не
рассматривать как источник
синхронизации
limited -
обслуживать только
ограниченное
количество клиентов из данной сети
ntpport/non-ntpport - это не флаг, а
модификатор алгоритма
сравнения адресов
(сравнение успешно если исходный порт равен /не
равен 123), алгоритм
сортировки ставит эту строку в конец списка.
по умолчанию ставится ignore и ntpport для
собственных адресов (чтобы не
синхронизоваться с собой), не очень
надежное средство, лучше
использовать
аутентификацию.
clientlimit limit - для флага limited
определяет макс.
количество
обслуживаемых клиентов (по
умолчанию 3)
clientperiod секунд -
сколько секунд считать клиента
активным и учитывать при
определении
количества
обслуживаемых клиентов (3600)
конфигурация
аппаратных часов (если есть),
например обычного таймера (127.127.1.0) ═(про
другие устройства - читай
отдельно): server 127.127.1.0 [prefer] fudge 127.127.1.0 [time1
смещение-часов] [time2
смещение-частоты-ppm] [stratum int]
stratum лучше поставить побольше (10), чтобы этот
источник работал, только если все
остальные отвалятся
trap host-address [port port-number] [interface
interface-address] - задать хост и порт (18447),
которые будут вести журнал
setvar variable-
установка доп.
переменных
logfile имя-файла-
использовать файл вместо syslog
logconfig keyword -
управление
количеством сообщений
сбрасываемых в журнал (по
умолчанию все включено), ключевое слово может быть
предварено символами равно
(установка маски), минус
(удаление класса
сообщений), плюс
(добавление); ключевое слово
образуется слиянием класса
сообщений (clock, peer, sys, sync) и класса
событий (info, event, statistics, status); в
качестве суффикса или префикса может
использоваться слово all.
ntpdate NTP-сервер1 ... - устанавливает системные часы;
предполагается удаление данной программы из пакета (вместо нее см. ntpd -q);
для увеличения точности и надежности требуется увеличить число серверов,
число запросов и интервал между запросами; полезно запускать перед ntpd
(или вместо него каждый час, однако при этом частота системных часов
не подстраивается); изменение системного времени может производиться
плавно (adjtime, небольшие значения) или скачком (settimeofday);
реально частота системных часов сдвигается вдвое больше чем
нужно - в расчете на то, что вскоре они все равно убегут; опции:
-B - только плавный сдвиг (adjtime), даже если смещение
больше 128 мс (0.5 секунды для ntp4)
-b - всегда использовать settimeofday (можно использовать
только при загрузке!)
-d - отладочный режим (реальных изменений не будет)
-p число - число запросов к каждому серверу (от 1 до 8,
по умолчанию 4)
-q - только запрос времени у серверов
-s - использовать syslog вместо stdout (для запуска из cron)
-t timeout - время ожидания ответа (по умолчанию 1 сек)
-u - использовать непривилегированный исходящий порт
-v - болтливость
ntpq - удаленый запрос состояния NTP сервера и его
изменение; есть интерактивный режим (ключ -i, есть команда help);
набор переменных NTP3 и NTP4 слегка отличается;
сервер должен разрешить доступ в режиме 6;
единственное, что я извлек полезного - можно узнать тип ОС (ключ: -c rl) и
от кого сервер получает время (ключ -p), а также
разнообразную информацию об источниках (все времена в
миллисекундах; самый левый символ в ответе определяет статус) ntpq -p список-хостов
пробел - слишком большой страт, цикл или явная ошибка
x - фальшивый источник по алгоритму пересечения
. - исключен из списка кандидатов из-за большого расстояния
- - удалено из списка кандидатов алгоритмом кластеризации
+ - входит в конечный список кандидатов
# - выбран для синхронизации, но есть 6 лучших кандидатов
* - выбран для синхронизации
o - выбран для синхронизации, но используется PPS
ntptrace - поиск сервера страты-1 (выдает цепочку
серверов) -r число- количество запросов (по умолчанию 5) -t секунд- timeout (по умолчанию 2) -v - болтливость
xntpdc -
удаленый запрос состояния NTP-сервера и его изменение (только для
xntpd-серверов!) используя NTP mode 7
единственное, что я извлек полезного (но есть
интерактивный режим: -i, в котором можно извлечь кучу разной
статистики - кто и сколько раз пользовался твоим сервером,
например) это: xntpdc -s список-хостов - узнать, от кого
питаются эти хосты (самый левый символ в ответе определяет статус
питателей:
пробел - слишком большой страт или явная ошибка
x - фальшивый по алгоритму пересечения
. - взято из конца списка кандидатов
- - удалено алгоритмом кластеризации
+ - входит в конечный список
# - выбран для синхронизации, но дистанция превышает максимальную
* - выбран для синхронизации
o - выбран для синхронизации, PPS в действии
позволяет также конфигурировать на ходу (обязательно д.б. включена
шифровка)
tickadj - настройка ядра ОС (если без параметров, то
посмотреть), почему у меня tickadj = 5us?
переменная dosynctodr управляет синхронизацией системных часов и
батареечных часов (надо выключить для xntpd) -a tickadj-
настройка переменной tickadj (сколько
микросекунд добавлять к часам при каждом
прерывании) -A настроить tickadj на
"оптимальное" значение -t tick -
настроить переменную ядра tick (сколько
микросекунд между
прерываниями по таймеру) -s -
установить dosynctodr в 0
директория script содержит кучу
полезных утилит
summary.pl и plot_summary.pl требуют perl 5.003,
так что посмотреть их в действии не
удалось
в
поддиректории stats: summary.sh, loop.awk, peer.awk
извлекают из
ежедневной статистики (loopstats.yyyymmdd и peerstats.yyyymmdd)
что-то полезное и кладут в loop_summary и peer_summary
(исходные файлы удаляются); тексты
процедур должны лежать там же, где и файлы со
статистикой (у меня в /var/log/ntp) и summary.sh
запускаться ежедневно из cron
в
поддиректории script/stats: psummary.awk -
скрипт для
суммирования
ежедневных
суммирований
статистики по соседям:
awk -f psummary.awk peer_summary
script/support/bin/monl -d /var/log/ntp -v ntp.deol.ru. :
узнать кто пользуется нашим
NTP-сервером
(отслеживает новых, текущих и ушедших
клиентов)
Проблема. Время от времени опорные NTP-сервера перестают нас обслуживать.
xntpd переводит их при этом в стратум-0 и синхронизуется черт знает с чем.
Необходим автоматический отлов этой ситуации.