【一文掌握】NTP时间同步协议原理详解以及ntpd和ntpdate安装与使用

【一文掌握】NTP时间同步协议原理详解以及ntpd和ntpdate安装与使用网络时间协议 NTP NetworkTimeP 是 TCP IP 协议族里面的一个应用层协议

时间同步

Linux 操作系统的计时方式主要是由 1970/01/01 开始计算总秒数,因此,如果你还记得 date 这个指令的话, 会发现它有个 +%s 的参数,可以取得总秒数,这个就是软件时钟。但,如同前面说的,计算机硬件主要是以 BIOS 内部的时间为主要的时间依据 (硬件时钟),而偏偏这个时间可能因为 BIOS 内部芯片本身的问题,而导致 BIOS 时间与标准时间 (UTC) 有一点点的差异存在!所以为了避免主机时间因为长期运作下所导致的时间偏差,进行时间同步 (synchronize) 的工作就显的很重要了!

  • 软件时钟:由 Linux 操作系统根据 1970/01/01 开始计算的总秒数;
  • 硬件时钟:主机硬件系统上面的时钟,例如 BIOS记录的时间;

那么怎么让时间同步化呢?想一想,如果我们选择几部主要主机 (Primary server) 调校时间,让这些 Primary Servers 的时间同步之后,再开放网络服务来让 Client 端联机,并且提供 Client 端调整自己的时间,不就可以达到全部的计算机时间同步化的运作了吗!那么什么协议可以达到这样的功能呢?那就是 Network Time Protocol ,另外还有 Digital Time Synchronization Protocol (DTSS) 也可以达到相同的功能!

NTP通讯协议

网络时间协议NTP(Network Time Protocol)是TCP/IP协议族里面的一个应用层协议,用来使客户端和服务器之间进行时钟同步,提供高精准度的时间校正。NTP服务器从权威时钟源(例如原子钟、GPS)接收精确的协调世界时UTC,客户端再从服务器请求和接收时间。
NTP基于UDP报文进行传输,使用的UDP端口号为123。
NTP官方网站

NTP时钟层级

NTP允许客户端从服务器请求和接收时间,而服务器又从权威时钟源(例如原子钟、GPS)接收精确的协调世界时UTC。

NTP以层级来组织模型结构,层级中的每层被称为Stratum。通常将从权威时钟获得时钟同步的NTP服务器的层数设置为Stratum 1,并将其作为主时间服务器,为网络中其他的设备提供时钟同步。而Stratum 2则从Stratum 1获取时间,Stratum 3从Stratum 2获取时间,以此类推。时钟层数的取值范围为1~16,取值越小,时钟准确度越高。层数为1~15的时钟处于同步状态;层数为16的时钟被认为是未同步的,不能使用的。

在这里插入图片描述

由于 NTP 时间服务器采用类似阶层架构 (stratum) 来处理时间的同步化, 所以他使用的是类似一般 server/client 的主从架构。网络社会上面有提供一些主要与次要的时间服务器, 这些均属于第一阶及第二阶的时间服务器 (stratum-1, stratum-2) ,如下所示:

  • 主要时间服务器:http://support.ntp.org/bin/view/Servers/StratumOneTimeServers
  • 次要时间服务器:http://support.ntp.org/bin/view/Servers/StratumTwoTimeServers

NTP同步原理

NTP最典型的授时方式是Client/Server方式,如下图所示:

在这里插入图片描述

同步原理:

  1. 客户端首先向服务端发送一个NTP请求报文,其中包含了该报文离开客户端的时间戳t1;
  2. NTP请求报文到达NTP服务器,此时NTP服务器的时刻为t2。当服务端接收到该报文时,NTP服务器处理之后,于t3时刻发出NTP应答报文。该应答报文中携带报文离开NTP客户端时的时间戳t1、到达NTP服务器时的时间戳t2、离开NTP服务器时的时间戳t3;
  3. 客户端在接收到响应报文时,记录报文返回的时间戳t4。
  4. 整个过程结束以后,服务端只知道t1,t2,t3三个时间戳,客户端则知道t1,t2,t3,t4四个时间戳,如下图所示:
    在这里插入图片描述

客户端用上述4个时间戳参数就能够计算出2个关键参数:

  • 延迟 (NTP报文从客户端到服务器的往返延迟delay)
    在这里插入图片描述
  • 偏差 (客户端与服务端之间的时间差offset)
    根据方程组:
    在这里插入图片描述
    可以解得时间偏差为:
    在这里插入图片描述

NTP客户端根据计算得到的offset来调整自己的时钟,实现与NTP服务器的时钟同步。

NTP工作模式

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

  • 单播服务器/客户端模式
  • 对等体模式
  • 广播模式
  • 组播模式
  • 多播模式

关于NTP工作模式的详细介绍请参考:https://support.huawei.com/enterprise/zh/doc/EDOC/e20379e

NTP服务器安装

NTP 服务器也是一个很容易就可以架设成功的玩意儿,不过这个软件在不同的 distribution 上面可能有不一样的名称, 你要作的其实就是将他安装起来之后,规定一部上层 NTP 服务器来同步化你的时间即可啊! 如果你只是想要进行你自己单部主机的时间同步化,别架设 NTP ,直接使用 NTP 客户端软件即可喔!
这里推荐两个NTP网站帮助读者老爷们更加深入理解:
NTP好站1
NTP好站2

安装

下面以CentOS为例,安装ntpd并实现时间同步,ntpd为一个时间同步守护进程,用于校正本地系统与时钟源服务器之前的时间,完整实现了NTP协议。ntpd 默认为客户端运行方式

# 判断是否安装 ntp [root@VM-238-106-centos ~]# rpm -qa | grep ntp ntpdate-4.2.6p5-29.tl2.2.2.x86_64 ntp-4.2.6p5-29.tl2.2.2.x86_64 fontpackages-filesystem-1.44-8.el7.noarch # 如果返回类似上面的结果,表示ntpd已安装。如果未安装则执行如下命令 # 安装 [root@VM-238-106-centos ~]# yum -y install ntp 

配置文件

[root@localhost jarvis]# cat /etc/ntp.conf  # For more information about this file, see the man pages # ntp.conf(5), ntp_acc(5), ntp_auth(5), ntp_clock(5), ntp_misc(5), ntp_mon(5). # 记录文件 driftfile /var/lib/ntp/drift # Permit time synchronization with our time source, but do not # permit the source to query or modify the service on this system. # 是否允许别人向我同步,如果允许注释掉下面即可,此时有能力当服务器了 restrict default nomodify notrap nopeer noquery # Permit all access over the loopback interface. This could # be tightened as well, but to do so would effect some of # the administrative functions. restrict 127.0.0.1 restrict ::1 # Hosts on local network are less restricted. #restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap # Use public servers from the pool.ntp.org project. # Please consider joining the pool (http://www.pool.ntp.org/join.html). # perfer 表示『优先使用』的服务器 # iburst 快速连接 可以提高同步速度  # minpoll 4 maxpoll 4 设置最大最小同步间隔4s # 改新端口号为1234: server 123.52.17.189 1234 server ntp.aliyun.com iburst prefer server 192.168.0.213 minpoll 4 maxpoll 4 server 123.52.17.189 iburst # server time1.bianchenghao.cn # 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 #broadcast 192.168.1.255 autokey # broadcast server #broadcastclient # broadcast client #broadcast 224.0.1.1 autokey # multicast server #multicastclient 224.0.1.1 # multicast client #manycastserver 239.255.254.254 # manycast server #manycastclient 239.255.254.254 autokey # manycast client # Enable public key cryptography. #crypto includefile /etc/ntp/crypto/pw # Key file containing the keys and key identifiers used when operating # with symmetric key cryptography.  keys /etc/ntp/keys # Specify the key identifiers which are trusted. #trustedkey 4 8 42 # Specify the key identifier to use with the ntpdc utility. #requestkey 8 # Specify the key identifier to use with the ntpq utility. #controlkey 8 # Enable writing of statistics records. #statistics clockstats cryptostats loopstats peerstats # Disable the monitoring facility to prevent amplification attacks using ntpdc # monlist command when default restrict does not include the noquery flag. See # CVE-2013-5211 for more details. # Note: Monitoring will not be disabled with the limited restriction flag. disable monitor 

参数详解:

  • iburst:快速同步,iburst 选项会在客户端初始化时,连续地发送8个NTP请求。这样做是为了加速时钟同步的过程,因为通常在初始化时,时钟可能与服务器的时间相差较大。通过连续发送多个请求,客户端可以更快地收敛到与服务器的时间一致,从而减少时钟的偏差;
  • minpoll 4:设置最小同步间隔为4秒;
  • maxpoll4:设置最大同步间隔为4秒;
  • prefer:设置优先使用本服务器;
  • driftfile:因为预设的NTP Server本身的时间计算是依据BIOS的芯片震荡周期频率来计算的,但是这个数值与上层Time Server不见得一致。所以NTP 守护进程(ntpd) 会自动的去计自己主机的频率与上层Time server的频率,并且将两个频率的误差记录下来,记录下来的文件就是在driftfile后面接的完整文件名当中;
  • restrict:管理权限控制 restrict [address] mask [mask] [parameter] 如果你没有在 parameter 的地方加上任何参数的话,这表示该IP或网段不受任何限制,没有限制需求不要配置restrict, 默认是不限制的。
    • ignore: 拒绝所有类型的NTP联机;
    • nomodify: 客户端不能使用ntpc与ntpq这两个程序来修改服务器的时间参数,但客户端仍可透过这个主机来进行网络校时;
    • noquery: 客户端不能使用ntpq,ntpc等指令来查询时间服务器,等于不提供NTP的网络校时;
    • notrap: 不提供trap这个远程事件登录(remote event logging)的功能;
    • notrust: 拒绝没有认证的客户端;
  • fudge 设置时间服务器的层级 fudge 10.225.5.1 stratum 10 fudge必须和server一块用, 而且是在server的下一行;
    • stratum:层级 0~15(0:表示顶级 ,10:通常用于给局域网主机提供时间服务)

restrict 10.220.5.0 mask 255.255.255.0 nomodify 允许10.220.5.0/24网段主机进行时间同步
restrict 127.0.0.1 开放本机的所有权限 本机不受任何限制
restrict 192.168.33.44 nomodify notrap noquery 允许上层时间服务器主动修改本机时间
server 123.52.17.189 1234 改新端口号,直接在ip后面追加新端口号即可
server 192.168.33.44 指定ntp服务器地址
restrict default nomodify notrap nopeer noquery 拒绝所有来源访问

启动关闭

# 以下centos7 (ubuntu系统 systemctl enable ntp) systemctl enable ntpd.service # 开启服务(开机自动启动服务) systemctl disable ntpd.service # 关闭服务(开机不会自动启动服务) systemctl start ntpd.service # 启动服务 systemctl stop ntpd.service # 停止服务 systemctl restart ntpd.service # 重启服务 systemctl reload ntpd.service # 重新载入配置 systemctl status ntpd.service # 查看服务状态 

同步状态

NTP 服务器启动以后要与上层 NTP 服务器联机还需要一些时间, 通常启动 NTP 后约在 15 分钟内才会和上层 NTP 服务器顺利连接上。 那要如何确认我们的 NTP 服务器有顺利的更新自己的时间呢?你可以使用底下几个指令来查阅
执行 ntpstat 可以查看 ntp 服务器有无和上层 ntp 连通,,如果成功,可以看到类似以下的内容:

[root@localhost jarvis]# ntpstat synchronised to unspecified (192.168.0.213) at stratum 2 time correct to within 1486 ms polling server every 64 s 

这个指令可以列出我们的 NTP 服务器有跟上层联机否。由上述的输出结果可以知道,时间有校正约 1486毫秒,且每隔 64 秒会主动去更新时间喔!

这个 ntpq -p 可以列出目前我们的 NTP 与相关的上层 NTP 的状态。
间隔查看命令:watch "ntpq -p"

[root@localhost jarvis]# ntpq -p remote refid st t when poll reach delay offset jitter ============================================================================== *120.25.115.20 10.137.53.7 2 u 35 64 35 41.379 2.955 2.348 192.168.0.213 .x.s.. 1 u 37 64 377 0.645 3.466 1.989 189.17.52.123.b .x.s.. 1 u 11 64 377 18.684 3.287 1.182 
  • remote:亦即是 NTP 主机的 IP 或主机名啰~注意最左边的符号
    • 『 * 』代表目前正在作用当中的上层 NTP
    • 『 + 』代表也有连上线,而且可作为下一个提供时间更新的候选者
    • 『 o 』PPS 节点
    • 『 # 』良好的远程节点或服务器但是未被使用
    • 『 - 』表示为不合格的ntp服务器
    • 『 x 』已不再使用
    • 『 』被丢弃的
  • refid:参考的上一层 NTP 主机的地址
  • st:层次 远程节点或服务器的 stratum 层级
  • t:远程NTP服务器的时钟类型。u 表示未确定,s 表示本地挂钟,l 表示本地原子钟,f 表示外部参考源。
  • when:几秒钟前曾经做过时间同步化更新的动作 (默认单位为秒, “h”表示小时,“d”表示天)
  • poll:下一次更新在几秒钟之后
  • reach:已经向上层 NTP 服务器要求更新的次数
  • delay:延迟从本地到远程节点或服务器通信的往返时间(毫秒)
  • offset:时间补偿结果 主机与远程节点或服务器时间源的时间偏移量,(毫秒)
  • jitter:Linux 系统时间与 BIOS 硬件时间的差异时间(毫秒)

NTP 协议是高精度的,使用的精度小于纳秒(2的 -32 次方)。主机的时间精度和其他参数(受硬件和操作系统限制)使用命令 ntpq -crv 查看。

[root@localhost jarvis]# ntpq -crv associd=0 status=0615 leap_none, sync_ntp, 1 event, clock_sync, version="ntpd 4.2.6p5@1.2349-o Tue Jun 23 15:38:18 UTC 2020 (1)", processor="x86_64", system="Linux/3.10.0-1160.6.1.el7.x86_64", leap=00, stratum=2, precision=-25, rootdelay=0.451, rootdisp=1073.555, refid=192.168.0.44, reftime=ea4dbc1c.74448dbb Fri, Jul 26 2024 14:09:32.454, clock=ea4dbd89.502c3311 Fri, Jul 26 2024 14:15:37.313, peer=51490, tc=6, mintc=3, offset=-69.340, frequency=26.997, sys_jitter=0.000, clk_jitter=55.828, clk_wander=9.209 
  • precision 为四舍五入值,且为 2 的幂数。因此精度为 2precision (秒)
  • rootdelay – 与同步网络中主同步服务器的总往返延时。注意这个值可以是正数或者负数,取决于时钟的精度。
  • rootdisp – 相对于同步网络中主同步服务器的偏差(秒)
  • tc – NTP 算法 PLL (phase locked loop,锁相环路)或 FLL (frequency locked
    loop,锁频回路) 时间常量
  • mintc – NTP 算法 PLL/FLL 最小时间常亮或“最快响应
  • offset – 由结合算法得出的系统时钟偏移量(毫秒)
  • frequency – 系统时钟频率
  • sys_jitter – 由结合算法得出的系统时钟平均偏差(毫秒)
  • clk_jitter – 硬件时钟平均偏差(毫秒)
  • clk_wander – 硬件时钟偏移(PPM – 百分之一)

同步硬件时间

配置方法:/etc/sysconfig/ntpd文件中添加 SYNC_HWCLOCK=yes ,然后重启NTP服务。

同步失败分析

  1. 你的 NTP 服务器时间不可与上层差异太多。本地时钟与远端的NTP服务器时钟相差大于1000s时,ntpd会停止工作。在启动NTP时加了参数“-g”就可以忽略1000S的问题。举例来说,测试 NTP 服务器约在 2024/7/28 下午, 如果我的服务器时间原本是错误的 2023/7/28,足足差了一年,那么上层服务器恐怕就不会将正确的时间传给我! 这时就会造成困扰了!
  2. 服务器防火墙在 UDP port 123 有没有开啊?要特别注意!
  3. 等待的时间够不够长? NTP 等过最久的时间大约是一小时!你有等这么久过否?
  4. 上述的 ntpstat 以及 ntpq -p 的输出结果中,你的 NTP 服务器真的要能够连结上层 NTP 才行喔! 否则你的客户端将无法对你的 NTP 服务器进行同步更新的!重要重要!
  5. 如果remote状态最左边的符号为空(或者是由 * 号转变为空),说明此服务器被丢弃了,可能是时钟抖动太大造成的,可以网络抓取NTP协议包(eth0替换为自己的网卡,a.pcap为保存文件) tcpdump -i eth0 -w a.pcap,用 Wireshark 打开:
    在这里插入图片描述
    这个问题就会导致ntpd刚开始可以同步上显示 * 号,过一会发现主时钟抖动太大就丢弃了不在跟踪,所以此时 * 号就变为空了,这都是本人亲历的现象,特意分享出来方便大家以后遇到类似的问题知道怎么解决。

防火墙

解除防火墙限制,NTP 服务的端口是 123,使用的是 udp 协议,所以 NTP 服务器的防火墙必须对外开放 udp 123 这个端口。

如果防火墙使用 iptables,执行以下命令:

iptables -A INPUT -p UDP -i eth0 -s 192.168.0.0/24 --dport 123 -j ACCEPT 

如果防火墙使用 firewalld,执行以下命令:

firewall-cmd --zone=public --add-port=123/udp --permanent 

ntpdate客户端安装

在 Linux 的环境当中可利用 NTP 的客户端程序,亦即是 ntpdate 这支程序就能够进行时间的同步化。 不过你要知道的是,因为 NTP 服务器本来就会与上层时间服务器进行时间的同步化, 所以在预设的情况下,NTP 服务器不可以使用 ntpdate !也就是说 ntpdate 与 ntpd 不能同时启用的。 所以你不要在 NTP server 上头执行这个指令呦!我们就来看看如何处理吧!

手动执行时间同步

ntpdate 命令是 NTP 的客户端软件,它可以用于请求时间同步。

语法:

ntpdate <ntp_server> 

ntp_server 可以从文章末尾的 NTP服务器 中选择

示例:

[root@localhost jarvis]# ntpdate cn.pool.ntp.org 11 Feb 10:47:12 ntpdate[30423]: step time server 84.16.73.33 offset -49. sec 

自动定时同步时间

如果需要自动定时同步时间,可以利用 Crontab 工具。本质就是用 crontab 定时执行一次手动时间同步命令 ntp。

示例:执行如下命令,就可以在每天凌晨 3 点同步系统时间:

echo "0 3 * * * /usr/sbin/ntpdate cn.pool.ntp.org" >> /etc/crontab # 修改 crond 服务配置 systemctl restart crond # 重启 crond 服务以生效 

NTP服务器

以下 NTP 服务器搜集自网络:

可参考:公共 NTP 网络时间服务器

cn.ntp.org.cn # 中国
edu.ntp.org.cn # 中国教育网
ntp.aliyun.com # 阿里云
ntp.tencent.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时间同步协议原理详解以及ntpd和ntpdate安装与使用分享到此就结束了,感谢您的阅读。
编程小号
上一篇 2024-10-20 18:30
下一篇 2024-10-20 18:17

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/bian-cheng-ji-chu/3959.html