将Chrony配置为NTP服务器和客户端(CentOS/RHEL 8)的步骤

时间:2020-01-09 10:37:43  来源:igfitidea点击:

在本文中,我们将学习如何将chrony配置为NTP服务器和NTP客户端。使用chrony suite,我们可以使用网络时间协议(NTP)"将系统时钟与外部时间服务器同步"。

在RHEL 7中,可以在ntpd和chronyd守护程序之间进行选择,可以分别从ntp和chrony软件包的存储库中获得。但是在Red Hat Enterprise Linux 8中,NTP协议由chronyd守护程序实现,可以从chrony软件包的存储库中获得。因此,在本文中,我们将使用Chrony并将其配置为NTP服务器,并使用示例来强制与NTP Server进行同步。

提示:

我正在使用CentOS/RHEL 8进行本文的演示,以将chrony配置为NTP服务器和NTP客户端,但是相同的步骤将在RHEL/CentOS 7上运行。如果发现任何差异,请通过本文的注释部分通知我文章。

chrony是一对程序,用于维护计算机上系统时钟的准确性,它包括:

  • chronyd,一个在用户空间中运行的守护程序,以及

  • chronyc,一个用于对chronyd进行调整的命令行程序。

实验室环境

我在Linux服务器上安装了两个在Oracle VirtualBox上运行的虚拟机,这些虚拟机将用于将chrony配置为NTP Server和NTP Client。

主机名→centos-8.example.com→IP 192.168.0.113主机名→rhel-8.example.com→IP 192.168.0.115

我将使用centos-8通过外部NTP池配置NTP客户端,配置完成后,我将使用相同的节点(centos-8)将Chrony配置为NTP服务器,而rhel-8将充当NTP客户端。

安装Chrony

在开始将chrony配置为NTP服务器之前,我们必须确保chrony在我们的系统上可用。

说明:

在RHEL系统上,我们必须具有RHN的有效订阅,或者我们可以配置本地脱机存储库,通过该本地脱机存储库,yum软件包管理器可以安装提供的rpm及其依赖项。

[root@centos-8 ~]# yum -y install chrony

将Chrony配置为NTP客户端

在开始将chrony配置为NTP服务器的步骤之前,让我们了解与chrony.conf一起使用的一些基本指令。 chronyd的默认配置文件是/etc/chrony.conf。 -f选项可用于指定备用配置文件路径。

以下是一些chronyd配置选项,我们将使用它们来将chrony配置为NTP服务器和NTP客户端:

服务器主机名[选项]…服务器指令指定了可以用作时间源的NTP服务器。客户端与服务器之间的关系严格地是分层的:客户端可以将其系统时间与服务器的系统时间同步,但是服务器的系统时间永远不会受到客户端的系统时间的影响。

服务器指令后紧跟服务器名称或者其IP地址。

pool name [option] ...该指令的语法与server指令的语法相似,不同之处在于它用于指定NTP服务器池而不是单个NTP服务器。池名称应解析为可能随时间变化的多个地址。

池指令的一个示例是

pool pool.ntp.org iburst maxsources 3

iburst使用此选项,发送到服务器的前四个请求之间的间隔将为2秒或者更短,而不是minpoll选项指定的间隔,该间隔允许chronyd在启动后不久进行时钟的第一次更新。 。

makestep如果由于任何原因系统时钟可能在启动后与真实时间相去甚远,应允许chronyd通过步进而不是回转来快速纠正它,这将花费很长时间。 makestep指令可以做到这一点。

使用此伪指令的示例是:

makestep 1000 10

如果调整大于1000秒,则这将使系统时钟步进,但仅在前十个时钟更新中。

driftfile为了在下次启动时稳定初始同步,系统时钟的估计漂移将保存到driftfile指令指定的文件中。

rtcsync默认情况下,rtcsync指令存在于/etc/chrony.conf文件中,并启用一种模式,在该模式下,系统时间会定期复制到RTC,而chronyd不会尝试跟踪其漂移。这将通知内核系统时钟保持同步,并且内核将每11分钟更新一次实时时钟。

[root@centos-8 ~]# timedatectl
               Local time: Sat 2019-11-02 16:30:37 IST
           Universal time: Sat 2019-11-02 11:00:37 UTC
                 RTC time: Sat 2019-11-02 10:50:04
                Time zone: Asia/Kolkata (IST, +0530)
System clock synchronized: no
              NTP service: inactive
          RTC in local TZ: no

如果synchronizedyes,则chronyd(ntpd)处于同步状态,并且11分钟模式正在工作。如果我们在/etc/chrony.conf中禁用rtcsync选项,则synced为no。因此内核纪律被禁用,并且11分钟模式将不起作用。

chrony基本上适用于回转模式。如果chrony(或者nptd)以回转模式工作,则chrony(或者ntpd)不会让内核知道它是否已同步。但是chrony具有" rtcsync"作为默认选项,因此chryony可以让内核知道每10分钟同步一次

Chrony可以使用更多的指令,但是这些指令会使本文变得很长,因此我们可以参考chrony.conf的手册页以获得chrony支持的所有指令的列表。

Chrony NTP客户端的最少配置

将Chrony套件配置为NTP客户端所需的非常少的配置(/etc/chrony.conf)是

pool pool.ntp.org iburst
driftfile /var/lib/chrony/drift
makestep 10 3
rtcsync

其中我们使用池指令,而不是选择单个NTP服务器。

提示:

这需要活动的Internet连接,因为该节点需要联系`pool。

ntp.org`获取系统时间

接下来,我们需要检查系统是否已经使用NTP通过网络同步我们的系统时钟:

[root@centos-8 ~]# timedatectl
               Local time: Sat 2019-11-02 16:30:37 IST
           Universal time: Sat 2019-11-02 11:00:37 UTC
                 RTC time: Sat 2019-11-02 10:50:04
                Time zone: Asia/Kolkata (IST, +0530)
System clock synchronized: no
              NTP service: inactive
          RTC in local TZ: no

当我们看到NTP服务处于非活动状态时,我们可以启动chrony服务或者使用" timedatectl"命令将其变为活动状态。

[root@centos-8 ~]# systemctl is-active chronyd
inactive

现在,让我们将NTP服务状态更改为"活动"

[root@centos-8 ~]# timedatectl set-ntp yes

将时钟与NTP服务器同步后,以上命令中的"系统时钟同步"选项应变为"是"。

启用chronyd服务以在启动时启动服务

[root@rhel-8 ~]# systemctl enable chronyd

接下来,使用在另一终端上运行的tcpdump重新启动chronyd服务以监视流量

[root@centos-8 ~]# systemctl restart chronyd

我们还将使用tcpdump监视NTP流量。

[root@centos-8 ~]# tcpdump port 123 -i enp0s8
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp0s8, link-type EN10MB (Ethernet), capture size 262144 bytes
21:12:05.038966 IP 162.159.200.1.ntp > centos-8.example.com.47655: NTPv4, Server, length 48
21:12:05.188531 IP centos-8.example.com.34596 > 157.119.108.165.ntp: NTPv4, Client, length 48
21:12:05.201794 IP 157.119.108.165.ntp > centos-8.example.com.34596: NTPv4, Server, length 48
21:12:05.392352 IP centos-8.example.com.60625 > 162.159.200.123.ntp: NTPv4, Client, length 48
21:12:05.437231 IP 162.159.200.123.ntp > centos-8.example.com.60625: NTPv4, Server, length 48
21:12:07.161521 IP centos-8.example.com.39474 > 162.159.200.1.ntp: NTPv4, Client, length 48
21:12:07.170817 IP mail.deva-ayurveda.eu.ntp > centos-8.example.com.49992: NTPv4, Server, length 48
21:12:07.205930 IP 162.159.200.1.ntp > centos-8.example.com.39474: NTPv4, Server, length 48
21:12:07.365353 IP centos-8.example.com.51002 > 157.119.108.165.ntp: NTPv4, Client, length 48
21:12:07.381159 IP 157.119.108.165.ntp > centos-8.example.com.51002: NTPv4, Server, length 48

我们可以看到客户端计算机从NTP服务器请求时间,然后NTP服务器在下一行响应。

说明:

这也可以突出显示" iburst"选项。请注意,正如我在本文前面提到的,数据包通信之间有两秒钟的区别。

接下来检查服务状态

[root@centos-8 ~]# systemctl status chronyd
● chronyd.service - NTP client/server
   Loaded: loaded (/usr/lib/systemd/system/chronyd.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2019-11-04 11:07:41 IST; 9h ago
     Docs: man:chronyd(8)
           man:chrony.conf(5)
  Process: 779 ExecStartPost=/usr/libexec/chrony-helper update-daemon (code=exited, status=0/SUCCESS)
  Process: 760 ExecStart=/usr/sbin/chronyd $OPTIONS (code=exited, status=0/SUCCESS)
 Main PID: 776 (chronyd)
    Tasks: 1 (limit: 11519)
   Memory: 1.9M
   CGroup: /system.slice/chronyd.service
           └─776 /usr/sbin/chronyd

此命令显示有关chronyd正在访问的当前时间源的信息。

[root@centos-8 ~]# chronyc sources
210 Number of sources = 4
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* 162.159.200.123               3   8   377    66   -529us[ -720us] +/-   47ms
^+ 162.159.200.1                 3   8   377    64  +3569us[+3569us] +/-   51ms
^- 38.143.223.53                 2   8   337   120    +13ms[  +13ms] +/-  217ms
^- mail.deva-ayurveda.eu         2   8   377   255    +19ms[  +19ms] +/-  131ms

使用-v可以获得更详细的输出。在这种情况下,将显示额外的标题行,以提醒各列的含义。

[root@centos-8 ~]# chronyc sources -v
210 Number of sources = 4
  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
/.- Source state '*' = current synced, '+' = combined , '-' = not combined,
|/ '?' = unreachable, 'x' = time Jan be in error, '~' = time too variable.
||                                                 .- xxxx [ yyyy ] +/- zzzz
||      Reachability register (octal) -.           |  xxxx = adjusted offset,
||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
||                                     |          |  zzzz = estimated error.
||                                 |    |           
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* 162.159.200.123               3   8   377    84   -529us[ -720us] +/-   47ms
^+ 162.159.200.1                 3   8   377    82  +3569us[+3569us] +/-   51ms
^- 38.143.223.53                 2   8   337   139    +13ms[  +13ms] +/-  217ms
^- mail.deva-ayurveda.eu         2   8   377    18  +2666us[+2666us] +/-  121ms

以下跟踪命令显示有关系统时钟性能的参数

[root@centos-8 ~]# chronyc tracking
Reference ID    : A29FC87B (162.159.200.123)
Stratum         : 4
Ref time (UTC)  : Mon Nov 04 15:24:03 2019
System time     : 0.000096395 seconds slow of NTP time
Last offset     : -0.000190930 seconds
RMS offset      : 0.000347281 seconds
Frequency       : 12.779 ppm slow
Residual freq   : -0.017 ppm
Skew            : 0.997 ppm
Root delay      : 0.092059635 seconds
Root dispersion : 0.000978533 seconds
Update interval : 256.1 seconds
Leap status     : Normal

说明:

其中我们看到chronyc的跟踪命令打印的系统时间值为"非零",这是需要应用于系统时钟的剩余校正量。通过使用chrony.conf中的makestep指令,可以更快地执行此操作

提示:

前面的代码可能需要一秒钟才能填充,并且Leap Status可能会显示为Not sync。如果速度特别快,请在几秒钟后再试一次。

chronyc activity命令报告联机和脱机的服务器和对等服务器的数量。如果在某些服务器或者对等服务器中使用了" auto_offline"选项,则活动命令对于检测在断开网络链接后所有服务器或者对等服务器何时都进入脱机状态非常有用。

[root@centos-8 ~]# chronyc activity
200 OK
4 sources online
0 sources offline
0 sources doing burst (return to online)
0 sources doing burst (return to offline)
0 sources with unknown address

将Chrony配置为NTP服务器

要将chrony配置为NTP服务器,我们只需要在/etc/chrony.conf文件中添加allow指令即可打开NTP端口并允许chronyd回复客户端请求。没有指定子网的allow允许从所有IPv4和IPv6地址进行访问。

allow [all] [subnet]allow指令用于指定允许NTP客户端作为NTP服务器访问计算机的特定子网。默认设置是不允许任何客户端访问,即chronyd纯粹作为NTP客户端运行。

例子:

allow 192.0.2.0/24

因此,我们将在上面创建的NTP客户端上添加此指令,并将chrony配置为NTP服务器。

[root@centos-8 ~]# egrep allow /etc/chrony.conf
allow 192.168.0.0/24

重新启动Chronyd服务

[root@centos-8 ~]# systemctl restart chronyd.service

到此,完成将NTP配置为NTP服务器的步骤。我们可以按照chrony.conf手册页中的说明添加更多指令。

接下来配置NTP客户端,以下是chrony.conf的最低配置。

[root@rhel-8 ~]# egrep -v "#" /etc/chrony.conf | sed /^$/d
server 192.168.0.113 iburst
driftfile /var/lib/chrony/drift
makestep 10 3
rtcsync

其中我添加了我的NTP服务器的IP,即192.168.0.113

接下来,我们将从一个终端启动tcpdump并在另一个终端上重新启动chronyd服务。

[root@rhel-8 ~]# systemctl restart chronyd

在并行会话中,我有tcpdump监视端口123

[root@rhel-8 ~]# tcpdump -i enp0s8 port 123
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on enp0s8, link-type EN10MB (Ethernet), capture size 262144 bytes
21:35:47.677015 IP rhel-8.theitroad.com.41990 > 192.168.0.113.ntp: NTPv4, Client, length 48
21:35:47.677494 IP 192.168.0.113.ntp > rhel-8.theitroad.com.41990: NTPv4, Server, length 48
21:35:49.682774 IP rhel-8.theitroad.com.52592 > 192.168.0.113.ntp: NTPv4, Client, length 48
21:35:49.683364 IP 192.168.0.113.ntp > rhel-8.theitroad.com.52592: NTPv4, Server, length 48
21:35:51.722416 IP rhel-8.theitroad.com.58605 > 192.168.0.113.ntp: NTPv4, Client, length 48
21:35:51.723017 IP 192.168.0.113.ntp > rhel-8.theitroad.com.58605: NTPv4, Server, length 48
21:35:53.759156 IP rhel-8.theitroad.com.57763 > 192.168.0.113.ntp: NTPv4, Client, length 48
21:35:53.759635 IP 192.168.0.113.ntp > rhel-8.theitroad.com.57763: NTPv4, Server, length 48

如我们所见,间隔为2秒,我的NTP客户端正在与NTP服务器联系。

检查chronyd正在访问的当前时间源。

[root@rhel-8 ~]# chronyc sources
210 Number of sources = 1
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^* 192.168.0.113                 4   6   377     8  -1850us[-4252us] +/-   48ms

检查系统的时钟性能

[root@rhel-8 ~]# chronyc tracking
Reference ID    : C0A80071 (192.168.0.113)
Stratum         : 5
Ref time (UTC)  : Mon Nov 04 16:12:20 2019
System time     : 0.000221206 seconds slow of NTP time
Last offset     : -0.002402505 seconds
RMS offset      : 0.006636207 seconds
Frequency       : 6.789 ppm fast
Residual freq   : -2.177 ppm
Skew            : 39.512 ppm
Root delay      : 0.092386283 seconds
Root dispersion : 0.003397160 seconds
Update interval : 64.2 seconds
Leap status     : Normal

因此,我们的客户端与上面创建的NTP服务器同步。

与NTP服务器定时强制同步

chronyd默认情况下不会步进时钟,但是chrony包中提供的默认chrony.conf文件允许在时钟的前三个更新中执行步进。之后,通过加快或者减慢时钟速度来缓慢进行所有校正。可以发出chronyc makestep命令来强制chronyd在任何时候步进时钟。

[root@centos-8 ~]# chronyc makestep
200 OK

请注意,尽管此命令可能会产生意外的副作用。有时,程序会检测到突然的抽搐,并会强行杀死自己以避免出现问题。如果我们想知道服务器的繁忙程度,还可以在命令行上使用serverstats

[root@centos-8 ~]# chronyc serverstats
NTP packets received       : 16
NTP packets dropped        : 0
Command packets received   : 1
Command packets dropped    : 0
Client log records dropped : 0

但是要让Chrony与NTP服务器强制同步,则可以使用-q参数。在此模式下运行时,chrony与NTP Server强制同步,chronyd将设置系统时钟一次并退出。它不会从终端分离

[root@centos-8 ~]# systemctl stop chronyd

执行如下所示的命令以与NTP服务器及时强制同步,其中chronyd将从" /etc/chrony.conf"中选择NTP服务器。

[root@centos-8 ~]# chronyd -q
2019-11-01T06:31:07Z chronyd version 3.3 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +SCFILTER +SIGND +ASYNCDNS +SECHASH +IPV6 +DEBUG)
2019-11-01T06:31:07Z Frequency -13.129 +/- 2.279 ppm read from /var/lib/chrony/drift
2019-11-01T06:31:07Z Using right/UTC timezone to obtain leap second data
2019-11-01T06:31:13Z System clock wrong by 174651.064855 seconds (step)
2019-11-03T07:02:04Z chronyd exiting

如果我们希望提供自定义NTP服务器以与NTP服务器进行时间同步,请遵循以下语法:

[root@rhel-8 ~]# chronyd -q "server 192.168.0.113 iburst"
2019-11-04T16:16:14Z chronyd version 3.3 starting (+CMDMON +NTP +REFCLOCK +RTC +PRIVDROP +SCFILTER +SIGND +ASYNCDNS +SECHASH +IPV6 +DEBUG)
2019-11-04T16:16:14Z Initial frequency -19.057 ppm
2019-11-04T16:16:18Z System clock wrong by -0.000991 seconds (step)
2019-11-04T16:16:18Z chronyd exiting

因此,如我们所见,我们能够与NTP服务器进行时间同步强制同步,接下来启动chronyd服务

[root@centos-8 ~]# systemctl start chronyd