如何在ubuntu上设置没有互联网访问权限的本地ntp服务器?

j9d*_*9dy 7 ubuntu ntp time-synchronization ntpd ntpdate

我已经尝试了几个关于如何在 ubuntu 上设置本地 ntp 服务器的指南,但似乎没有一个可以正常工作。由于某种原因,我的服务器在时间上严重漂移,我必须将它们的时间保持在一起,因为我运行的数据库需要这样做。

  • 我有 8 个 ubuntu 14.04 LTS 服务器,没有一个可以访问互联网
  • 我想在其中一台(或多台,如果更好的话)服务器上运行 ntp 服务器,并让所有其他服务器连接到 ntp 服务器以设置时间

目前,我的服务器(ip .24)运行这个 /etc/ntp.conf:

server 127.127.1.0 prefer
fudge  127.127.1.0 stratum 10
driftfile /var/lib/ntp/drift
broadcastdelay 0.008

# Give localhost full access rights
restrict 127.0.0.1

# Give machines on our network access to query us
restrict 192.168.178.0 mask 255.255.255.0 nomodify notrap

broadcast 192.168.178.0
Run Code Online (Sandbox Code Playgroud)

而在“客户”上:

# Point to our network's master time server
server 192.168.178.24 iburst
fudge 192.168.178.24  stratum 10

restrict default ignore
restrict ::1
restrict 127.0.0.1
restrict 192.168.178.24 mask 255.255.255.255 nomodify notrap noquery

driftfile /var/lib/ntp/drift

minpoll 4
maxpoll 5
Run Code Online (Sandbox Code Playgroud)

注意:我已经使用 Multi-Tabbed Putty 同时向所有 ntp 客户端发送以下命令。 我已经停止了除服务器之外的所有 ntp 服务,用于sudo ntpdate 192.168.178.24让他们获取日期并在之后重新启动 ntp 服务。这成功了。命令完成后,所有服务器都显示相同的日期。然而,大约 10 分钟后,我的服务器显示以下时间:

Fr 30. Sep 11:16:53 CEST 2016
Fr 30. Sep 11:15:33 CEST 2016 (server .24) 
Fr 30. Sep 11:16:50 CEST 2016
Fr 30. Sep 11:15:33 CEST 2016
Fr 30. Sep 11:17:05 CEST 2016
Fr 30. Sep 11:15:33 CEST 2016
Fr 30. Sep 11:15:33 CEST 2016
Fr 30. Sep 11:15:33 CEST 2016
Run Code Online (Sandbox Code Playgroud)

如何让它们正确同步到 ntp 服务器?我怎样才能减少轮询时间?看起来我的服务器很快就会失去同步,所以我需要它们再次检索“正确”的时间......

“正确”时间是指所有服务器都相同的时间。它不一定需要是准确正确的世界时间(如果你这样称呼它)。


编辑:我已经尝试了建议的配置设置。据我了解,这就是我的服务器/客户端配置的样子。与此同时,我发现我的 .24 服务器实际上正在变得更糟。.20 服务器是最准确的,我现在使用 .20 服务器来托管 ntp 服务器。对困惑感到抱歉。

服务器配置:

# Use the local clock
server 127.127.1.0 prefer
fudge  127.127.1.0
driftfile /var/lib/ntp/drift
broadcastdelay 0.008

# Give localhost full access rights
restrict default

# Give machines on our network access to query us
restrict 192.168.178.0 mask 255.255.255.0 nomodify notrap

broadcast 192.168.178.0
Run Code Online (Sandbox Code Playgroud)

对于客户:

# Point to our network's master time server
server 192.168.178.20 iburst

restrict default

driftfile /var/lib/ntp/drift

minpoll 4
maxpoll 5
Run Code Online (Sandbox Code Playgroud)

服务器上的 ntpq -as 和 ntpq -pe:

ntpq -c as
ind assid status  conf reach auth condition  last_event cnt
===========================================================
  1 41906  963a   yes   yes  none  sys.peer    sys_peer  3
  2 41907  8811   yes  none  none    reject    mobilize  1

ntpq -c pe
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*LOCAL(0)        .LOCL.           5 l   60   64  377    0.000    0.000   0.000
 192.168.178.0   .BCST.          16 u    -   64    0    0.000    0.000   0.000
Run Code Online (Sandbox Code Playgroud)

类似这样的输出的五倍(这些服务器会随着时间的推移而漂移):

ntpq -c as
ind assid status  conf reach auth condition  last_event cnt
===========================================================
  1 62104  9024   yes   yes  none    reject   reachable  2


ntpq -c pe
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 hadoop20.xx LOCAL(0)         6 u   27   64  377    0.151  63591.8 33407.0
Run Code Online (Sandbox Code Playgroud)

对于两个(最有可能的?)工作客户:

ntpq -c as
ind assid status  conf reach auth condition  last_event cnt
===========================================================
  1  7757  963a   yes   yes  none  sys.peer    sys_peer  3

ntpq -c pe
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
*hadoop20.xx LOCAL(0)         6 u   18   64  377    0.183    7.883   3.015
Run Code Online (Sandbox Code Playgroud)

编辑2:

我已经在所有客户端上使用sudo service ntp stop, sudo ntpdate 192.168.178.20, 等待 ntpdate 完成sudo service ntp start。仍然只有 2 个成功的客户和 5 个拒绝的客户。

拒绝客户端显示此输出。在delay+offset值看起来很高,因为没有客户时间漂移。也许他们不信任服务器来更新时间,因为延迟/偏移量太高了?

ntpq -c as
ind assid status  conf reach auth condition  last_event cnt
===========================================================
  1 20981  905a   yes   yes  none    reject    sys_peer  5

ntpq -c pe
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 hadoop20.xx LOCAL(0)         6 u   34   64    3    0.166  18665.9 16201.3
Run Code Online (Sandbox Code Playgroud)

我也尝试过使用这个https://askubuntu.com/a/256004答案,它工作了大约 30 秒,然后状态再次变为“拒绝”!对于ntpdate -s 192.168.178.20. 这很可能与 ntp 客户端拒绝服务器时间有关。有没有办法强迫他们改变时间?

Mad*_*ter 14

不要这样做。严重地。只是不要。人们不断提出这样的想法,即 NTP 旨在允许一堆机器拥有相同的时间。不是。它经过精心设计,可以让许多机器都拥有最接近正确时间的东西,这不是一回事。

如果您可以访问一个窗口,您可以花费大约 50 英镑构建一个中等的 1 层服务器,或者花费 100 英镑构建一个不错的服务器。你会做得更好,建立这样的东西,然后指向其他客户。正确的时间戳比仅仅自洽的时间戳要好得多,尤其是对于取证而言。

但是,如果你绝对必须做你正在做的事情,那么你需要意识到你在歪曲 ntpd,这意味着理解你在做什么。

在服务器上

server 127.127.1.0 prefer
fudge  127.127.1.0 stratum 10
Run Code Online (Sandbox Code Playgroud)

意思是“使用本地无纪律的时钟,就好像它是权威的一样”,这就是您想要的。不过,我不确定你为什么要强制它到第 10 层;考虑删除stratum 10,并让驱动程序提供其默认层 0。 在客户端上

server 192.168.178.24 iburst
fudge 192.168.178.24  stratum 10
Run Code Online (Sandbox Code Playgroud)

完全没有意义。 fudge 127.127.x.y保留用于强制使用各种本地时钟驱动程序。给它任何其他地址是没有意义的。fudge从客户端删除线路,并将它们指向服务器。您还使用了封闭网络,因此请放弃所有安全措施,直到您开始工作:

restrict default
Run Code Online (Sandbox Code Playgroud)

如果这似乎仍然不起作用,我们需要在至少十分钟的不间断运行后查看服务器和行为不良的客户端上的ntpq -c as和的输出ntpq -c pe

编辑:您在下面的评论中写道“我认为偏移/抖动非常高,因为失败的客户端会及时漂移”。

我想你可能是对的。 这个家伙的博客表明他有同样的经历:客户端时钟太糟糕了,以至于让当地人误ntpd以为服务器不可靠。他写了

巨大抖动的原因终于似乎清楚了!我们的时钟漂移如此之快,以至于通过我们的几次测量,偏移量会增加几秒钟

考虑到您的客户的时间过得最快而无法同步(将服务器标记为“拒绝”),我认为您看到了相同的效果。他的解决方案是使用adjtimex手动调整内核时钟(调整tick值),直到系统时钟不那么任性,此时 ntpd 有机会识别服务器正常,并与之同步。您可能应该先在最糟糕的客户端上尝试一下,看看是否有帮助。