我在 Debian 主机上安装了 ntpd,以使硬件 RTC 保持“最新”。通过共享系统时钟,时间会自动传播到所有已安装的容器 (lxc)。其中一个容器运行我的路由器。
我想使用此路由器将其时间传播到我网络中所有相关的设备,这样它们就不需要自己连接互联网了。我不想将主机用作服务器(希望被禁用interface ignore all
)。
如何在容器中安装和配置纯 ntp 服务器,以系统时钟作为唯一参考?它永远不会自行设置时钟。
如何安装和配置纯 ntp 客户端,它不接受来自其他对等方的传入连接并泄露尽可能少的信息?
答案1
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
答案2
只需将本地时钟添加为服务器并禁用所有服务器。 弄虚作假,这样如果有人将您的主机作为服务器,他们就不会认为您正在运行原子时钟。 这是我为我的服务器使用的配置:
# 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。