vlambda博客
学习文章列表

U007-【Ubuntu】NTP服务器的安装部署

学习目标

  • 了解NTP服务的工作原理

  • 掌握NTP服务的相关参数

  • 掌握NTP客户端的工具的用法

  • 掌握NTP服务的安装部署方法

一、服务名称及功能

1、NTP概述

  • NTP(Network Time Protocol,网络时间协议)是由RFC 1305定义的时间同步协议,用来在分布式时间服务器和客户端之间进行时间同步。

  • NTP基于UDP报文进行传输,使用的UDP端口号为123。

  • 使用NTP的目的是对网络内所有具有时钟的设备进行时钟同步,使网络内所有设备的时钟保持一致,从而使设备能够提供基于统一时间的多种应用。

  • 对于运行NTP的本地系统,既可以接受来自其他时钟源的同步,又可以作为时钟源同步其他的时钟,并且可以和其他设备互相同步。

  • Linux下的NTP服务器配置相对来说都比较容易,但在Linux下有一个弊端,不同时区或者说是时间相差太大时无法同步,所以在配置NTP服务器之前需要把时间配置成相同的。

2、NTP适用场景

  • 对于网络中的各种设备来说,如果依靠管理员手工输入命令来修改系统时钟是不可能的,不但工作量巨大,而且也不能保证时钟的精确性。通过NTP协议,可以很快将网络中设备的时钟同步,同时也能保证很高的精度。

  • NTP主要应用于需要网络中所有设备时钟保持一致的场合,比如:

    • 在网络管理中,对于从不同设备采集来的日志信息、调试信息进行分析的时候,需要以时间作为参照依据。

    • 计费系统要求所有设备的时钟保持一致。

    • 完成某些功能,如定时重启网络中的所有设备,此时要求所有设备的时钟保持一致。

    • 多个系统协同处理同一个比较复杂的事件时,为保证正确的执行顺序,多个系统必须参考同一时钟。

    • 在备份服务器和客户端之间进行增量备份时,要求备份服务器和所有客户端之间的时钟同步。

二、服务工作原理

1、时钟同步的工作过程

  • Device A和Device B通过网络相连,它们都有自己独立的系统时钟,需要通过NTP实现各自系统时钟的自动同步。为便于理解,作如下假设:

    • 在Device A和Device B的系统时钟同步之前,Device A的时钟设定为10:00:00am,Device B的时钟设定为11:00:00am。

    • Device B作为NTP时间服务器,即Device A将使自己的时钟与Device B的时钟同步。

    • NTP报文在Device A和Device B之间单向传输所需要的时间为1秒。

  • 时钟同步的工作过程

    • Device A发送一个NTP报文给Device B,该报文带有它离开Device A时的时间戳,该时间戳为10:00:00am(T1)。

    • 当此NTP报文到达Device B时,Device B加上自己的时间戳,该时间戳为11:00:01am(T2)。

    • 当此NTP报文离开Device B时,Device B再加上自己的时间戳,该时间戳为11:00:02am(T3)。

    • 当Device A接收到该响应报文时,Device A的本地时间为10:00:03am(T4)。

  • 至此,Device A已经拥有足够的信息来计算两个重要的参数:

    • NTP报文的往返时延Delay=(T4-T1)-(T3-T2)=2秒,即去1秒,回1秒。

    • Device A相对Device B的时间差offset=((T2-T1)+(T3-T4))/2=1小时。

2、时钟同步的工作模式

  • 可以采用多种NTP工作模式进行时间同步:

    • 客户端/服务器模式

    • 对等体模式

    • 广播模式

    • 组播模式

  • 用户可以根据需要选择合适的工作模式。

3、标准时钟同步服务

(1)NTP 公共时间服务器池

  • http://www.pool.ntp.org/zone/cn,这个网站包含全球的标准时间同步服务,也包括对中国时间的同步。在其中也描述了ntp配置文件中的建议写法:

    • server 0.cn.pool.ntp.org

    • server 1.cn.pool.ntp.org

    • server 2.cn.pool.ntp.org

    • server 3.cn.pool.ntp.org

(2)阿里云NTP服务器

  • server ntp.aliyun.com

(3)局域网自建NTP服务器

  • 自建NTP服务器时,需要以下三个参数

    • server 10.0.0.12 iburst

    • local stratum 10

    • allow 10.0.0.0/24

4、系统时间与硬件时间

(1)硬件时间

  • RTC(Real-Time Clock)或CMOS时间,一般在主板上靠电池供电,服务器断电后也会继续运行。

  • 仅保存日期时间数值,无法保存时区和夏令时设置。

(2)系统时间

  • 一般在服务器启动时复制RTC时间,之后独立运行,可以保存时间、时区和夏令时设置。

(3)同步系统时间到硬件时间

  • 系统时间同步到硬件,防止系统重启后时间被还原

    • hwclock --systohc  或者  hwclock -w

5、时间时区概念

(1)UTC

  • 整个地球分为二十四时区,每个时区都有自己的本地时间,在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时间(UTC,Universal Time Coordinated)。

(2)GMT

  • 格林威治标准时间 (GMT,Greenwich Mean Time)指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线(UTC与GMT时间基本相同)。

(3)CST

  • 中国标准时间(CST,China Standard Time)

  • GMT + 8 = UTC + 8 = CST

(4)DST

  • 夏令时(DST,Daylight Saving Time) 指在夏天太阳升起的比较早时,将时间拨快一小时,以提早日光的使用(中国不使用)。

6、Chrony时间同步

  • Chrony其实是NTP网络时间协议的一种实现。

  • 它可以更快地且准确的同步系统时钟。

  • Chrony可以同时做为NTP服务的客户端和服务端。

7、Chrony核心组件

(1)chronyd

  • 守护进程,主要用于调整内核中运行的系统时间和时间服务器同步。

  • 它确定计算机增减时间的比率,并对此进行调整补偿。

(2)chronyc

  • 提供一个用户界面,用于监控性能并进行多样化的配置。

  • 它可以在chronyd实例控制的计算机上工作,也可以在一台不同的远程计算机上工作。

8、Chrony时间同步优势

  • 更快的同步只需要数分钟而非数小时时间,从而最大程度的减少时间和频率误差,这对于并非全天运行的台式计算机或系统而言非常有用。

  • 能够更好的响应时间频率的快速变化,这对于具备不稳定时钟的虚拟机或导致时钟频率反生变化的节能技术而言非常有用。

  • 在初始同步后,它并不会停止时钟,以防对需要系统时间保持单调的程序造成影响。

  • 在应对临时非对称延迟时,(例如,大规模下载造成链接饱和时)提供了更好的稳定性。

  • 无需对服务器进行定期轮询,因此具备间歇性网络连接的系统仍然可以快速同步时钟。

三、服务参数

1、服务软件包

  • 服务端

    • chrony

  • 客户端

    • chrony

2、服务进程

  • 服务端

    • /usr/sbin/chronyd

  • 客户端

    • /usr/bin/chronyc

3、服务管理脚本

  • /lib/systemd/system/chrony.service

4、服务端口

  • 服务端

    • UDP port=123

  • 客户端

    • UDP port=123

5、配置文件

  • 服务端

    • /etc/chrony/chrony.conf

  • 客户端

    • /etc/chrony/chrony.conf

四、客户端工具

1、windows客户端

2、Linux客户端

 ##通过修改配置文件,启动守护进程,使客户端持续与服务器同步时间
 
 ##通过chronyc查看同步时间的源
 Usage: chronyc [-h HOST] [-p PORT] [-n] [-c] [-d] [-4|-6] [-m] [COMMAND]
 ## COMMAND常用命令
 ## sources:该命令用来查看当前chronyd正在访问的时间源信息。

五、安装部署

1、环境参数

(1)主机名

 root@ntpserver:~# hostname
 ntpserver

(2)主机IP地址

 root@ntpserver:~# hostname -I
 10.0.0.12

(3)防火墙状态

 root@ntpserver:~# ufw status
 Status: inactive

(4)时区时间

 root@ntpserver:~# timedatectl status
                      Local time: Thu 2021-12-16 14:47:37 CST
                  Universal time: Thu 2021-12-16 06:47:37 UTC
                        RTC time: Thu 2021-12-16 06:47:36
                        Time zone: Asia/Shanghai (CST, +0800)
        System clock synchronized: yes
 systemd-timesyncd.service active: yes
                  RTC in local TZ: no

(5)更新软件源

 root@ntpserver:~# apt update
 Hit:1 http://mirrors.aliyun.com/ubuntu bionic InRelease
 Hit:2 http://mirrors.aliyun.com/ubuntu bionic-updates InRelease
 Hit:3 http://mirrors.aliyun.com/ubuntu bionic-backports InRelease
 Hit:4 http://mirrors.aliyun.com/ubuntu bionic-security InRelease              
 Reading package lists... Done                                                  
 Building dependency tree      
 Reading state information... Done
 14 packages can be upgraded. Run 'apt list --upgradable' to see them.

2、安装过程

(1)搜索软件包

 root@ntpserver:~# apt search ^chrony

(2)安装软件包

 root@ntpserver:~# apt install chrony -y

3、验证过程

(1)验证安装

root@ntpserver:~# dpkg -l chrony
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name Version Architecture Description
+++-========================-=================-=================-======================================================
ii chrony 3.2-4ubuntu4.5 amd64 Versatile implementation of the Network Time Protocol

(2)验证文件列表

root@ntpserver:~# dpkg -L chrony
/.
/etc
/etc/NetworkManager
/etc/NetworkManager/dispatcher.d
/etc/NetworkManager/dispatcher.d/20-chrony
/etc/apparmor.d
/etc/apparmor.d/force-complain
/etc/apparmor.d/usr.sbin.chronyd
/etc/chrony
/etc/default
/etc/default/chrony
/etc/dhcp
/etc/dhcp/dhclient-exit-hooks.d
/etc/dhcp/dhclient-exit-hooks.d/chrony
/etc/init.d
/etc/init.d/chrony
/etc/logrotate.d
/etc/logrotate.d/chrony
/etc/network
/etc/network/if-post-down.d
/etc/network/if-post-down.d/chrony
/etc/network/if-up.d
/etc/network/if-up.d/chrony
/etc/ppp
/etc/ppp/ip-down.d
/etc/ppp/ip-down.d/chrony
/etc/ppp/ip-up.d
/etc/ppp/ip-up.d/chrony
/lib
/lib/systemd
/lib/systemd/system
/lib/systemd/system/[email protected]
/lib/systemd/system/[email protected]
/lib/systemd/system/chrony.service
/usr
/usr/bin
/usr/bin/chronyc
/usr/lib
/usr/lib/chrony
/usr/lib/chrony/chrony-helper
/usr/lib/networkd-dispatcher
/usr/lib/networkd-dispatcher/off.d
/usr/lib/networkd-dispatcher/routable.d
/usr/lib/systemd
/usr/lib/systemd/scripts
/usr/lib/systemd/scripts/chronyd-starter.sh
/usr/sbin
/usr/sbin/chronyd
/usr/share
/usr/share/chrony
/usr/share/chrony/chrony.conf
/usr/share/chrony/chrony.keys
/usr/share/doc
/usr/share/doc/chrony
/usr/share/doc/chrony/FAQ.gz
/usr/share/doc/chrony/NEWS.Debian.gz
/usr/share/doc/chrony/README.Debian
/usr/share/doc/chrony/README.container
/usr/share/doc/chrony/README.gz
/usr/share/doc/chrony/changelog.Debian.gz
/usr/share/doc/chrony/copyright
/usr/share/lintian
/usr/share/lintian/overrides
/usr/share/lintian/overrides/chrony
/usr/share/man
/usr/share/man/man1
/usr/share/man/man1/chronyc.1.gz
/usr/share/man/man5
/usr/share/man/man5/chrony.conf.5.gz
/usr/share/man/man8
/usr/share/man/man8/chronyd.8.gz
/var
/var/lib
/var/lib/chrony
/var/log
/var/log/chrony
/usr/lib/networkd-dispatcher/off.d/chrony
/usr/lib/networkd-dispatcher/routable.d/chrony

4、服务管理

(1)服务状态

root@ntpserver:~# systemctl status chrony.service

(2)服务启动

root@ntpserver:~# systemctl start chrony.service

(3)服务停止

root@ntpserver:~# systemctl stop chrony.service

(4)服务重启

root@ntpserver:~# systemctl restart chrony.service

(5)启用服务开机自启动

root@ntpserver:~# systemctl enable chrony.service

(6)禁用服务开机自启动

root@ntpserver:~# systemctl disable chrony.service

5、配置文件解析

(1)/etc/chrony/chrony.conf

# 上游NTP服务器地址
pool ntp.ubuntu.com iburst maxsources 4
pool 0.ubuntu.pool.ntp.org iburst maxsources 1
pool 1.ubuntu.pool.ntp.org iburst maxsources 1
pool 2.ubuntu.pool.ntp.org iburst maxsources 2
# pool: 指定NTP服务器池
# iburst: 当服务器可达时,发送一个8位数据包而不是通常的一个数据包,包间隔通常为2秒,可加快初始同步速度
# maxsources: 池中最多可使用的时钟源
# server: server指令指定了一个可以用作时间源的NTP服务器。
# prefer: 优先

# 该指令指定包含用于NTP身份验证的ID/密钥对的文件的位置
keyfile /etc/chrony/chrony.keys

# 记录时间误差到一个文件中,会在重新启动后为系统时钟作出补偿
driftfile /var/lib/chrony/chrony.drift

# 日志记录跟踪测量数据
#log tracking measurements statistics

# 日志文件的位置
logdir /var/log/chrony

# 最大更新误差
maxupdateskew 100.0

# 启用内核模式,系统时间每11分钟会拷贝到硬件时钟(RTC)。注意,它不能与'rtcfile'指令一起使用。
rtcsync

# 通常chronyd将根据需求通过减慢或加速时钟,使得系统逐步纠正所有时间偏差。在某些特定情况下,系统时钟可能会漂移过快,导致该调整过程消耗很长的时间来纠正系统时钟。该指令强制chronyd在调整期大于某个阀值时调整系统时钟
makestep 1 3

# 默认配置文件中没有,用来实现即使server指令中时间服务器不可用,也允许将本地时间作为标准时间发送给其它客户端
local stratum 10

# 默认配置文件中没有,用来指定一台主机、子网,或者网络以允许或拒绝(deny)访问本服务器
allow 10.0.0.0/24