Настройка NTP-сервера в локальной сети на FreeBSD
Делал ревизию своих сетевых сервисов и решил заодно описать, как развернуть собственный NTP-сервер для синхронизации времени на компьютерах в локальной сети. Если в офисе больше десяти машин и уже работает шлюз или сервер на FreeBSD, поднять локальный сервер времени – дело десяти минут.
Коротко: во FreeBSD демон ntpd уже входит в базовую систему. Нужно лишь прописать автозапуск в /etc/rc.conf, указать пулы pool.ntp.org и безопасные правила restrict в /etc/ntp.conf, открыть порт UDP 123 в файрволе и проверить пиры через ntpq -p.
На нашем шлюзе уже крутятся файловый сервер, DNS, VPN и локальный сайт, поэтому добавить сюда ещё и раздачу точного времени по протоколу NTP напрашивалось само собой. Ничего стороннего из портов ставить не приходится.
1. Включаем автозапуск ntpd
Добавляем параметры запуска в /etc/rc.conf:
sysrc ntpd_enable="YES" sysrc ntpd_sync_on_start="YES"
Если хочется явно указать нестандартный путь к конфигу (как было на старых системах – например, /etc/ntp/ntp.conf), дополнительно прописывают ntpd_config="/etc/ntp/ntp.conf". Но по умолчанию современная FreeBSD читает стандартный файл /etc/ntp.conf.
2. Настраиваем /etc/ntp.conf и права доступа
Раньше многие задавали внешние серверы жёстко по IP-адресам провайдеров. На практике такой подход со временем ломается: чужие серверы переезжают, меняют адреса или закрывают публичный доступ. Надёжнее использовать динамические пулы проекта pool.ntp.org с опцией iburst для быстрой первичной синхронизации.
Откройте /etc/ntp.conf и соберите базовую конфигурацию:
# Внешние источники точного времени pool 0.freebsd.pool.ntp.org iburst pool europe.pool.ntp.org iburst # Файл дрейфа часов и журнал работы driftfile /var/db/ntpd.drift logfile /var/log/ntpd.log # Ограничения по умолчанию (защита от DDoS-амплификации) restrict default limited kod nomodify notrap nopeer noquery restrict -6 default limited kod nomodify notrap nopeer noquery # Полный доступ для локального хоста restrict 127.0.0.1 restrict -6 ::1 # Разрешаем своей подсети только получать время (подставьте свою маску) restrict 10.0.0.0 mask 255.255.248.0 nomodify notrap nopeer noquery
ignore отбрасывает ответы от любых узлов, которые не прописаны отдельным правилом restrict. С директивой pool пул выдаёт меняющиеся IP-адреса, поэтому вариант с limited kod nomodify notrap nopeer noquery защищает сервер от злоупотреблений, но не ломает синхронизацию с внешним пулом.3. Файл дрейфа, файрвол и запуск службы
Создаём пустой файл дрейфа, если его ещё нет, и открываем порт UDP 123 в правилах ipfw только для доверенной сети или исходящего обмена (в продакшене лучше ограничить any вашими подсетями):
touch /var/db/ntpd.drift ipfw add allow udp from 10.0.0.0/21 to me 123 keep-state service ntpd start
Если служба уже работала с прежним конфигом, примените изменения перезапуском:
service ntpd restart
4. Проверяем синхронизацию
После старта демону требуется несколько минут (обычно 5–10), чтобы опросить источники и выбрать ведущий сервер. Список подключений смотрим командой:
ntpq -p
Звёздочка * в первой колонке означает текущий выбранный эталон, а плюсы + – годных кандидатов. Если в колонке стратума st у какого-то узла стоит 16, значит сервер недоступен или ещё не ответил.
Проверить ответ локального сервера с другого компьютера или с того же хоста можно утилитой ntpdate -q (флаг -q только опрашивает время без перевода системных часов):
ntpdate -q 10.0.0.1
В локальной корпоративной сети я также иногда заводил на внутреннем DNS запись для time.windows.com, указывающую на 10.0.0.1 – тогда рабочие ПК с Windows автоматически брали время у моего шлюза без перенастройки каждой машины. Единственное условие для такой схемы – клиенты должны использовать локальный DNS без DoH в браузере/ОС, а отдельным компьютерам можно просто указать адрес сервера времени в самой Windows.
Типичные ошибки и предупреждения в логах
- Frequency format error in ntpd.drift: появляется при первом запуске, когда файл дрейфа пустой; после расчёта смещения
ntpdперезапишет его сам. - Bad file descriptor: файл
ntpd.driftотсутствует или указан неверный путь вntp.conf(в новых версиях файл по умолчанию называется/var/db/ntpd.drift). - Address already in use (port 123): обычно означает, что уже запущен второй экземпляр
ntpdили процесс ещё не освободил сокет; проверьте занятые порты командойsockstat -46 | grep 123. - Ротация логов:
ntpdпишет в лог совсем немного событий, но при желании стандартный файл/var/log/ntpd.logлегко добавить в/etc/newsyslog.conf.
В целом штатного демона ntpd во FreeBSD с головой хватает для офисной сети: настроил один раз – и все рабочие станции, серверы и камеры в локалке держат одинаковое время без лишних походов наружу.
