5. 准确的全球时间同步

在所有系统中拥有准确的时间与拥有可靠的网络安全策略(不仅仅是通过简单的防火墙盒子实现)同样重要。它是基于良好实践的系统管理的主要组成部分之一,这有助于组织和安全。特别是在管理分布式应用程序、Web服务,甚至分布式安全监控工具时,准确的时间是必不可少的。

5.1. NTP:网络时间协议

我们这里不讨论协议本身,而是讨论这项伟大的发明如何与互联网的普及性相结合,为我们所用。您可以在 www.ntp.org 找到更多相关信息。

一旦您的系统正确设置,NTP 将管理保持其时间的准确性,进行非常小的调整以不影响正在运行的应用程序。

人们可以使用基于原子电子频率的硬件来获得精确的时间。还有一种基于 GPS(全球定位系统)的方法。前者更准确,但后者也相当不错。原子钟需要非常特殊和昂贵的设备,但它们的维护者(通常是大学和研究实验室)将它们连接到运行 NTP 守护程序的计算机,其中一些计算机连接到互联网,最终让我们免费访问它们。这就是我们将同步系统的方式。

5.2. 构建一个简单的时间同步架构

您将需要

  1. 直接或间接(通过防火墙)连接到互联网。

  2. 选择一些 NTP 服务器。您可以使用公共服务器 pool.ntp.org,或者从 NTP 网站上的 stratum 2 公共时间服务器 中选择一些。如果您没有互联网访问,您的 WAN 管理员(必须是一位聪明的人)可以为您提供一些内部地址。

  3. 在您要同步的所有系统中安装 NTP 软件包。您可以在您喜欢的 Linux 发行版 CD 中找到 RPM,或者在 rpmfind.net进行搜索

这是一个良好架构的示例

图 1. NTP 的本地中继服务器

如果您有几台机器要同步,不要 让它们都访问您选择的远程 NTP 服务器。只有您的服务器群中的 2 台机器必须访问远程 NTP 服务器,其他机器将与这两台机器同步。我们将它们称为中继服务器

您的中继服务器可以是您网络中已有的任何机器。NTP 消耗的内存和 CPU 很低。您不需要为此使用专用机器。

Tip

最好为您的本地中继服务器创建主机名别名,例如 ntp1.my.com 和 ntp2.my.com,并在配置客户端机器时仅使用这些名称。这样,您可以将 NTP 功能移动到新的中继服务器(具有不同的 IP 和主机名),而无需重新配置客户端。请让您的 DNS 管理员创建此类别名。

5.3. NTP 配置

对于您的中继服务器

编辑/etc/ntp.conf并添加您选择的远程服务器

示例 5. 中继机器的配置/etc/ntp.conf

.
.
server  otherntp.server.org	# A stratum 1 server at server.org
server  ntp.research.gov	# A stratum 2 server at research.gov
.
.

同样,您可以使用公共服务器 pool.ntp.org,或者从 NTP 网站获取 公共 stratum 2 时间服务器 的列表。

对于您的客户端

编辑/etc/ntp.conf并使用标准名称添加您的中继服务器

示例 6. 客户端机器的配置/etc/ntp.conf

.
.
server  ntp1.my.com		# My first local relay
server  ntp2.my.com		# My second local relay
.
.

如果您的机器的 UTC 时间与 NTP 服务器相比有几分钟以上的差异,NTP 将无法工作。因此,您必须进行首次完全同步,我建议您在非生产时间进行。您只需要在进行初始 NTP 设置时执行此操作。以后再也不需要了。

示例 7. 首次同步

bash# ntpdate otherntp.research.gov	(1)
24 Mar 18:16:36 ntpdate[10254]: step time server 200.100.20.10 offset -15.266188 sec
bash# ntpdate otherntp.research.gov	(2)
24 Mar 18:16:43 ntpdate[10255]: adjust time server 200.100.20.10 offset -0.000267 sec
(1)
首次完全同步。我们慢了 15 秒。
(2)
第二次完全同步,只是为了确保。现在我们实际上慢了 0 秒,这很好。

最后一步是在每台机器上启动或重启 NTP 守护程序

bash# service ntpd restart
			

5.4. 观察您的机器同步

现在您已经完成所有设置。NTP 将平稳地保持您的机器时间同步。您可以使用 NTP 查询(ntpq 命令)来观察此过程。

示例 8. 时间同步状态

bash# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
-jj.cs.umb.edu   gandalf.sigmaso  3 u   95 1024  377   31.681  -18.549   1.572
 milo.mcs.anl.go ntp0.mcs.anl.go  2 u  818 1024  125   41.993  -15.264   1.392
-mailer1.psc.edu ntp1.usno.navy.  2 u  972 1024  377   38.206   19.589  28.028
-dr-zaius.cs.wis ben.cs.wisc.edu  2 u  502 1024  357   55.098    3.979   0.333
+taylor.cs.wisc. ben.cs.wisc.edu  2 u  454 1024  347   54.127    3.379   0.047
-ntp0.cis.strath harris.cc.strat  3 u  507 1024  377  115.274   -5.025   1.642
*clock.via.net   .GPS.            1 u  426 1024  377  107.424   -3.018   2.534
 ntp1.conectiv.c 0.0.0.0         16 u    - 1024    0    0.000    0.000 4000.00
+bonehed.lcs.mit .GPS.            1 u  984 1024  377   25.126    0.131  30.939
-world.std.com   204.34.198.40    2 u  119 1024  377   24.229   -6.884   0.421

每列的含义

remote

是远程 NTP 服务器的名称。如果您使用-n开关,您将看到这些服务器的 IP 地址而不是它们的主机名。

refid

表示每个服务器当前从哪里获取时间。它可以是服务器主机名,也可以是像 .GPS. 这样的东西,表示全球定位系统源。

st

Stratum 是一个从 1 到 16 的数字,用于指示远程服务器的精度。1 是最准确的,16 表示“服务器不可达”。您的 Stratum 将等于准确的远程服务器加上 1。永远不要连接到 Stratum 1 服务器,使用 Stratum 2 服务器!Stratum 2 服务器对于我们的目的也很好,并且此策略有助于减少到 Stratum 1 服务器的流量。

poll

时间请求之间的轮询间隔(以秒为单位)。该值将在最小和最大允许轮询值之间变化。最初,该值会较小,以允许快速发生同步。在时钟“同步”后,轮询值将增加,以减少网络流量和热门时间服务器上的负载。

reach

这是 8 位数组的八进制表示,表示本地机器尝试连接服务器的最近 8 次尝试。如果连接到远程服务器,则设置该位。

delay

接收“现在几点”请求的响应所需的时间量(秒)。

offset

最重要的值。本地服务器和远程服务器之间的时间差。在同步过程中,offset 值会降低,表明本地机器时间变得更加准确。

jitter

离散度,也称为 Jitter,是多个连续请求/响应对中 offset 的统计方差的度量。较低的离散度值优于较高的离散度值。较低的离散度允许更准确的时间同步。

服务器主机名前的符号的含义

-

表示本地 NTP 服务不太喜欢此服务器

+

表示本地 NTP 服务喜欢此服务器

x

标记一个坏主机

*

指示当前首选

5.5. 配置为在启动时自动运行 NTP

您可能希望 NTP 始终运行,即使您重新启动机器也是如此。在每台机器上,执行以下操作

bash# chkconfig --level 2345 ntpd on
			

这将确保自动启动。

如果您的机器在没有重启的情况下运行了很长时间(几个月、几年),您会发现不准确的硬件时钟和(现在非常准确的)系统时间之间存在很大差异。现代 Linux 发行版在每次系统关闭时都会将操作系统时间复制到 HC,使用类似于 setclock 命令 的机制。这样,在下次操作系统启动时,您将获得几乎与您关闭机器时一样准确的日期和时间。