Что такое протокол NTP и зачем он нужен
Протокол NTP позволяет компьютерам и устройствам синхронизироваться с высокоточными источниками времени, такими как атомные часы или GPS-устройства. Его разработали для точной и надежной передачи временных меток по IP-сетям. Понимание этого протокола поможет вам не только поддерживать точное время в сети, но и повысить общую стабильность и безопасность информационных систем.
Как время связано со стабильностью и безопасностью? В операционных системах есть службы, нормальная работа которых зависит от точности хода системных часов. Если на сервере не установлено точное время, это может стать причиной различных проблем. Например, в локальной сети требуется, чтобы часы машин, совместно использующих файлы, были синхронизированы — иначе невозможно будет правильно устанавливать время модификации файлов. Это, в свою очередь, может привести к конфликту версий или перезаписи важных данных.
В распределенных системах синхронизированное время жизненно важно для координации действий и процессов. Без него операции могут конфликтовать или завершаться неудачей. Это приводит к потенциальной потере или повреждению данных. Точное время также имеет критическое значение для протоколов безопасности, которые используются в аутентификации и шифровании. Несоответствия времени могут создавать уязвимости, которые будут использовать злоумышленники. Кроме того, во многих отраслях требуется точное отслеживание времени для соблюдения нормативных требований. Точные логи необходимы для аудитов и в юридических вопросах.
Как работает протокол NTP
В основе протокола NTP лежит иерархическая структура серверов точного времени. Она включает несколько уровней.
- Нулевой уровень — это эталонные часы, например атомные.
- Первый уровень — NTP-серверы, которые синхронизируются с эталонными часами. Это источник данных для серверов второго уровня.
- Второй уровень — тоже NTP-серверы. Они синхронизируются с первым уровнем, а также между собой.
Далее структура повторяется — она поддерживает до 256 уровней. При этом ей свойственны отказоустойчивость и избыточность. В случае отказов соединения с вышестоящими серверами резервные берут процесс синхронизации на себя. За счет избыточности обеспечивается постоянная доступность NTP-серверов. Многократная синхронизация позволяет протоколу использовать данные всех источников, чтобы рассчитать наиболее точное время.
Чем NTP отличается от SNTP
SNTP (Simple network time protocol), или простой протокол времени сети, — упрощенная версия NTP. Обе технологии предназначены для синхронизации часов компьютеров и устройств в сети, однако значительно различаются по своей сложности и точности.
NTP использует сложные алгоритмы для достижения высокой точности синхронизации времени, обычно в пределах миллисекунд от всемирного координированного времени (UTC). Протокол может учитывать задержки в сети и смещение времени часов в разных точках планеты, производя непрерывные корректировки для поддержания точности. Из-за своей сложности и точности NTP обычно используется в корпоративных средах, где критически важно поддерживать точное время. Например, в финансовых транзакциях, ведении логов и протоколах безопасности.
SNTP не выполняет постоянных корректировок. Это приводит к более низкому качеству синхронизации времени. В результате протокол больше подходит для простых приложений, где высокая точность не так важна. Это могут быть IP-камеры, видеорегистраторы и некоторые сетевые коммутаторы.
Еще одно различие двух протоколов в том, что NTP может подключаться к нескольким источникам времени, идентифицируя и игнорируя неисправные. SNTP подключается к единственному источнику и не обладает продвинутыми функциями, что делает его менее надежным. Он служит более простой альтернативой: жертвует точностью и надежностью ради легкости реализации.
Выбор протокола должен основываться на двух факторов:
- потребностях сети,
- критичности задач, которым важна синхронизация времени.
Установка и настройка NTP-клиента
Самым известным и распространенным программным средством для синхронизации времени является демон ntpd. В зависимости от настроек, указанных в конфигурационном файле (об этом еще пойдет речь ниже), он может выступать как в качестве сервера, так и в качестве клиента. Другими словами, может как принимать время с удаленных хостов, так и раздавать. Ниже подробно расскажем, как установить и настроить этот демон в Linux.
Шаг 1: установка пакета NTP
На этом шаге вы можете использовать инструмент управления пакетами вашей ОС. Например, для Ubuntu или дистрибутивов на базе Debian выполните команду в терминале:
sudo apt update
sudo apt install ntp
Для CentOS или RHEL используйте команду:
sudo yum install ntp
Это установит демон NTP, который отвечает за синхронизацию времени.
Шаг 2: настройка NTP-клиента
По завершении установки откройте в текстовом редакторе файл /etc/ntp.conf. В нем хранятся все настройки программы. Рассмотрим их более подробно.
Параметры логирования
Первая строка конфигурационного файла выглядит так: driftfile /var/lib/ntp/ntp.drift. В ней указывается файл для хранения информации о частоте смещения времени.
Внутри файла хранится значение, получаемое в результате предшествующих корректировок. Если внешние NTP-серверы по той или иной причине становятся недоступными, значение будет взятого из него.
Далее указывается файл, в который будут сохраняться логи синхронизации: logfile /var/log/ntp.log.
Список серверов для синхронизации
В конфигурационном файле указывается список NTP-серверов, с которыми будет осуществляться синхронизация. По умолчанию он выглядит так:
- server 0.ubuntu.pool.ntp.org
- server 1.ubuntu.pool.ntp.org
- server 2.ubuntu.pool.ntp.org
- server 3.ubuntu.pool.ntp.org
Каждая строка означает группу серверов, которые будут сообщать нашей машине корректное время. Повысить точность синхронизации можно с помощью опции iburst. Она указывает, что на сервер для синхронизации нужно посылать не один, а несколько пакетов. Чтобы добавить эту опцию, допишите к каждому серверу из списка выше iburst:
- server 0.ubuntu.pool.ntp.org iburst
- server 1.ubuntu.pool.ntp.org iburst
- server 2.ubuntu.pool.ntp.org iburst
- server 3.ubuntu.pool.ntp.org iburst
Можно также указать предпочтительный сервер при помощи опции prefer. По аналогии с проведенными выше манипуляциями просто допишите prefer в каждой строке со списком серверов:
- server 0.ubuntu.pool.ntp.org iburst prefer
- server 1.ubuntu.pool.ntp.org iburst prefer
- server 2.ubuntu.pool.ntp.org iburst prefer
- server 3.ubuntu.pool.ntp.org iburst prefer
NTP-серверы разбросаны по всему миру — вот, например, список доступных публичных NTP-серверов. Чтобы обеспечить более точную установку системных часов, лучше синхронизироваться только с NTP-серверами того региона, в котором расположен ваш сервер. Для этого в конфигурационном файле /etc/ntp.conf нужно указать в адресах региональный поддомен для pool.ntp.org:
- Азия — asia.pool.ntp.org,
- Европа — europe.pool.ntp org,
- Африка — africa.pool.ntp.org,
- Северная Америка — north-america.pool.ntp.org,
- Южная Америка — south-america.pool.ntp.org,
- Океания — oceania.pool.ntp.org.
Можно также указывать поддомены для отдельных стран. Например, для России это ru.pool.ntp.org. Полный список региональных поддоменов доступен на сайте NTP Pool Project.
Пример файла для NTP-клиента:
# Указываем NTP-сервер, к которому будет подключаться клиент
server 192.168.1.10 iburst
# Настройки локальной сети
restrict default nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict ::1
# Логирование
logfile /var/log/ntp.log
# Указываем, что это клиент
driftfile /var/lib/ntp/drift
Шаг 3: Запуск и включение службы NTP
После настройки клиента необходимо запустить службу NTP. Используйте следующую команду:
sudo systemctl start ntp
Шаг 4: Настройка брандмауэра (если необходимо)
Если на вашей системе включен брандмауэр, необходимо разрешить трафик NTP через UDP-порт 123. На Ubuntu с UFW это можно сделать командой:
sudo ufw allow 123/udp
Шаг 5: Проверка синхронизации NTP
Чтобы проверить, правильно ли синхронизируется ваш клиент, можете использовать следующую команду:
ntpq -p
Эта команда отобразит список NTP-серверов, к которым подключен ваш клиент, вместе с их статусом. Вы должны увидеть звездочку (*) рядом с сервером, с которым ваша система в настоящее время синхронизирована.
Установка и настройка NTP-сервера
Клиент готов — теперь настроим сервер.
Шаг 1: Установка пакета NTP
Для сервера NTP установка такая же, как для клиента. Используйте команды:
sudo apt update
sudo apt install ntp
Для CentOS или RHEL используйте:
sudo yum install ntp
Шаг 2: Настройка NTP-сервера
Пример файла ntp.conf для NTP-сервера:
# Указываем серверы времени, с которыми будет синхронизироваться наш сервер
server 0.pool.ntp.org iburst
server 1.pool.ntp.org iburst
server 2.pool.ntp.org iburst
server 3.pool.ntp.org iburst
# Настройки локальной сети
restrict default nomodify notrap nopeer noquery
restrict 127.0.0.1
restrict ::1
# Разрешаем доступ к серверу для локальных клиентов
restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
# Логирование
logfile /var/log/ntp.log
# Указываем, что это сервер времени
driftfile /var/lib/ntp/drift
Проверка работы NTP-сервера
Для проверки работы сервера можно выполнить команду:
ntpq -pn
Ее вывод будет представлен в виде таблицы:
remote refid st t when poll reach delay offset jitter
==============================================================================
*62.76.96.4 130.173.91.58 2 u 207 256 37 10.985 -215.79 256.992
+85.21.78.91 89.175.22.41 2 u 193 256 37 32.623 -207.70 259.121
+31.131.249.27 89.175.22.41 2 u 198 256 37 0.621 -216.90 257.037
+85.21.78.8 193.11.166.20 2 u 193 256 37 32.028 -207.41 259.863
+91.189.94.4 193.79.237.14 2 u 192 256 37 50.573 -206.62 259.542
В таблице указываются следующие параметры:
- remote — адрес сервера точного времени (в этой графе отображаются серверы из списка в конфигурационном файле);
- refid — вышестоящий сервер (тот, от которого сервер из предыдущей графы получает синхронизацию);
- st — уровень (stratum) сервера;
- t — тип пира (u- unicast, m- multicast);
- when — время последней синхронизации;
- poll — время в секундах, за которое демон NTP синхронизируется с пиром;
- reach — состояние доступности сервера; после восьми успешных попыток синхронизации значение этого параметра становится равным 377;
- delay — время задержки ответа от сервера;
- offset — разница времени между нашим сервером и сервером синхронизации; положительное значение этого параметра означает, что наши часы спешат, отрицательное — что отстают;
- jitter — смещение времени на удаленном сервере.
Слева от адреса сервера могут быть указаны следующие символы:
- * (звездочка) — сервер выбран для синхронизации;
- + (плюс) — сервер, пригодный для обновления (с которым можно синхронизироваться);
- (нет символа) — с сервером синхронизироваться не рекомендуется;
- х — сервер недоступен.
Проверить, пригоден ли сервер из списка для синхронизации, можно при помощи команды:
ntpdate -q <адрес_NTP_сервера>
Вывод команды будет иметь такой вид:
server хх.ххх.ххх.ххх, stratum 2, offset −0.127936, delay 0.02600
7 Jul 14:30:23 ntpdate[7716]: adjust time server хх.ххх.ххх.ххх offset −0.127936 sec
Здесь видно, что сервер пригоден для синхронизации, его уровень — 2, смещение — 0,127936 мс, задержка — 0,026 мс.
Узнать, были ли ошибки при синхронизации, можно из логов. Чтобы их посмотреть, введите команду:
journalctl -u ntpd
Текущий статус ntpd можно проверить с помощью следующей команды:
ntpdc -c sysinfo
Вывод выглядит так:
system peer: 62.76.96.10
system peer mode: client
leap indicator: 11
stratum: 3
precision: −21
root distance: 0.01314 s
root dispersion: 1.66203 s
reference ID: [62.76.96.4]
reference time: d768a894.3824a929 Thu, Jul 10 2014 9:52:20.219
system flags: auth monitor ntp kernel stats
jitter: 0.393768 s
stability: 0.000 ppm
broadcastdelay: 0.000000 s
authdelay: 0.000000 s
Зачем нужен резервный сервер точного времени
Резервный сервер никогда не будет лишним. Если основной окажется недоступным из-за проблем с сетью, технического обслуживания или сбоя, резервный сможет взять на себя его функции. Так получится избежать сбоев в синхронизации времени.
В средах с высоким трафиком или множеством устройств использование основного и резервного NTP-серверов помогает распределить нагрузку. Это помогает исключить эффект «узкого горлышка» и улучшить общую производительность.
Настройка резервных серверов, расположенных в разных регионах, позволяет снизить риск локальных сбоев, влияющих на синхронизацию времени. Если основной сервер находится, скажем, в Москве и сталкивается с проблемами, резервный сервер в Санкт-Петербурге сможет предоставить информацию о времени. Кроме того, при использовании нескольких серверов клиент может сравнивать время, предоставляемое каждым из них. Это позволяет системе выбрать наиболее точный источник и повышает общую точность синхронизации.
Настройка резервного сервера
Откройте файл конфигурации ntp.conf — о нем мы писали выше — и укажите резервный сервер. Пример:
- server primary-ntp-server.example.com iburst
- server backup-ntp-server.example.com iburst
Также можно настроить приоритеты для серверов. Например, использовать параметр prefer только для основного сервера:
- server primary-ntp-server.example.com iburst prefer
- server backup-ntp-server.example.com iburst
После этих изменений необходимо будет перезапустить службу.
Проверка статуса синхронизации NTP в Linux и Windows
Несмотря на то, что NTP характеризуется высокой надежностью, рекомендуем периодически проверять статус синхронизации. Посмотрим, как это можно сделать в Linux и Windows.
Linux
Чтобы получить информацию о состоянии сервера и его синхронизации, выполните команду:
ntpq -p
Она выведет список NTP-серверов, с которыми ваш сервер пытается синхронизироваться, а также информацию о состоянии синхронизации.
Чтобы узнать о состоянии синхронизации демона NTP (ntpd), работающего на локальной машине, выполните команду:
ntpstat
Вы получите информацию о том, синхронизирован ли сервер, и если да, то насколько точно.
Если ваша система использует systemd, вы можете проверить статус времени и синхронизации с помощью команды:
timedatectl status
Она покажет текущее время, статус синхронизации и информацию о часовом поясе.
Windows
Для проверки статуса синхронизации времени введите в терминале команду:
w32tm /query /status
Она покажет текущее состояние службы времени Windows, включая информацию о последнем успешном синхронизированном времени.
Чтобы увидеть список доступных NTP-серверов, с которыми ваш компьютер может синхронизироваться, выполните команду:
w32tm /query /peers
Это даст вам представление о том, с какими серверами ваша система пытается установить связь.
Для проверки конфигурации NTP-сервера можно использовать команду:
w32tm /query /configuration
Она покажет текущие настройки службы времени Windows.
Основные ошибки при настройке NTP и их устранение
Настройка NTP может быть сопряжена с различными проблемами. Рассмотрим три распространенные ошибки и способы их устранения.
The NTP socket is in use, exiting
Эта ошибка возникает, когда служба пытается запуститься, но обнаруживает, что сокет уже используется другой службой или процессом. Такое может произойти, если NTP уже запущен или если другой процесс использует тот же порт (обычно 123).
Чтобы устранить ошибку, проверьте, запущен ли уже процесс NTP, командой:
sudo systemctl status ntp
Если он запущен, вы можете перезапустить его:
sudo systemctl restart ntp
Если другой процесс использует порт, вы можете найти его с помощью команды:
sudo lsof -i :123
После этого можно остановить конфликтующий процесс или изменить конфигурацию.
Connection refused
Ошибка Connection refused возникает, когда клиент NTP не может подключиться к серверу. Это может быть связано с неправильной конфигурацией сервера, его недоступностью или блокировкой порта.
Чтобы устранить ошибку, проверьте, что сервер доступен и работает. Попробуйте выполнить команду:
ntpq -p
Она покажет список доступных серверов и их статус. Проверьте конфигурацию вашего NTP-клиента. Убедитесь, что в файле конфигурации /etc/ntp.conf указаны правильные адреса серверов. Убедитесь, что порты не блокируются брандмауэром. Проверьте настройки iptables или ufw:
sudo ufw status
Если порт 123 закрыт, откройте его:
sudo ufw allow 123/udp
No server suitable for synchronization found
Эта ошибка указывает, что клиент не может найти подходящий сервер для синхронизации времени. Это может быть вызвано неправильной конфигурацией серверов или их недоступностью.
Для устранения проверьте файл конфигурации /etc/ntp.conf и убедитесь, что в нем указаны корректные и доступные NTP-серверы. Попробуйте использовать другие публичные серверы, если текущие недоступны. Убедитесь, что ваш сервер имеет доступ к интернету, если вы используете публичные NTP-серверы. Проверить соединение можно с помощью команды:
ping google.com
После выполнения команды вы увидите вывод, который будет выглядеть примерно так:
PING google.com (172.217.16.206): 56 data bytes
64 bytes from 172.217.16.206: icmp_seq=0 ttl=117 time=14.2 ms
64 bytes from 172.217.16.206: icmp_seq=1 ttl=117 time=13.8 ms
64 bytes from 172.217.16.206: icmp_seq=2 ttl=117 time=14.0 ms
- 64 bytes from…: ваш компьютер успешно получил ответ от указанного адреса.
- icmp_seq: номер последовательности пакета.
- ttl: время жизни пакета, указывающее, сколько маршрутизаторов он прошел.
- time: время, затраченное на получение ответа, измеряется в миллисекундах (ms).
Чтобы остановить выполнение команды ping, нажмите Ctrl + C. Это завершит процесс и покажет статистику, включая количество отправленных и полученных пакетов, а также среднее время ответа.
Как сделать систему NTP более безопасной
У протокола NTP есть защищенная версия — NTS (Network Time Security). Она была разработана для устранения уязвимостей, который может подвергаться атакам, таким как подделка времени и атаки типа «man-in-the-middle».
Первым шагом в использовании NTS является выбор сервера, который поддерживает этот протокол. Современные NTP-серверы, такие как NTPsec и Chrony, уже имеют встроенную поддержку NTS.
Для настройки сервера необходимо активировать NTS. Это включит конфигурацию прослушивания NTS-соединений и установку необходимых криптографических ключей. Они отвечают за аутентификацию и шифрование данных. Управление этими ключами является критически важным аспектом реализации NTS. Сервер должен генерировать и хранить закрытые ключи, в то время как открытые могут быть распространены среди клиентов.
Клиенты, которые хотят использовать NTS для синхронизации времени, также должны быть настроены на работу с протоколом. Это подразумевает указание адреса сервера и, в некоторых случаях, загрузку открытого ключа сервера для аутентификации.
При установлении соединения между клиентом и сервером происходит обмен ключами, что позволяет обеим сторонам аутентифицировать друг друга. Этот процесс предотвращает возможность того, что клиент получит недостоверную информацию о времени из-за вмешательства со стороны злоумышленника. После успешной аутентификации устанавливается безопасное соединение, которое позволяет клиенту запрашивать и получать точное время от сервера.
Заключение
NTP играет важную роль в современном мире, обеспечивая синхронизацию времени между устройствами в компьютерных сетях. Точное время необходимо для финансовых транзакций, работы систем управления, распределенных баз данных и многого другого. Благодаря этому протоколу устройства могут корректно обмениваться данными, поддерживать согласованность и обеспечивать безопасность операций.
Кроме того, с учетом растущих угроз кибербезопасности, использование защищенных версий NTP, таких как Network Time Security (NTS), становится все более актуальным. NTS обеспечивает дополнительные уровни аутентификации и шифрования, что помогает защитить системы от атак и гарантировать целостность получаемой информации о времени. В итогеёёё NTP не только облегчает повседневные операции, но и обеспечивает необходимую безопасность, что делает его неотъемлемой частью любой надежной IT-инфраструктуры.