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

Использование хоста как ntp-клиента и lxc-router как ntp-сервера

Я установил ntpd на свой хост-компьютер Debian, чтобы поддерживать аппаратные RTC в актуальном состоянии. При совместном использовании системных часов время автоматически распространяется на все установленные контейнеры (lxc). В одном из этих контейнеров работает мой маршрутизатор.

Я хотел бы использовать этот маршрутизатор для распространения своего времени на все заинтересованные устройства в моих сетях, чтобы им не требовалось подключение к Интернету сами по себе. Я не хочу использовать хост в качестве сервера (надеюсь, отключен interface ignore all).

Как я могу установить и настроить чистый ntp-сервер в контейнере, который использует системные часы в качестве единственного ориентира? Он никогда не будет устанавливать часы сам по себе.

Как я могу установить и настроить чистый ntp-клиент, который не принимает входящие соединения от других пиров и пропускает как можно меньше информации?

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

Мне было трудно собрать всю информацию и документацию, чтобы понять это (надеюсь) правильно. Даже файл конфигурации по умолчанию содержал несколько операторов, которые не рассматриваются на страницах руководства.

Следующая конфигурация работает нормально, не предоставляя лишней информации и услуг.

Это конфигурация, которая должна быть установлена ​​на хост-компьютере для принудительного выполнения клиентской операции:

>> my-host:/etc/ntp.conf

# stop listening for incoming connections an all interfaces including 0.0.0.0 and [::]
interface ignore all
interface ignore wildcard

# only allow listening on the interface used to contact the time servers
interface listen 10.2.20.2

# your pools or servers
pool 0.debian.pool.ntp.org iburst
pool 1.debian.pool.ntp.org iburst
pool 2.debian.pool.ntp.org iburst
pool 3.debian.pool.ntp.org iburst

# by default drop all incoming connections on all interfaces
restrict default ignore

# unrestriced control for local connections
restrict 127.0.0.1
restrict ::1

# Needed for adding pool entries
restrict source notrap nomodify noquery

Перезапуск службы дает нам понятный список прослушивающих сокетов. (my-host:ntp этого нельзя избежать из-за того, как работает NTPd.)

my-host:# netstat -a|grep ntp
udp        0      0 my-host:ntp   0.0.0.0:*
udp        0      0 localhost:ntp 0.0.0.0:*
udp6       0      0 localhost:ntp [::]:*

Это конфигурация, которая должна быть установлена ​​на маршрутизаторе-контейнере для обеспечения работы только сервера (поддерживаемой системными часами как источником времени, благодаря @BillThor):

>> router:/etc/ntp.conf

# don't update the system's clock
disable kernel

# local clock as preferred and only source
server 127.127.1.0 prefer

# stop listening for incoming connections an all interfaces including 0.0.0.0 and [::]
interface ignore all
interface ignore wildcard

# whitelist addresses to listen on for NTP clients
interface listen 10.1.2.1
interface listen 10.2.2.2
interface listen 10.3.2.3
interface listen 10.4.2.4
interface listen 10.5.2.5

# set "serve" as the only permission given to all listening interfaces per default
restrict default kod notrap nomodify nopeer noquery limited

# unrestriced control for local connections
restrict 127.0.0.1
restrict ::1

# broadcast time (optional)
broadcast 10.1.255.255
broadcast 10.2.255.255
broadcast 10.3.255.255
broadcast 10.4.255.255
broadcast 10.5.255.255

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

router:# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*LOCAL(0)        .LOCL.           5 l   16   64    3    0.000    0.000   0.000
 10.1.255.255    .BCST.          16 B    -   64    0    0.000    0.000   0.000
 10.2.255.255    .BCST.          16 B    -   64    0    0.000    0.000   0.000
 10.3.255.255    .BCST.          16 B    -   64    0    0.000    0.000   0.000
 10.4.255.255    .BCST.          16 B    -   64    0    0.000    0.000   0.000
 10.5.255.255    .BCST.          16 B    -   64    0    0.000    0.000   0.000

... и понятный список прослушивающих сокетов для обслуживания локальной сети.

router:# netstat -a|grep ntp
udp        0      0 router-lan5:ntp 0.0.0.0:*
udp        0      0 router-lan4:ntp 0.0.0.0:*
udp        0      0 router-lan3:ntp 0.0.0.0:*
udp        0      0 router-lan2:ntp 0.0.0.0:*
udp        0      0 router-lan1:ntp 0.0.0.0:*
udp        0      0 localhost:ntp   0.0.0.0:*
udp6       0      0 localhost:ntp   [::]:*

В disable kernel (благодаря @PaulGear) запрещает демону устанавливать системные часы, что недопустимо в типичном контейнере. В противном случае он заполняет журнал:

ntpd[1568]: adj_systime: Operation not permitted

При запуске еще есть какие-то безобидные глюки, как избавиться не знаю:

ntpd[1568]: start_kern_loop: ntp_loopfilter.c line 1119: ntp_adjtime: Operation not permitted
ntpd[1568]: set_freq: ntp_loopfilter.c line 1082: ntp_adjtime: Operation not permitted

Просто добавьте локальные часы в качестве сервера и отключите все серверы. Измените приоритет, чтобы, если кто-то включил ваш хост в качестве сервера, они не думали, что вы работаете и атомные часы. Это конфигурация, которую я использую для своих серверов:

# Fallback to local clock if all else fails
server  127.127.1.0     # local clock
fudge   127.127.1.0 stratum 10

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

restrict 192.168.0.0    mask 255.255.0.0     notrap nomodify nopeer noserve

Документация находится на ntp.org.