6.13. Конфигурирование системы для использования NTP

Описание.  Кандидат BSDA должен быть знаком с основными идеями RFC 868, важностью синхронизации времени, какие сервисы чувствительны ко времени. Кандидат должен уметь сконфигурировать NTP и, если это требуется, вручную синхронизировать время с сервером времени.

Практика. ntpd(8), ntpd.conf(5), rc.conf(5), rdate(8)

Комментарий

В наше время трудно представить себе машину не снабжённую встроенным таймером, ондако в принципе существуют и такие. Ещё важнее, что существует большое количество машин на которых таймер есть, но работает некорректно и способен за несколько месяцев уйти вперёд или назад на десятки минут. Другая проблема состоит в том, что работа таймера зависит от питания и если с батареей, встроенной в материнскую плату что-то происходит, он может сбрасывать время в ноль, т.е. например в начало UNIX-эры — 1-е января 1970 года.

Такое рассогласование системного времени может приводить к разнообразным проблемам при согласовании данных между машинами. Часто такие помехи приводят к некорректной работе системы контроля версий, системы изготовления backup'ов. Ошибки могут возникать как со стороны машин, так и со стороны персонала.

Важно, чтобы системное время было согласовано хотя бы в масштабах предприятия. И нет ни малейших причин, почему бы не согласовать время со всем миром.

Для решения этой задачи существует несколько протоколов. Мы опишем TP (Time Protocol) и NTP (Network Time Protocol)

6.13.1. TP (RFC 868) и rdate(8)

Time Protocol описан в [RFC-868]. Согласно указанному документу на сервере времени поднимается сервис, который слушает 37-й порт, как UDP, так и TCP.

Если клиент связывается по TCP, он должен подключиться к данному порту, после чего сервер вышлет ему пакет содержащий в себе время в бинарном формате как 32-битное число секунд прошедших с 1-го января 1900 года (а не с начала UNIX эры!). Легко видеть, что в 2036-м году этот протокол прикажет долго жить. Между прочим, всего 30 лет осталось — меньше, чем живёт UNIX.

Если клиент предпочитает обмениваться UDP пакетами, то он должен выслать пустую датаграмму на 37-й порт сервера и получить ответную, содержащую в себе время.

Для реализации этого протокола со стороны клиента, существует программа rdate(8). Она входит в состав всех BSD, кроме FreeBSD, где она доступна в виде отдельного порта.

Стоит ли говорить, что протокол это страдает неточностями и давно устарел? Например, в протоколе не учитывается сколько времени шла датаграмма от сервера к клиенту. Впрочем, для подавляющего большинства нужд погрешность в 10 секунд неважна.

6.13.2. NTP

Протокол NTP предоставляет более развитый сервис. В качестве порта для обмена данными он использует порт 123. Для синхронизации времени запускается демон ntpd(8), Который предоставляет как услуги сервера, так и клиента. Для его запуска в FreeBSD следует вставить в /etc/rc.conf(5) следующую строку:

ntpd_enable="YES"
  

А так же, написать для демона конфигурационный файл /etc/ntp.conf(5), в котором бы указывалось, с каких серверов он берёт точное время, и какие сервисы предоставляет другим машинам.

Многие научные институты и коммерческие организации, такие как Apple или Microsoft предоставляют в общее пользование серверы точного времени. существует специальная сеть NTP-серверов в домене ntp.org. (См. http://ntp.org). В этом домене имеется множество национальных ntp серверов, в том числе и в России.

Вот пример конфигурационного файла /etc/ntp.conf(5) для нашей страны:

server 0.ru.pool.ntp.org
server 1.ru.pool.ntp.org
server 2.ru.pool.ntp.org
server ru.pool.ntp.org
driftfile /var/db/ntp.drift
  

Демон ntpd(8) последовательно опрашивает все эти серверы вычисляет разницу с системным временем и записывает её в driftfile. Затем он постепенно, маленькими порциями приводит системное время на машине ко времени указанному на серверах времени. Таким образом, скачка времени не происходит. После того как время выставлено в правильное значение, демон ntpd(8) вычисляет погрешность системного таймера и постоянно корректирует его.

Если на одном из серверов времени время значительно отличается от других, он не используется. Если при старте на клиенте время значительно отличается от времени на серверах, демон откажется корректировать его в автоматическом режиме, о чём появится соответствующая запись в журнальном файле /var/log/messages. Вы можете отметить какой-нибудь сервер как наиболее предпочтительный при помощи опции prefer.

Может быть весьма разумной практика, когда вы поднимаете свой сервер времени на предприятии, а всем клиентам прописываете обращаться за точным временем к нему. Сервер ntpd(8) может успешно обслуживать клиентов с оперционными системами MAC OS 9, MAC OS X, Windows NT 4, Windows 2000, Windows XP.

Протокол NTP позволяет менять время не только на клиенте, но и на сервере (для этого вместо применённого выше ключевого слова server, применяется ключевое слово peer). Поэтому в настроечном файле имеются опции позволяющие изменять время лишь при обращении с определённых IP-адресов, и даже осуществлять шифрованную аутентификацию.

В конфигурационном файле могут быть оговорены различные таймауты по запросам и т.п.

Наконец, в FreeBSD можно и вовсе обойтись без конфигурационного файла. Сервер времени можно просто указать в /etc/rc.conf(5) вместе с опцией включающей запуск при старте системы собственно демона ntpd(8).

ntpd_enable="YES"
ntpdate_hosts="0.ru.pool.ntp.org 1.ru.pool.ntp.org 2.ru.pool.ntp.org"
  

Обновлено: 12.03.2015