现象
使用centos8的chrony给本机同步时间时,发现客户端发送给服务器的NTP包中,transmit timestamp(T3)的时间戳是随机的,同时,服务器端收到客户端请求的包后,原封不动的将时间赋值给origin timestamp(T1),使用龙蜥测试环境如下图所示:
但是这种情况在使用ntpdate
同步本地时间时并不存在,时间都是正确的:
我记得之前并不存在这个问题,随后用centos6.5的ntpd同步测试发现时间戳不是随机的,而是一个正确的客户端本地时间。
分析
Linux7之前的版本同步时间用的是ntpd
,Linux7以及7之后的版本都改用chrony
了,两者区别参考:https://chrony.tuxfamily.org/comparison.html。
经过查资料发现,这个随机时间戳是因为安全考虑,虽然该备忘录要求客户端数据包中的大部分字段设置为零,但发送时间戳应该是随机的。这个决定是出于安全和隐私的动机。在没有密码认证的情况下,验证原始时间戳是客户端对NTP响应进行盲欺骗的主要防御手段。因此,客户端的传输时间戳不可预测是很重要的。参考:https://datatracker.ietf.org/doc/html/draft-ietf-ntp-data-minimization#page-4
同时,自chrony2.3
开始已经不显示客户端数据包中的本地时间和同步状态,这个版本2016年2月16日发布的。参考:https://chrony.tuxfamily.org/news.html
同时chrony与ntp对比官方文档的安全性对比表格中,也有关于随机时间戳的说明:
结论
根据上面的分析可得出:
- 使用chrony2.3及以上版本作为同步工具的系统均存在客户端时间随机问题。
- 一些遵循NTPv4(RFC5905)的时间同步工具,均存在客户端时间随机问题。
- Linux7及以下版本系统使用的同步工具是ntpd,故不存在客户端时间随机问题。
想要T1时间戳是客户端本地真实时间戳应该怎么办?
1、卸载chrony,使用ntpd来实现客户端时间同步。
2、将chrony版本降至2.2.1
3、使用ntpdate来同步本地时间,同时将ntpdate加入定时任务。(不推荐)
注:ntpdate 同步本地时间会立即将本地时间校正,这会导致客户端本地时间出现过大的跳变,对业务会存在一定的影响,所以不推荐这种方式。