Назад | Перейти на главную страницу

Децентрализованный NTP в сети со спорадическим подключением к Интернету?

У меня (в большинстве случаев) изолированная сеть, состоящая из нескольких компьютеров.

          computer 0 -- external NTP server
        / 
switch -- computer 1 -- external NTP server
        \  
          computer n -- external NTP server

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

Как я могу использовать chrony для синхронизации всех компьютеров без явных ролей клиент / сервер?

Требования:

  1. В любой момент времени только часть компьютеров может быть запущена и работать. Они должны быть в состоянии синхронизироваться. Если запущен другой компьютер, он также должен быть синхронизирован. Абсолютное время не имеет значения (если ошибка составляет несколько секунд / несколько минут). Важно то, что все компьютеры в сети синхронизированы.
  2. Иногда любой из компьютеров может быть подключен к Интернету и должен иметь возможность получать точное абсолютное время с внешнего сервера NTP и распределять это время в локальной сети.

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


Редактировать:

Подчеркну свою идею о подходящей конфигурации хронистов: является ли следующий подход хорошей идеей?

/etc/chrony/chrony.conf на компьютере 0:

pool external.ntp.pool offline
peer computer_1
peer computer_2
peer computer_n
local stratum 10

/etc/chrony/chrony.conf на компьютере 1:

pool external.ntp.pool offline
peer computer_0
peer computer_2
peer computer_n
local stratum 10

И так далее ...

Самое простое и лучшее (но не менее дорогое) решение вашей проблемы - установить в этой сети небольшое устройство с радиочасами (GPS или WWVB / коротковолновое). Устройства должны использовать это в качестве сервера в конфигурации NTP, а затем взаимодействовать друг с другом для восстановления после сбоя устройства.

Поскольку широковещательный радиосигнал является односторонним, это отвечает вашим требованиям безопасности для изоляции сети.

Устройства GPS и WWVB, которые действуют как серверы NTP, широко доступны во многих ценовых категориях.

Если сеть не может принимать радиосигналы в любом случае (подводная лодка, укрепленный бункер и т. Д.), Это решение не сработает. Но если это ваш сценарий, у вас, вероятно, есть деньги на установку какого-либо местного стандарта частоты.

  1. Постарайтесь этого не делать. Согласно вашему ответу на ответ @rmalayter, NTP не является децентрализованным протоколом. Точное время зависит от «центральных» (то есть более высокого уровня) серверов, предоставляющих время своим клиентам. Намного лучше иметь одну систему постоянно включенной, поддерживая связь с внешними источниками времени. BeagleBone, Raspberry PI или аналогичная встроенная система - простой и дешевый способ сделать это.
  2. Предложенная вами конфигурация должна в основном работать. Я бы посоветовал несколько вещей:
    • Не использовать offline - в pool директива автоматически повторит попытку, когда chronyd запускает или восстанавливает подключение к сети.
    • Добавить orphan на ваш local line - это функция NTP, специально разработанная для компенсации вашего сценария. Это приведет к тому, что один из партнеров будет выбран локальным мастером, когда подключение к восходящему потоку недоступно.
    • Для хоста безвредно иметь собственный адрес в его конфигурации в качестве однорангового узла: chronyd автоматически проигнорирует это. Это удобство, которое означает, что вы можете отправить одну и ту же конфигурацию на каждый хост.