介绍
什么是 NTP
准确时间对于几乎所有服务或软件都至关重要. 在分布式平台上运行的电子邮件, 记录器, 事件系统和调度程序, 用户身份验证机制和服务都需要准确的时间戳记录事件. 这些服务使用网络时间协议 (NTP) 将系统时钟与可信外部源同步. NTP 全称为 Network Time Protocol , 中文翻译为网络时间协议, 1985 年就已经被提出, 旨在缩短互联网上所有计算机设备与 UTC 的时间差. 通过 Marzullo 算法, 他可以选择准确的时间服务器, 并且可以适当减轻由于网络延迟所带来的误差. NTP 客户端将定期轮询不同网络上的三个或更多服务器. 为同步其时钟, 客户端必须计算其时间偏移量和来回通信延迟, 随后, 从最好的三个剩余中导出估算的时间偏移. 然后调整时钟频率以逐渐减小偏移 .
什么是 NTP 服务器池
NTP 服务器池是一个分布式的公益性项目, 简单来说, 他就是各个地区可用的 NTP 服务器的一个集合. 全世界各地的志愿者可以提交自己的 NTP 服务器到这个池中, 在用户需要进行 NTP 查询的时候, 通过 DNS 的按区域解析, 用户可以被分配到最近的服务器上, 这样可以减少网络延迟带来的误差, 准确的提供时间.
这是 NTP PoolProject http://www.pool.ntp.org/ 项目发挥作用的地方. 它是一个庞大的全球时间服务器集群, 被全球数以千万计的客户称为 "美妙时光". 它是 Ubuntu 和大多数其他主要 Linux 发行版的默认时间服务器, 以及许多联网设备和软件应用程序.
如果你有位于国内的, 长期可以使用的, 有固定 IP 的服务器, 你可以考虑参与进来这个项目. 无论你的带宽多少, 只要在服务器池中设置了服务器带宽, DNS 会对服务器的权重进行调整, 使之尽可能的不超过你所设定的带宽. 因此只要你有闲置的带宽, 就可以参与进来, 而不用担心影响正常的业务.
在本教程中, 您将在服务器上设置 NTP 并将其配置为 NTP 池项目的一部分, 以便为 NTP 池项目的其他用户提供准确的时间. 提供备用 CPU 周期和未使用的带宽也是是向社区提供回馈的绝佳方式.
NTP 所需带宽相对较低, 可根据您提供的数量和服务器所在的位置进行调整. 每个客户端每 20 分钟只发送几个 UDP 数据包, 大多数服务器每秒只接收大约 12 个 NTP 数据包, 每天发送一次高达每秒数百个数据包的峰值. 这意味着带宽使用量为 10-15Kb / 秒, 峰值为 50-120Kb / 秒.
在加入 NTP 池项目之前, 您必须满足三个基本要求:
您的服务器必须具有静态 IP 地址.
您的服务器必须具有永久稳定的 Internet 连接.
您的 IP 地址一般不更改, 或者很少更改(每年一次或更少).
对于大多数云的服务器, 通常会满足前两个要求. 第三个要求强调, 在加入 NTP 池项目将构成一个长期的承诺. 当然, 如果您的情况发生变化, 也可以将服务器从池中取出, 但在流量完全消失之前需要很长时间.
准备
要完成本教程, 您需要:
一台配置了公网 IP 的 Ubuntu 16.04 服务器. 没有服务器的同学可以在这里购买 https://cloud.tencent.com/product/cvm , 不过我个人更推荐您使用免费的腾讯云开发者实验室 https://cloud.tencent.com/developer/labs 进行试验, 学会安装后在购买服务器 https://cloud.tencent.com/product/cvm .
在您的服务器上启用防火墙, 如果您使用的是腾讯云的 CVM 服务器, 您可以直接在腾讯云控制台中的安全组 https://console.cloud.tencent.com/cvm/securitygroup 进行设置.
第一步, 安装 NTP
默认情况下系统不安装 NTP 软件包, 因此您将使用软件包管理器 apt 进行安装. 首先, 更新您的包:
sudo apt-get update
然后安装 NTP:
sudo apt-get install ntp
如果已按准备教程配置防火墙, 则必须允许 123 端口上的 UDP 通信才能与 NTP 池通信, 如果您使用的是腾讯云的 CVM 服务器, 您可以直接在腾讯云控制台中的安全组 https://console.cloud.tencent.com/cvm/securitygroup 进行设置.:
sudo ufw allow 123/udp
NTP 现已安装, 但已配置为使用默认的 NTP 池时间服务器. 让我们选择一些特定的时间服务器.
第二步, 选择一个合适的上游服务器
NTP 池项目要求加入池的运营商选择良好的网络本地时间服务器, 而不是使用默认 pool.ntp.org 服务器. 这可确保 NTP 池项目可靠, 快速. 在选择时间源时, 您需要稳定的网络连接, 不会丢失数据包, 并且服务器之间的转跳数尽可能少.
多层和分层 NTP 协议将所涉及的各方分为主服务器, 辅助服务器和客户端. 主服务器称为 Stratum1, 主服务器接连接到称为 Stratum 0 的时间源. 该源可以是一个原子钟, GPS 接收器或无线电导航系统. 辅助服务器称为 Stratum2,Stratum 3 等.
每个服务器也是一个客户端. Stratum 2 客户端从上游 Stratum 1 服务器接收时间, 并为下游 Stratum 3 服务器或其他客户端提供时间. 要使 NTP 池项目正常工作, NTP 至少需要配置三个服务器. 该项目建议至少四个, 不超过七个的时间源.
NTP 池项目提供了公共 Stratum 1 和 Startum 2 时间的服务器的列表. 这些列表指定了在规定限制下可用于公共访问的 NTP 时间服务器. 您会发现大致有三种类型:
OpenAccess: 此时间服务器对符合 NTP 池的任何客户端开放.
RestrictedAccess: 此时间服务器除了 NTP 池使用外还有一些访问限制.
ClosedAccess: 此时间服务器已关闭或关机.
警告: 除非您已获得批准, 否则请勿使用未列为 OpenAccess 的服务器.
访问 Stratum 1 Time Servers http://support.ntp.org/bin/view/Servers/StratumOneTimeServers 列表. 您将看到如下列表:
按 ISO 代码列对列表进行排序, 找到一个或两个地理位置靠近你的服务器的服务器. 当服务器的声明 OpenAccess 时, 您可以放心地使用它. 如果显示 "RestrictedAccess", 请单击以打开该条目并阅读 AccessDetails 字段中指出的说明. 通常, 您会发现 NotificationMessage 设置为 Yes, 这意味着您必须制作一个指向 ServerContact 中提供的地址的电子邮件, 通知服务器运营商您希望将此时间服务器用作 NTP 池项目的时间源.
确定要使用的服务器后, 单击 ISO 列中每个服务器的链接并复制其主机名或 IP 地址. 您将在第三步中使用这些地址. 接下来, 按照相同的过程从 Stratum2 http://support.ntp.org/bin/view/Servers/StratumTwoTimeServers 列表中选择三个或四个服务器.
选择时间服务器后, 就可以配置 NTP 客户端来使用它们了.
第三步, 配置 NTP 以加入池
要将服务器与 NTP 池一起使用, 需要配置新的时间服务器, 您需要对 NTP 守护程序的配置进行一些修改. 为此, 请编辑 / etc/ntp.conf 文件:
sudo nano /etc/ntp.conf
首先, 确保配置了一个频率文件. 频率文件存储以其标称频率运行的系统时钟与保持与正确时间同步所需的频率之间的频率偏移. 它有助于实现稳定和准确的时间. 您应该在默认安装的配置文件顶部找到它:
- # /etc/ntp.conf, configuration for ntpd; see ntp.conf(5) for help
- driftfile /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 iburst
- pool 1.ubuntu.pool.ntp.org iburst
- pool 2.ubuntu.pool.ntp.org iburst
- pool 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 iburst
- server ntp_server_hostname_2 iburst
- server ntp_server_hostname_3 iburst
- server ntp_server_hostname_4 iburst
- server ntp_server_hostname_5 iburst
- ...
我们根据 NTP 池建议为每个服务器使用 iburst 选项. 接下来, 确保默认配置不允许管理查询. 如果不这样做, 你的服务器可以在 NTP 反射攻击中使用, 也可能会受到 ntpq 和 ntpdc 试图修改服务器状态. 检查 noquery 选项是否已添加到默认 restrict 行:
- ...
- # By default, exchange time with everybody, but don't allow configuration.
- restrict -4 default kod notrap nomodify nopeer noquery limited
- restrict -6 default kod notrap nomodify nopeer noquery limited
- # Local users may interrogate the ntp server more closely.
- restrict 127.0.0.1
- restrict ::1
您的 NTP 守护程序配置文件现在应如下所示, 尽管您的文件可能有其他注释, 您可以忽略它们:
- driftfile /var/lib/ntp/ntp.drift
- server ntp_server_hostname_1 iburst
- server ntp_server_hostname_2 iburst
- server ntp_server_hostname_3 iburst
- server ntp_server_hostname_4 iburst
- server ntp_server_hostname_5 iburst
- # By default, exchange time with everybody, but don't allow configuration.
- restrict -4 default kod notrap nomodify nopeer noquery limited
- restrict -6 default kod notrap nomodify nopeer noquery limited
- # Local users may interrogate the ntp server more closely.
- restrict 127.0.0.1
- restrict ::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 调用来验证这一点:
ntpdate -q your_server_ip
输出结果应该与以下类似, 它告诉您它调整了时间服务器和偏移量:
- 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 服务器, 以便其他人可以使用它.
第四步 - 将服务器添加到 NTP 池
要添加您的服务器以便其他人可以使用, 可以访问 https://manage.ntppool.org/manage 并注册一个帐户. 您将收到来自 NTP Poolhelp@ntppool.org 的电子邮件, 要求您验证您的帐户. 按照电子邮件中的说明确认您的帐户, 然后登录 https://manage.ntppool.org/manage . 登录后, 您将看到添加服务器的界面:
输入服务器的 IP 地址, 然后单击 "提交".
下一个屏幕会要求您验证它是否已标识服务器的区域. 如果它将您的服务器显示在与您不同的地区, 使用 "Comment" 框可让他们了解情况.
如果您满意, 请单击 Yes, this is my server, add it!
您的服务器现在已经是 NTP 池项目的一部分了. 访问 http://www.pool.ntp.org/scores/your_server_ip 以查看 NTP Pool 的监控系统收集的有关您的服务器的信息. 它每小时会检查您的服务器几次, 并显示偏移数据, 与系统的分数对应. 只要您的服务器保持良好的时间并且可以访问, 分数就会上升, 直到达到 20 分. 池中仅使用分数高于 10 的服务器.
结论
在本教程中, 您成功学习了如何设置了自己的时间服务器, 并使其成为 NTP 池项目的成员, 为社区服务, 现在国内 NTP 服务器数量还是不够乐观, 还是那句话, 如果你有位于国内的, 长期可以使用的, 有固定 IP 的服务器, 你可以考虑参与进来这个项目. 无论你的带宽多少, 只要在服务器池中设置了服务器带宽, DNS 会对服务器的权重进行调整, 使之尽可能的不超过你所设定的带宽. 因此只要你有闲置的带宽, 就可以参与进来, 而不用担心影响正常的业务. 更多 Linux 教程请前往腾讯云 + 社区 https://cloud.tencent.com/developer 学习更多知识.
参考文献:
How to Configure NTP for Use in the NTP Pool Project on Ubuntu 16.04
国内 NTP 服务器池可能需要你的帮助
来源: https://www.qcloud.com/developer/article/1175079