xntpd (UNIXовый сервер NTP - network time protocol)

Автор: Сергей Богомолов
оригинал статьи лежит на сервере: http://www.bog.pp.ru/work/

источник

Брал версию 5.90, полная реализация RFC-1305 (NTP, версия 3) с дополнительными возможностями предполагаемыми к включению в версию 4. Последняя реализация: xntp3-5.93e (на 6 октября 1999). Версия для использования в США с шифровкой и экспортный вариант. Готовится версия 4.

Где взять: ftp://ftp.udel.edu/pub/ntp

  • ntpdate - установка времени на местном компьютере, беря его из списка ntp-серверов (злобный комментарий к программе утверждает, что реально она сдвигает часы вдвое больше чем положено - в расчете на то, что вскоре они все равно убегут)
    -B - только плавный сдвиг (adjtime), даже если смещение больше 128 мс
    -b - всегда использовать settimeofday (можно использовать только при загрузке!)
    -d - отладка (реальных изменений не будет)
    -p число - число запросов к каждому серверу (от 1 до 8, по умолчанию 4)
    -q - только запрос времени
    -s - использовать syslog вместо stdout
    -t timeout - время ожидания ответа (по умолчанию 1 сек)
    -u - использовать непривилегированный порт
    -v - болтливость
  • ntpq - удаленый запрос состояния NTP-сервера и его изменение (использует NTP mode 6)
    единственное, что я извлек полезного (но есть интерактивный режим: -i) это: ntpq -p список-хостов - узнать, от кого питаются эти хосты (самый левый символ в ответе определяет статус питателей:
    • пробел - слишком большой страт или явная ошибка
    • x - фальшивый по алгоритму пересечения
    • . - взято из конца списка кандидатов
    • - - удалено алгоритмом кластеризации
    • +- входит в конечный список
    • # - выбран для синхронизации, но дистанция превышает максимальную
    • * - выбран для синхронизации
    • o - выбран для синхронизации, PPS в действии
  • ntptrace - поиск сервера страты-1 (выдает цепочку серверов)
    -r число - количество запросов (по умолчанию 5)
    -t секунд - timeout (по умолчанию 2)
    -v - болтливость
  • xntpd [-aAbdm ] [-c config-file] [-f drift-file] [-k key-file] [-l log-file] [-p pid-file] [-r broadcast-delay] [-s stats-dir] [-t key] [-v variable] [-V variable] - демон сетевого времени
    -a разрешить аутентификацию (по умолчанию)
    -A запретить аутентификацию
    -b broadcast
    -c config-file (по умолчанию /etc/ntp.conf
    -d отладка (чем больше раз встречается, тем выше уровень)
    -f drift-file (по умолчанию /etc/ntp.drift)
    -k key-file (по умолчанию /etc/ntp.keys)
    -l log-file (по умолчанию syslog)
    -m multicast (IP-адрес 224.0.1.1)
  • 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-сервером (отслеживает новых, текущих и ушедших клиентов)

Установка

Руководство по установке: http://www.eecis.udel.edu/~ntp/database/html_xntp3-5.90/build.html а также файл INSTALL

Solaris 2.5. Установка из исходников (5.90).

Сначала надо выполнить
./configure --disable-all-clock --enable-LOCAL-CLOCK -делает config.h и Makefile  в каждой поддиректории, драйверы аппаратных часов отключить
make (не забудь добавить /usr/ccs/bin к PATH)
make check
make install (из-под суперпользователя)
make clean

Red Hat Linux 6.0 / 6.2 (xntp3-5.93-12.rpm / xntp3-5.93-14.rpm).

Приходит в готовом виде (/etc/ntp.conf, /etc/ntp/, /etc/rc.d/init.d/xntpd, /usr/doc/xntp3-5.93/, /usr/sbin/{ntpdate, ntpq, ntptime, ntptrace, tickadj, xntpd, xntpdc}). В /etc/ntp/step-tickers положить список опорных NTP-серверов. Для автоматического запуска/остановки /etc/rc.d/rc{2,3}.d сделать линки с {K,S}31xntpd на ../init.d/xntpd. Настроить /etc/ntp.conf. Подстроить часы вручную (лучше дождаться завершения ntpdate -B).

Перед запуском местное время не должно ошибаться больше, чем на 1000 секунд (CLOCK_WAYTOOBIG), round-trip delay д.б. меньше 1 секунды, ошибка частоты д.б. меньше 390 ppm.

Конфигурация (по умолчанию /etc/ntp.conf):

  • сосед: 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]
  • рассылка broadcast сообщений: broadcast address [key key] [version version] [ttl ttl]
  • broadcastclient [address]
  • broadcastdelay секунд - вообще-то должен вычисляться автоматически, но можно и вручную (по умолчанию 0.004)
  • multicastclient [address]...
  • driftfile driftfile - сюда записывается и при запуске извлекается сдвиг частоты местных часов (ppm - в действительности 2^-20)
  • enable/disable auth/bclient/monitor/pll/pps/stats  -включить/выключить режим работы:
    • auth - с неупомянутыми соседями общаться только в режиме аутентификации (включено по умолчанию)
    • monitor - разрешить мониторинг (команда monlist в xntpdc  -узнать кто когда и сколько с нами общался) (включено по умолчанию)
    • pll - разрешать настраивать частоту местных часов по NTP (включено по умолчанию)
    • stats - разрешить сбор статистики (включено по умолчанию)
  • keys/trustedkey/controlkey/requestkey - параметры аутентификации пока не рассматривались
  • statistics loopstats - при каждой модификации локальных часов записывает строчка в файл loopstats
    формат файла loopstats
    1. номер модифицированного Юлианского дня
    2. секунды с полуночи (UTC)
    3. смещение в секундах
    4. смещение частоты в милионных долях
    5. временная константа алгоритма дисциплинирования часов
  • statistics peerstats - каждое общение с соседом записывается в журнал
    формат файла peerstats
    1. номер модифицированного Юлианского дня
    2. секунды с полуночи (UTC)
    3. IP-адрес соседа
    4. статус соседа, шестнадцатеричное число (см. приложение А к RFC1305)
    5. смещение (сек)
    6. задержка (сек)
    7. дисперсия (сек)
  • statistics clockstats - каждое сообщение от драйвера локальных часов записывается в журнал
  • statsdir имя-директории-со-статистикой
  • filegen [file filename] [type typename] [flag flagval] [link | nolink] [enable | disable] - алгоритм генерации имен файлов (например, файлов статистики):
    • имена файлов состоят из:
      • префикса: постоянная часть имени файла, задается либо при компиляции, либо специальными командами конфигурации
      • имя файла: добавляется к префиксу без косой черты, две точки запрещены, может быть изменена ключом 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 (модификация состояния)
    • notrap - отказать в обеспечении mode 6 trap сервиса (удаленная журнализация событий)
    • 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.

Местные настройки

Не забудь разрешить вход на порты ntp (UDP/123) для всех хостов, на которых работает ntp-сервера, питаемые снаружи.

Для тех компьютеров, на которых точное (30мс) время не так важно, можно не занимать ОЗУ громадным xntpd (2 MB), а запускать каждый час:
ntpdate -B ntp ntp2 ntp3

Надо сделать tickadj -s (оторвать системные часы от батареечных) перед запуском xntpd.

Запуск (Solaris 2.5):

/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

Проблема. Время от времени опорные NTP-сервера перестают нас обслуживать. xntpd переводит их при этом в стратум-0 и синхронизуется черт знает с чем. Необходим автоматический отлов этой ситуации.




Наш баннер
Вы можете установить наш баннер на своем сайте или блоге, скопировав этот код:
RSS новости