如何在 CentOS 和 Ubuntu 上安装和配置 NTP

介绍

在本文中,我们将了解什么是网络时间协议 (NTP),以及如何在 Liquid Web 服务器上最常用的两个 Linux 发行版上安装它。 我们将专注于使用 CentOS 7 和 Ubuntu 18.04 服务器,但在其他最新版本上,该过程基本相同。 在开始之前,请确保我们熟悉使用 SSH(安全 Shell),因为我们需要它来连接服务器。 如果您不熟悉 SSH 的用法,这里是我们关于 SSH 基础知识的一篇文章的链接。

我们将以 root 用户身份连接到服务器以简化操作。 如果您对终端不满意,您可能需要使用具有 sudo 特权。 我们将执行的命令将是相同的,但您需要在命令前面加上 sudo 命令。 如果您打算修改配置文件,您可能还需要熟悉基于命令行的文本编辑器,例如 nano 或 vim。 这是一篇可以更详细地解释这一点的文章。

警告:始终在修改文件之前对其进行备份。

我们将更详细地介绍 CentOS 安装并解释一些概念,然后仅在 Ubuntu 上展示类似的安装。

什么是NTP?

它的名字是不言自明的——网络时间协议是一种用于同步网络中计算机内部时钟时间的协议。 这适用于与 Internet 上的服务器同步时钟时间,以及同步本地网络上的机器。 它通常用于客户端-服务器配置,但也支持对等时间同步。 NTP 用于与协调世界时 (UTC) 同步,而时区管理由操作系统处理。 保持正确的时间对于日志记录、网络,甚至更重要的是集群和分布式计算机系统。

现在,我们不能真正安装协议,但我们实际要安装的是 NTP 守护进程,或 ntpd。 守护进程是在后台运行而无需任何干预的操作系统程序。 尽管计算机非常智能,但它们仍然只是受电子元件微小波动影响的机器。 这会导致时间漂移。 时间漂移是计时中的一个小不一致。 NTP 守护程序将通过定期查询 NTP 服务器来自动处理时钟时间同步,以纠正这些差异。

在 CentOS 7 上安装和配置 NTP

CentOS 附带了一个开箱即用的网络时间协议的替代实现,称为 chrony。 它在某种程度上扩展了 ntpd 的功能,但在某些情况下仍可能首选 ntpd。

禁用计时

为了设置 ntpd,(网络协议时间守护进程),我们首先需要禁用 chrony 守护进程。 这是必需的,因为两个守护程序使用相同的协议和端口,因此它们不能一起工作。 我们将使用以下命令执行此操作:systemctl stop chronyd 和 systemctl disable chrony 命令:

[root@CentOS ~]# systemctl stop chronyd
[root@CentOS ~]# systemctl disable chronyd
Removed symlink /etc/systemd/system/multi-user.target.wants/chronyd.service.

请记住,如果我们没有以 root 用户身份登录,我们将需要以用户身份运行这些命令 sudo 特权。 作为一个 example,我们将在以替代用户身份登录时检查 chronyd 服务状态 sudo 特权。

[user@host ~]$ sudo systemctl status chronyd
● chronyd.service - NTP client/server
   Loaded: loaded (/usr/lib/systemd/system/chronyd.service; disabled; vendor preset: enabled)
   Active: inactive (dead)
 	Docs: man:chronyd(8)
       	man:chrony.conf(5)
[...]

安装 ntpd

在 CentOS 和其他基于 RedHat 的发行版上的安装通常最好使用 yum 工具来处理。 我们将使用 yum install -y 命令。 -y 标志用于在任何提示时自动确认。

[root@CentOS ~]# yum install -y ntp

Yum 会自动为我们处理依赖关系,因此 ntpd 需要运行的任何丢失的包也会被安装。 我们应该在命令输出的末尾看到类似的内容。

Installed:
  ntp.x86_64 0:4.2.6p5-29.el7.centos

Dependency Installed:
  autogen-libopts.x86_64 0:5.18-5.el7           	

  ntpdate.x86_64 0:4.2.6p5-29.el7.centos

Complete!

如果它没有安装任何依赖项,请不要担心,因为这仅仅意味着我们已经安装了所有先决条件。

配置ntpd并检查防火墙

我们可以保持 ntpd 配置不变,或者我们可以更改 ntpd 服务将查询的时间服务器。 通常我们会希望使用一个时间服务器 close 到我们的位置或服务器的位置。 这 ntp池项目 是开始了解有关此主题的更多信息的好地方。

要进行更改,我们需要使用我们首选的 CLI 文本编辑器(Nano 或 Vim)打开 /etc/ntpd.conf 文件并编辑以下行。

server 0.centos.pool.ntp.org iburst
server 1.centos.pool.ntp.org iburst
server 2.centos.pool.ntp.org iburst
server 3.centos.pool.ntp.org iburst

出于本文的目的,我们将使用上面提到的默认时间服务器。

为了使 ntpd 能够有效地同步时间,它需要能够与外部网络资源进行通信,以便与权威的 NTP 服务器同步。 这意味着我们必须确保端口 123 对出站 UDP 流量开放。 如果我们的服务器将被配置为时间服务器,则只需要为入站流量打开端口。

我们的大部分 CentOS cPanel 和 Plesk 服务器都带有 csf 防火墙。 还有其他防火墙正在使用中,因此这些步骤可能会根据我们系统上安装的防火墙而有所不同。 要检查端口 123 是否打开,我们可以运行以下命令。

[root@CentOS ~]# grep UDP_ /etc/csf/csf.conf
UDP_IN = “20,21,53”
UDP_OUT = “20,21,53,113,123,873,6277”

或者,如果 firewalld 正在运行,我们可以使用这个命令。

[root@host ~]# firewall-cmd --list-ports | grep -i udp
20/udp
21/udp
123/udp
[root@host ~]#

每个人的输出可能并不相同,但只要端口 123 列在 UDP_OUT 部分中就可以了。 如果端口丢失,我们需要使用文本编辑器或 WHM 在 csf.conf 文件中添加端口,然后使用 csf -r 命令重新加载防火墙规则。 另外,如果使用firewalld并且端口没有打开,我们也可以运行这个命令来打开端口。


[root@host ~]# firewall-cmd --zone=public --add-port=123/udp --permanent

我们几乎准备好了! 我们需要做的最后一件事是选择一个时区。 正如我们之前所了解的,ntpd 实际上并不跟踪我们的本地时间,它只与 UTC 同步。 操作系统的时钟需要配置为使用所需的时区。 我们可以使用 timedatectl 命令检查当前时间、日期和时区。

[root@host ~]# timedatectl
      Local time: Thu 2020-03-12 15:43:55 EDT
  Universal time: Thu 2020-03-12 19:43:55 UTC
        RTC time: Thu 2020-03-12 19:43:56
       Time zone: America/New_York (EDT, -0400)
     NTP enabled: no
NTP synchronized: no
 RTC in local TZ: no
      DST active: yes
 Last DST change: DST began at
                  Sun 2020-03-08 01:59:59 EST
                  Sun 2020-03-08 03:00:00 EDT
 Next DST change: DST ends (the clock jumps one hour backwards) at
                  Sun 2020-11-01 01:59:59 EDT
                  Sun 2020-11-01 01:00:00 EST
[root@host ~]#

让我们寻找我们的时区。 可用的列表很大,因此最好使用以下命令搜索我们时区的主要城市。 只需复制命令并替换城市名称,它就会为我们提供时区名称。

[root@host ~]# timedatectl list-timezones | grep Detroit
America/Detroit
[root@host ~]#

要设置列出的时区,我们需要发出此命令。

[root@host ~]# timedatectl set-timezone America/Detroit
[root@host ~]#

当然,我们应该为我们的服务器使用从上一个命令的输出中收到的时区名称。

激活 ntpd

现在我们已经完成了所有的准备工作,让我们继续并激活 ntpd 服务。 systemctl start ntpd 命令将为此会话启动 ntp 守护进程。 systemctl enable ntpd 命令告诉操作系统在每次计算机启动时启动它。

[root@host ~]# systemctl start ntpd
[root@host ~]# systemctl enable ntpd
Created symlink from /etc/systemd/system/multi-user.target.wants/ntpd.service to /usr/lib/systemd/system/ntpd.service.

我们可以使用 systemctl status ntpd 命令确认服务正在运行。


[root@host ~]# systemctl status ntpd
● ntpd.service - Network Time Service
   Loaded: loaded (/usr/lib/systemd/system/ntpd.service; enabled; vendor preset: disabled)
   Active: active (running) since Mon 2020-03-12 19:03:45 EDT; 2min 49s ago
 Main PID: 23029 (ntpd)
   CGroup: /system.slice/ntpd.service
       	└─23029 /usr/sbin/ntpd -u ntp:ntp -g

[...]

就是这样,我们开始运行了! 由于 NTP 的功能,它需要一些时间才能完全同步,但不需要进一步的操作。

在 Ubuntu 上安装和配置 NTP

在 Ubuntu 上安装和配置 NTP 与在 CentOS 上安装非常相似。 如果您只是为了本节而阅读本文并发现不清楚的地方,请查看上面的上一节,因为那里可能会进一步详细解释。

Ubuntu 还以 systemd-timesyncd 模块的形式提供了另一种 NTP 实现。 这不是 Ubuntu 独有的,但通常默认情况下在 Ubuntu 上启用。

禁用时间同步

首先,我们将使用 timedatectl 命令检查 timesyncd 是否处于活动状态。

[root@host ~]# timedatectl
                  	Local time: Mon 2020-03-09 23:44:50 UTC
              	Universal time: Mon 2020-03-09 23:44:50 UTC
                    	RTC time: Mon 2020-03-09 23:44:50
                   	Time zone: UTC (UTC, +0000)
   	System clock synchronized: yes
systemd-timesyncd.service active: yes
             	RTC in local TZ: no
root@ubuntu1804:~#

如果我们看到系统时钟已同步并且 systemd-timesyncd.service 活动行返回“yes”,这意味着系统当前正在使用 timesyncd 同步到时间服务器。 正如 ntpd 不能在 CentOS 上与 chrony 一起运行,它也无法在 Ubuntu 上与 timesyncd 一起运行。 我们将使用以下命令禁用 timesyncd。

[root@host ~]# timedatectl set-ntp no

如果我们再次运行 timedatectl,我们将在输出底部看到不同之处。

       System clock synchronized: yes
systemd-timesyncd.service active: no
             	 RTC in local TZ: no

Systemd-timesyncd.service active 现在返回“no”,这意味着 timesyncd 已被禁用。

防火墙设置

在 Ubuntu 上,我们通常不需要检查防火墙设置,因为它的防火墙默认允许出站连接。 如果 timesyncd 已经正常工作,则尤其如此。 但是,如果未启用它,我们可以轻松地允许 ntpd 与权威时间服务器进行通信。 运行此命令会将其设置为与先前安装相同的行为。

[root@host ~]# ufw allow out 123/udp

如果我们的服务器将用作时间服务器,我们将需要允许到端口 123 的入站和出站连接,这与上面的命令非常相似。

[root@host ~]# ufw allow 123/udp

安装 ntpd

Ubuntu 和其他基于 Debian 的 Linux 发行版主要使用 apt(或 apt-get)工具来安装和管理软件包。 因此,我们需要做的第一件事是使用 apt update 命令更新我们的软件包列表。 这可确保我们获得要安装的软件的最新版本。

[root@host ~]# apt update
[...]
Reading package lists... Done
Building dependency tree
Reading state information... Done
88 packages can be upgraded. Run 'apt list --upgradable' to see them.

现在我们可以安装 ntp 包了。 我们将再次使用 -y 标志来自动确认任何交互式提示。 我们将看到 apt 像 yum 一样自动管理安装依赖项。

[root@host ~]# apt install -y ntp
Reading package lists... Done
Building dependency tree
Reading state information... Done
[...]
The following additional packages will be installed:
  libopts25 sntp
Suggested packages:
  ntp-doc
The following NEW packages will be installed:
  libopts25 ntp sntp
[...]

激活 ntpd

一个小的区别是 apt 将在安装后立即启动并启用 ntpd 服务。

[root@host ~]# systemctl status ntp
● ntp.service - Network Time Service
   Loaded: loaded (/lib/systemd/system/ntp.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2020-03-10 00:29:09 UTC; 3min 56s ago
 	Docs: man:ntpd(8)
 Main PID: 15183 (ntpd)
	Tasks: 2 (limit: 2317)
   CGroup: /system.slice/ntp.service
       	└─15183 /usr/sbin/ntpd -p /var/run/ntpd.pid -g -u 111:118

[...]

设置并激活 ntp 后,我们可以使用 ntpq -p 命令检查 ntpd 与其他时间服务器的连接。

[root@host ~]# ntpq -p
 	remote       refid  	st t when poll reach   delay  offset jitter
========================================================================
 0.ubuntu.pool.n .POOL.      	16 p	-   64	0	0.000	0.000   0.000
 1.ubuntu.pool.n .POOL.      	16 p	-   64	0	0.000	0.000   0.000
 2.ubuntu.pool.n .POOL.      	16 p	-   64	0	0.000	0.000   0.000
 3.ubuntu.pool.n .POOL.      	16 p	-   64	0	0.000	0.000   0.000
 ntp.ubuntu.com  .POOL.      	16 p	-   64	0	0.000	0.000   0.000

[...]

我们可以像上面 CentOS 部分中描述的那样更改 ntp 服务器并更改我们服务器的时区,不同之处在于 ntp 配置文件位于 Ubuntu 上的 /etc/ntp.conf 中。

在这两个发行版上,请确保重新加载 ntpd 服务,因为在服务运行时对配置文件的任何更改都需要保存,否则设置将不会生效。 我们还可以使用 systemctl reload ntp 命令重新加载服务。

手动同步

如果我们需要手动初始化 ntp 同步,我们可以通过三个简单的步骤来完成。 这适用于两种发行版。

步骤 1. 停止 ntpd 服务。

[root@host ~]# systemctl stop ntpd

步骤 2. 运行 ntpd -gq 命令强制手动时间同步。

[root@host ~]# ntpd -gq
ntpd: time slew +0.001347s

步骤 3. 重新启动 ntpd 服务。

[root@host ~]# systemctl start ntpd

如果您遇到任何问题或对此主题有任何疑问,请立即致电 800.580.4985 联系我们,或打开 聊天 或与我们联系,与我们知识渊博的系统管理员之一交谈!