在NTS授时状态监控系统的同步日志页面中,记录着所有客户端向NTS服务器校时的日志信息,我们可以看到有些同步日志中的客户端时间是随机的。如下图所示:
经过统计后得知,随机时间的客户端均是centos7(redhat7)及以上版本的Linux系统,centos6.5及以下版本中客户端同步时间均是正常的。我们都知道Linux7之前的版本同步时间用的是ntpd服务
,Linux7以及7之后的版本都改用chrony
了,两者区别参考:https://chrony.tuxfamily.org/comparison.html。
在centos7.9的测试环境中对123端口进行抓包后发现,客户端发送给服务器的NTP包中,transmit
timestamp(T3)的时间戳是随机的,同时,服务器收到客户端请求后,原封不动的将时间赋值给origin
timestamp(T1),如下图所示:(时间戳参考文末附1)
但是这种情况在使用ntpdate
同步本地时间时并不存在,时间都是正确的:
经过抓包后,可以初步确定问题出现在chrony上了。经过查询资料发现,自chrony2.3
开始不显示客户端数据包中的本地时间和同步状态,这个版本是2016年2月16日发布的。参考:https://chrony.tuxfamily.org/news.html
而centos7.9的测试环境中,chrony的版本是3.4。
但是,chrony2.3版本更新记录中,只是说明不再显示客户端数据包中的本地时间和同步状态,但是没说明本地时间为什么是随机的。
经过查询资料发现,chrony与NTP对比官方文档的安全性对比表格中,有关于随机时间戳的说明,如下图所示
同时RFC5905(NTPv4)中也给出了随机时间戳的说明:虽然该备忘录要求客户端数据包中的大部分字段设置为零,但发送时间戳应该是随机的。这个决定是出于安全和隐私的动机。在没有密码认证的情况下,验证原始时间戳是客户端对NTP响应进行盲欺骗的主要防御手段。因此,客户端的传输时间戳不可预测是很重要的。
chrony官方为了安全考虑,从chrony2.3起不在客户端数据包中显示本地时间和同步状态,即客户端发起NTP校时的数据包中的本地时间直接被赋值为随机时间,这样NTP服务器收到客户端的校时请求后,经过解析后保存同步日志,我们看到的客户端时间就是一个随机时间。
根据上面的分析可得出:
使用chrony2.3及以上版本作为同步服务的系统,客户端时间(T1)均是随机时间戳。
一些遵循NTPv4(RFC5905)协议开发的时间同步工具,客户端时间(T1)均是随机时间戳。
Linux7及以下版本系统使用的同步服务是ntpd,客户端时间(T1)是客户端本地时间。
NTS授时状态监控系统同步日志中的客户端时间只是将T1时间戳展示出来,作为对客户端进行同步超时告警和客户端时间偏差告警时的参考依据。所以,当客户端时间随机化后,NTS授时状态监控系统将无法对此类客户端进行同步超时告警和时间偏差告警。
目前可以先将chrony的版本降低至chrony2.2.1,这样可保证正常监控客户端时间偏差。后续我们会继续对NTS授时状态监控系统进行升级,届时可不降低chrony版本的同时监控高版本的Linux客户端。
一个完整的NTP协议校时请求数据包中有4个时间戳(T1、T2、T3、T4),分别表示:
起源时间戳 T1(origin timestamp):请求离开服务器时在客户端的时间,即:请求数据包离开客户端时,客户端本地时间
接收时间戳 T2(receive timestamp):请求从客户端到达时在服务器的时间,即:请求数据包到达服务器时,服务器本地时间
发送时间戳 T3(transmit timestamp):响应离开客户端时在服务器的时间,即:响应数据包离开服务器时,服务器本地时间
目的地时间戳 T4(destination timestamp):响应到达客户端时在客户端的时间,即:响应数据包到达客户端时,客户端本地时间
通过这4个时间戳可以得出:
网络延迟: delay=(T4-T1)-(T3-T2)
客户端时间偏差: offset=((T2-T1)+(T3-T4))/2
上一篇:AIX主机配置时间同步的方法
下一篇:大华摄像头时间同步配置方法