互联网协议 — NTP 时间同步协议

02/02 09:29
阅读数 90

目录

数字化时间

时间定义的类型

  • UTC(Universal Time Coordinated,国际标准时间):地球分为二十四时区,每个时区都有自己的本地时间。
  • GMT(Greenwich Mean Time,格林威治标准时间):指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。(UTC 与 GMT 时间基本相同)
  • CST(China Standard Time,中国标准时间):CST = GMT + 8 = UTC + 8
  • DST(Daylight Saving Time,夏令时):指在夏天太阳升起的比较早时,将时间拨快一小时,以提早日光的使用。(中国不使用)

服务器时间的类型

  • 硬件时间:又称 RTC(Real-Time Clock)或 CMOS 时间,在主板上靠电池供电,仅保存日期时间数值,无法保存时区和夏令时设置。
  • 系统时间:操作系统启动时复制 RTC 时间,之后就独立运行,保存了时间、时区和夏令时设置。

常见的时间操作

  • 查看当前系统的时区和时间。
$ timedatectl status
      Local time: 六 2021-01-30 23:58:51 CST
  Universal time: 六 2021-01-30 15:58:51 UTC
        RTC time: 六 2021-01-30 15:58:51
       Time zone: Asia/Shanghai (CST, +0800)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a
  • 设置当前系统时区。
# 查看时区清单
timedatectl list-timezones |  grep  -E "Asia/S.*"

# 选择上海时区
timedatectl set-timezone Asia/Shanghai

# 强制同步系统时钟
chronyc -a makestep
  • 设置当前系统时间。
timedatectl set-time "2019-10-31 15:50:00"
  • 系统时钟同步至硬件。
timedatectl set-local-rtc
# or
hwclock --systohc --localtime
  • 硬件时钟同步至系统。
hwclock --hctosys
  • 启用或者禁止 NTP 时间同步。
timedatectl set-ntp yes/no

NTP

NTP(Network Time Protocol,网络时间同步协议)是一种用来进行计算机时间同步的协议,由特拉华大学的 David L. Mills 设计,位于 OSI 模型的应用层。自 1985 年以来,NTP 是目前仍在使用的最古老的互联网协议之一。

NTP 时钟源可以是 NTP Server 或 GPS。NTP 提供了一种高精准度的时间校正服务:LAN 环境中,时钟偏差小于 1ms;WAN 环境中,时钟偏差在 1-50ms 之间。NTP 还支持加密认证(Authentication)机制,以防止中间人攻击。

NTP 的目的是在无序的 Internet 环境中提供精确且健壮的时间同步(校正)服务,在分布式时间敏感的系统至关重要。

NTP 的实现原理

在 Internet 中,NTP Server 用于提供准确的时间,首先就要有准确的时钟源,并且这一时钟源应该是 UTC 的(注:世界上最准确的时间是使用原子时钟(Atomic clock)所计算的,UTC 就是其中一例)。NTP Server 获得 UTC 的时钟可以是:原子钟、天文台、卫星等,称之为独立的时间源。

为适应 Internet 的层次结构,NTP 也采用了 Stratum(层级)时间分布模型。有了准确且可靠的时钟源之后,时间就会按照 NTP Server 的 Stratum 进行传播。

Stratum 的层级高低由距离时钟源的远近决定,独立的时间源为 Stratum-0,直接连接到 Stratum-0 的设备为 Stratum-1,Stratum-1 则从 Stratum-0 获取时钟;直接连接到 Stratum-1 的设备为 Stratum-2,Stratum-2 则从 Stratum-1 获取时钟,以此类推。

NTP 规定 Stratum 的总层数限制在 15 以内,而 Stratum-1 则作为整个 NTP 系统的基础。当下层 Stratum-X 从多个上层 Stratum-Y 中获取时钟源时,则需要利用统计学的算法来选择出最佳的路径并以此校正本地时间。

在这里插入图片描述

国内 NTP 服务器:

cn.pool.ntp.org  # 最常用的国内 NTP 服务器,参考:https://www.ntppool.org/zh/use.html
cn.ntp.org.cn    # 中国
edu.ntp.org.cn   # 中国教育网
ntp1.aliyun.com  # 阿里云
ntp2.aliyun.com  # 阿里云
ntp.sjtu.edu.cn  # 上海交通大学
s1a.time.edu.cn  # 北京邮电大学
s1b.time.edu.cn  # 清华大学
s1c.time.edu.cn  # 北京大学
s1d.time.edu.cn  # 东南大学
s1e.time.edu.cn  # 清华大学
s2a.time.edu.cn  # 清华大学
s2b.time.edu.cn  # 清华大学
s2c.time.edu.cn  # 北京邮电大学
s2d.time.edu.cn  # 西南地区网络中心
s2e.time.edu.cn  # 西北地区网络中心
s2f.time.edu.cn  # 东北地区网络中心
s2g.time.edu.cn  # 华东南地区网络中心
s2h.time.edu.cn  # 四川大学网络管理中心
s2j.time.edu.cn  # 大连理工大学网络中心
s2k.time.edu.cn  # CERNET桂林主节点

NTP 的处理流程

在这里插入图片描述

  1. 针对每个 Peer X(上层 NTP Server)的数据过滤处理。
  2. 针对多个 Peers 的对等选择与组合处理。NTP 就是通过利用多个 NTP Server 及多条网络路径来确保高准确度与可靠性的。
  3. 本地时钟校正。为维持时钟的单调性,NTP 并不会直接使用前两步处理得到的时钟偏差值来调整本地时钟,而是通过一个环路滤波器转换为一个对可变频率振荡器的控制量,以此来控制振荡器的振荡频率,时间间接的调整系统时钟。

Chrony

Chrony 是由 RedHat 开发的,NTP 协议的另一种实现,作为 ntpd 的替代品。在 RHEL/CentOS 7.x 中作为默认安装的时间同步工具。Chrony 可以同时做为 NTP Server 或 NTP Client。

  • 官网:https://chrony.tuxfamily.org/

Chrony 专为间歇性互联网连接的系统而设计,也能良好应用于持久互联网连接的环境。Chrony 可以在各种复杂的环境中良好运行,包括:间歇性网络连接环境、高拥挤网络连接环境、温度变化环境(计算机时钟对温度敏感),以及不能连续运行的、或在虚拟机上运行的操作系统。

Chrony 具有两个核心组件:

  • chronyd 守护进程:用于与 NTP Server 进行时间同步。
  • chronyc CLI tool:用于监控 chronyd 的性能并进行多样化的配置,支持远程连接。

Chrony 与 ntpd 的对比:

在这里插入图片描述

Chrony 相较于 ntpd 的优势

  1. 更快的同步,只需要数分钟而非数小时时间,从而最大程度减少了时间误差率,对于并非全天 24 小时运行的虚拟机而言非常有用。
  2. 能够更好地响应时钟频率的快速变化,对于具备不稳定时钟的虚拟机或者时钟频率发生变化的节能技术而言非常有用。
  3. 在初始同步后,它不会停止时钟,以防对需要系统时间保持单调的应用程序造成影响。
  4. 在应对临时非对称延迟时(例如,在大规模下载造成链接饱和时)提供更好的稳定性。
  5. 无需对服务器进行定期轮询,因此具备间歇性网络连接的系统仍然可以快速同步时钟。

安装与配置

安装:

yum -y install chrony
systemctl status chronyd
systemctl enable chrony 

配置:/etc/chrony.conf

  • server hostname [option]:指定 NTP Server。具有以下 options。

    • iburst 参数:表示加急,指定在头四次 NTP 请求中,采用 2s 或更短的时间间隔发出 NTP 请求,而不是以 minpoll x 指定的最小间隔。可以让 chronyd 在启动时快速进行一次时间同步。
    • minpoll x 参数:发出 NTP 请求的最小时间间隔,默认值是 6,代表 64s。
    • maxpoll x 参数:发出 NTP 请求的最大时间间隔,默认值是 9,代表 512s。
  • bindcmdaddress:指定 chronyd 监听的网络接口。

  • allow/deny:NTP Client 的 ACL 限制,支持精确 IP 和 CIDR。

  • cmdallow/cmddeny:NTP CLI 的 ACL 限制,支持精确 IP 和 CIDR。

  • makestep threshold limit:通常 chronyd 会将根据需求通过 “加速/减慢” 的方式逐步纠正系统的时间偏移。但在某些特定情况下,该调整过程会消耗很长的时间,所以 makestep 指令用于强制 chronyd 在调整期大于某个域值时,直接进行 “跳跃式” 校时。例如:makestep 1.0 3 表示头三次校时,如果时间相差 1.0s, 则进行跳跃式校时,而不是 “加速/减慢” 式校时。

  • local stratum 10:表示即使 server 指令中 NTP Server 不可用了,也允许使用本地时间作为标准时间源同步到其它的客户端。

  • rtcsync:指定启用内核模式,系统时间每 11 分钟间隔就会拷贝到硬件时间。

  • logdir:指定日志文件路径。

  • driftfile file:指定根据实际时间计算出 “增/减” 时间差的比率,并将补偿参数记录到一个文件中,会在机器重启后为系统时钟作出补偿。默认为 /var/lib/chrony/drift。

NOTE:chrony 与 ntpd 最大的区别就是:时间的修正是连续进行的,而 ntpd 需要搭配 Crontab 来自动定时同步时间,本质就是用 crontab 定时执行一次手动时间同步命令 ntp,因此会出现间断。

配置示例:

# 指定上层 NTP 服务器为阿里云提供的公网 NTP 服务器。
server ntp1.aliyun.com iburst minpoll 4 maxpoll 10
server ntp2.aliyun.com iburst minpoll 4 maxpoll 10
server ntp3.aliyun.com iburst minpoll 4 maxpoll 10
server ntp4.aliyun.com iburst minpoll 4 maxpoll 10

# 当阿里云提供的公网 NTP 服务器不可用时,采用本地时间作为同步标准。
local stratum 8

# 让 chronyd 在选择源时忽略源的层级。
stratumweight 0

# 记录系统时钟获得/丢失时间的速率至 drift 文件中。
driftfile /var/lib/chrony/drift

# 启用 RTC(实时时钟)的内核同步。
rtcsync

# 如果系统时钟的偏移量大于 10 秒,则允许在前三次更新中步进式的调整系统时钟。
makestep 10 3

# 只允许 192.168.1 网段的客户端进行时间同步。
allow 192.168.1.0/24

# 指定包含 NTP 验证密钥的文件。
keyfile /etc/chrony.keys

# 如果时钟调整大于 0.5 秒,则向系统日志发送消息。
logchange 0.5

# 指定存放日志文件的目录。
logdir /var/log/chrony

# 禁用客户端访问的日志记录
noclientlog

# Select which information is logged.
log measurements statistics tracking

chronyc CLI

在这里插入图片描述

  • 查看时间同步情况。
$ chronyc tracking
Reference ID    : A29FC801 (time.cloudflare.com)              # 当前进行时间同步的参考。
Stratum         : 4                                           # 连接参考时钟的跳数。
Ref time (UTC)  : Sat Jan 30 13:36:04 2021                    # 参考时间。
System time     : 0.003950741 seconds fast of NTP time        # 系统时间。
Last offset     : +0.001695401 seconds                        # 最后一次时间校对偏移量。
RMS offset      : 0.001266512 seconds                         # RMS 偏移,偏移值的长期平均值。
Frequency       : 5.060 ppm slow                              # 系统的时钟错误的频率,单位为 ppm(百万分率)。
Residual freq   : +0.000 ppm                                  # 残余频率,表示参考源的测量值与当前使用的频率之间的差异。
Skew            : 0.010 ppm                                   # 偏斜,估计频率的误差界限。
Root delay      : 0.228649795 seconds                         # 根延迟,网络路径延迟到计算机正在同步的层计算机的总和。
Root dispersion : 0.010007298 seconds                         
Update interval : 15499.7 seconds                             # 说明最后两次更新的时间间隔。
Leap status     : Normal                                      # 跳跃状态,枚举:正常、插入秒、删除秒、或不同步。
  • 显示所有 Source NTP Server 的信息。
$ chronyc sources -v
210 Number of sources = 4

  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
 / .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| /   '?' = unreachable, 'x' = time may 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
===============================================================================
^+ ntp16.doctor.com              2  10   127   49m    +24ms[  +24ms] +/-  169ms
^* time.cloudflare.com           3  10   271  121m    +26ms[  +28ms] +/-  145ms
^+ lax1.nonce.monster            2  10   377  200m  -6349us[-4660us] +/-  161ms
^+ ntp1.ams1.nl.leaseweb.net     2  10   277   402   -788us[ -788us] +/-  153ms
  • 显示所有 Source NTP Server 的状态。
$ chronyc sourcestats -v
210 Number of sources = 4
                             .- Number of sample points in measurement set.
                            /    .- Number of residual runs with same sign.
                           |    /    .- Length of measurement set (time).
                           |   |    /      .- Est. clock freq error (ppm).
                           |   |   |      /           .- Est. error in freq.
                           |   |   |     |           /         .- Est. offset.
                           |   |   |     |          |          |   On the -.
                           |   |   |     |          |          |   samples. \
                           |   |   |     |          |          |             |
Name/IP Address            NP  NR  Span  Frequency  Freq Skew  Offset  Std Dev
==============================================================================
ntp16.doctor.com            6   3   15h     +0.320      0.949    +14ms  1099us
time.cloudflare.com        64  30   69h     -0.003      0.009  -6159us  1469us
lax1.nonce.monster          7   3  137m     +0.126      0.186  -4871us   165us
ntp1.ams1.nl.leaseweb.net  37  19   11h     +0.048      0.059  -1273us  1203us
  • 查看 Source NTP Server 的在线和离线状态。
$ 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 服务的日志。
$ journalctl -u chronyd
  • 检查 NTP 访问是否对 Source NTP Server 可用。
$ chronyc accheck <server>
  • 手动添加一台新的 Source NTP Server。
$ chronyc add server <server>
  • 手动移除 NTP Server 或对等服务器。
$ chronyc delete <server>
  • 手动设置 chronyd 的时间。
$ chronyc settime

使用 Chrony 作为 NTP Server

要将 Chrony 作为一个 NTP Server,方法很简单。

  1. 首先,需要修改 /etc/chrony.conf 文件,并添加以下配置即可。
allow 192.168.1.0/24   # ACL 限制。
bindcmdaddress 0.0.0.0 # chronyd 监听接口。
local stratum 10       # 即使服务器没有上层时间源,也可使用本地时间作为时钟源。
  1. 重启 Chronyd 服务。
systemctl restart chronyd

占用端口:

  • 123/udp:标准的 NTP Server 监听端口。
  • 323/udp:默认的管理端口。
展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部