介绍
准确的时间记录对于几乎任何服务或软件都至关重要。电子邮件、日志记录器、事件系统和调度程序、用户认证机制以及在分布式平台上运行的服务都需要准确的时间戳来按时间顺序记录事件。这些服务使用网络时间协议(Network Time Protocol,NTP)将系统时钟与可信的外部来源进行同步。这个来源可以是原子钟、GPS 接收器或已经使用 NTP 的另一个时间服务器。
这就是 NTP Pool 项目的作用所在。它是一个庞大的全球时间服务器集群,为全球数千万客户端提供方便访问已知的“良好时间”。它是 Ubuntu 和大多数其他主要 Linux 发行版的默认时间服务器,以及许多网络设备和软件应用程序的默认时间服务器。
在本指南中,您将在服务器上设置 NTP,并将其配置为 NTP Pool 项目的一部分,以便为 NTP Pool 项目的其他用户提供准确的时间。提供您的空闲 CPU 周期和未使用的带宽是回馈社区的完美方式。
所需的带宽相对较低,并且可以根据您提供的数量和服务器所在位置进行调整。每个客户端每 20 分钟只会发送几个 UDP 数据包,因此大多数服务器每秒只会接收约十几个 NTP 数据包,每天会有一两次高达每秒一百个数据包的峰值。这意味着带宽使用量为 10-15Kb/秒,峰值为 50-120Kb/秒。
加入 NTP Pool 项目之前,您必须满足三个基本要求:
您的服务器必须具有静态 IP 地址。您的服务器必须具有永久稳定的互联网连接。您的 IP 地址不能经常更改,或者只能偶尔更改(一年或更少次)。对于大多数基于云的服务器,前两个要求通常会自动满足。第三个要求强调加入 NTP Pool 项目意味着长期承诺。当然,如果您的情况发生变化,将服务器从池中移除是可以的,但在流量完全消失之前可能需要很长时间(通常是几周,但有时可能是几个月甚至几年)。
先决条件
要完成本教程,您需要:
一个已配置 IPv6 网络的 Ubuntu 16.04 服务器。如果您需要在现有的 Droplet 上配置 IPv6 网络,可以按照本教程进行操作。一个具有 sudo 权限的非 root 用户和一个防火墙,您可以按照《使用 Ubuntu 16.04 初始服务器设置》教程进行设置。步骤 1 — 安装 NTP
NTP 包不是默认安装的,因此您将使用包管理器进行安装。首先,更新您的软件包:
sudo apt-get update
然后安装 NTP:
sudo apt-get install ntp
如果您按照先决条件中指定的方式配置了防火墙,则必须允许端口 123
上的 UDP 流量,以便与 NTP 池进行通信:
sudo ufw allow 123/udp
有关 UFW 的更多信息,请参阅《如何在 Ubuntu 上使用 UFW 设置防火墙》。
NTP 现在已安装,但它配置为使用默认的 NTP 池时间服务器。让我们选择一些特定的时间服务器。
步骤 2 — 选择合适的上游服务器
NTP Pool 项目要求希望加入池的运营商选择良好的本地网络时间服务器,而不是使用默认的 pool.ntp.org
服务器。这确保了 NTP Pool 项目保持可靠、快速和健康。在选择您的时间来源时,您需要一个稳定的网络连接,没有数据包丢失,并且服务器之间的跳数尽可能少。
多层次和分层的 NTP 协议将涉及的各方分为主要服务器、次要服务器和客户端。主要服务器称为 Stratum 1,直接连接到时间源,称为 Stratum 0。此源可以是原子钟、GPS 接收器或无线导航系统。链中的次要服务器称为 Stratum 2、Stratum 3 等。
每个服务器也是一个客户端。Stratum 2 客户端从上游 Stratum 1 服务器接收时间,并向下游 Stratum 3 服务器或其他客户端提供时间。为了使 NTP Pool 项目成员正常工作,NTP 守护程序需要配置至少三个服务器。该项目建议最少四个,最多七个来源。
NTP Pool 项目提供了公共 Stratum 1 和 Stratum 2 时间服务器的列表。这些列表指定了可供公共访问的 NTP 时间服务器,并附有规定的访问限制。您将找到三种类型:
OpenAccess:此时间服务器向符合 NTP Pool 使用建议的任何客户端开放。RestrictedAccess:此时间服务器除了符合 NTP Pool 使用建议外,还有一些访问限制。ClosedAccess:此时间服务器关闭或需要事先安排。访问 Stratum 1 时间服务器列表。您将看到如下列表:
!Stratum 1 服务器
按 ISO code 列对列表进行排序,并找到几个地理位置接近您服务器数据中心的服务器。当服务器的 Access Policy 列状态为 OpenAccess 时,您可以无问题使用它。如果它说“RestrictedAccess”,请单击打开条目,并阅读 AccessDetails 字段中的说明。通常,您会发现 NotificationMessage 设置为 Yes,这意味着您必须撰写一封非正式的电子邮件,发送到 ServerContact 中提供的地址,告知服务器运营商您希望将此时间服务器用作 NTP Pool 项目成员的时间来源。
确定了要使用的服务器后,请单击 ISO 列中的每个服务器的链接,并复制其主机名或 IP 地址。您将在第 3 步中使用这些地址。
接下来,从 Stratum 2 列表中选择三到四个服务器,按照相同的过程进行操作。
选择了时间服务器后,就该配置 NTP 客户端来使用它们了。
步骤 3 — 配置 NTP 加入时间池
要使用 NTP 时间池并配置新的时间服务器,您需要对 NTP 守护程序的配置进行一些修改。为此,请编辑 /etc/ntp.conf
文件:
sudo nano /etc/ntp.conf
首先,确保配置了 driftfile。driftfile 用于存储系统时钟运行在其名义频率和保持与正确时间同步所需频率之间的频率偏移。它有助于实现稳定和准确的时间。您应该在默认安装的配置文件顶部找到这个配置:
# /etc/ntp.conf, configuration for ntpd; see ntp.conf(5) for helpdriftfile /var/lib/ntp/ntp.drift...
接下来,从配置中删除默认的时间源条目。您需要删除所有符合模式 pool [0-3].ubuntu.pool.ntp.org iburst
或 pool ntp.ubuntu.com
的行。如果您使用默认配置,请删除以下突出显示的行:
# Use servers from the NTP Pool Project. Approved by Ubuntu Technical Board# on 2011-02-08 (LP: #104525). See http://www.pool.ntp.org/join.html for# more information.pool 0.ubuntu.pool.ntp.org iburstpool 1.ubuntu.pool.ntp.org iburstpool 2.ubuntu.pool.ntp.org iburstpool 3.ubuntu.pool.ntp.org iburst# Use Ubuntu's ntp server as a fallback.pool ntp.ubuntu.com
用您在上一步中选择的精选服务器替换您删除的行,使用 server
关键字而不是 pool
关键字。
...server ntp_server_hostname_1 iburstserver ntp_server_hostname_2 iburstserver ntp_server_hostname_3 iburstserver ntp_server_hostname_4 iburstserver ntp_server_hostname_5 iburst...
我们为每个服务器使用 iburst
选项,符合 NTP 时间池的建议。这样,如果服务器无法访问,它将发送八个数据包而不是通常的一个数据包。在 NTP 时间池项目中使用 burst
选项被认为是滥用,因为它会在每个轮询间隔发送这八个数据包,而 iburst
只在第一次发送这八个数据包。
接下来,确保默认配置不允许管理查询。如果不这样做,您的服务器可能会被用于 NTP 反射攻击,或者可能会容易受到试图修改服务器状态的 ntpq
和 ntpdc
查询的影响。检查默认的 restrict
行是否添加了 noquery
选项:
...# By default, exchange time with everybody, but don't allow configuration.restrict -4 default kod notrap nomodify nopeer noquery limitedrestrict -6 default kod notrap nomodify nopeer noquery limited# Local users may interrogate the ntp server more closely.restrict 127.0.0.1restrict ::1
您可以在官方文档中找到有关其他选项的更多信息。
您的 NTP 守护程序配置文件现在应该如下所示,尽管您的文件可能有额外的注释,您可以安全地忽略它们:
driftfile /var/lib/ntp/ntp.driftserver ntp_server_hostname_1 iburstserver ntp_server_hostname_2 iburstserver ntp_server_hostname_3 iburstserver ntp_server_hostname_4 iburstserver ntp_server_hostname_5 iburst# By default, exchange time with everybody, but don't allow configuration.restrict -4 default kod notrap nomodify nopeer noquery limitedrestrict -6 default kod notrap nomodify nopeer noquery limited# Local users may interrogate the ntp server more closely.restrict 127.0.0.1restrict ::1
保存文件并退出编辑器。
现在重新启动 NTP 服务,让您的时间服务器将其时钟与上游服务器同步。
sudo systemctl restart ntp.service
几分钟后,使用 ntpq
命令检查您的时间服务器的健康状况:
ntpq -p
输出应该类似于以下内容:
remote refid st t when poll reach delay offset jitter============================================================================== mizbeaver.udel. .INIT. 16 u - 64 0 0.000 0.000 0.000 montpelier.ilan .GPS. 1 u 25 64 7 55.190 2.121 130.492+nist1-lnk.binar .ACTS. 1 u 28 64 7 52.728 23.860 3.247*ntp.okstate.edu .GPS. 1 u 31 64 7 19.708 -8.344 6.853+ntp.colby.edu .GPS. 1 u 34 64 7 51.518 -5.914 6.669
remote 列告诉您 NTP 守护程序正在使用的服务器的主机名,refid 列告诉您服务器正在使用的源。因此,对于 Stratum 1 服务器,refid 字段应该显示 GPS、PPS、ACTS 或 PTB,而 Stratum 2 及更高级别的服务器将显示上游服务器的 IP 地址。st 列显示层级,delay、offset 和 jitter 告诉您有关时间源质量的信息。这三个字段的较低值对于质量更好。
您的时间服务器现在能够为公众提供时间。您可以通过从另一台主机调用 ntpdate
来验证这一点:
[environment second]ntpdate -q your_server_ip
输出应该类似于以下内容,并告诉您它调整了时间服务器和偏移量:
[environment second]server your_server_ip, stratum 2, offset 0.001172, delay 0.16428 2 Mar 23:06:44 ntpdate[18427]: adjust time server your_server_ip offset 0.001172 sec
现在,您已经准备好将您的 NTP 服务器注册到 NTP 时间池项目中,以便其他人可以使用它。
步骤 4 — 将服务器添加到 NTP 池中
要添加您的服务器以便其他人可以使用它,请访问 manage.ntppool.org 并注册一个帐户。您将收到一封来自 NTP Pool help@ntppool.org 的电子邮件,要求您验证您的帐户。按照电子邮件中的说明确认您的帐户,然后登录 manage.ntppool.org。
登录后,您将看到一个简单的界面用于添加服务器:
!添加服务器
输入您的服务器 IP 地址,然后单击 提交。
下一个屏幕会要求您验证它是否识别了您的服务器所在的区域。如果它显示您的服务器所在的区域与您预期的不同,请使用 评论 框让他们知道。
!验证屏幕
如果您满意,请通过单击 是的,这是我的服务器,添加它! 来确认条目。
您的服务器现在是 NTP 池项目的一部分。访问 http://www.pool.ntp.org/scores/your_server_ip
来查看 NTP 池的监控系统收集的有关您的服务器的信息。它每小时检查您的服务器几次,并显示偏移数据以及您系统的 分数。只要您的服务器时间准确并且可访问,分数就会上升,直到达到 20 分。只有分数高于 10 的服务器才会被用于池中。
故障排除连接问题
如果您在同步服务器时遇到问题,可能是因为您的 出站 数据包在端口 123
上被防火墙阻止。查看《如何在 Ubuntu 上使用 UFW 设置防火墙》以了解如何检查防火墙的状态。
如果 NTP 池项目的监控站无法访问您的 NTP 服务器,您的服务器分数正在下降,或者您无法使用您的服务器来同步其他时钟,可能是因为您的 入站 流量在端口 123
上被防火墙阻止。检查您的防火墙状态。
如果您确定自己没有设置防火墙,或者已经为入站和出站流量打开了端口 123
,那么您的服务器提供商或其他传输提供商可能会在传输过程中丢弃您的数据包。如果您没有能力自行解决这些问题,最好求助于社区。NTP 池项目的论坛是一个很好的起点。您还可以加入邮件列表或发送电子邮件给 NTP 池项目的运营商。在寻求帮助之前,请确保您可以展示您已经尝试解决问题的所有步骤。
结论
在本教程中,您成功地设置了自己的时间服务器,并使其成为 NTP 池项目的一员,为社区提供时间服务。要与时间保持联系,请加入 NTP 池项目的论坛或邮件列表。请务必监视您的服务器分数,并进行必要的调整。