在NTS授時(shí)狀態(tài)監(jiān)控系統(tǒng)的同步日志頁(yè)面中,記錄著所有客戶端向NTS服務(wù)器校時(shí)的日志信息,我們可以看到有些同步日志中的客戶端時(shí)間是隨機(jī)的。如下圖所示:
經(jīng)過統(tǒng)計(jì)后得知,隨機(jī)時(shí)間的客戶端均是centos7(redhat7)及以上版本的Linux系統(tǒng),centos6.5及以下版本中客戶端同步時(shí)間均是正常的。我們都知道Linux7之前的版本同步時(shí)間用的是ntpd服務(wù)
,Linux7以及7之后的版本都改用chrony
了,兩者區(qū)別參考:https://chrony.tuxfamily.org/comparison.html。
在centos7.9的測(cè)試環(huán)境中對(duì)123端口進(jìn)行抓包后發(fā)現(xiàn),客戶端發(fā)送給服務(wù)器的NTP包中,transmit
timestamp(T3)的時(shí)間戳是隨機(jī)的,同時(shí),服務(wù)器收到客戶端請(qǐng)求后,原封不動(dòng)的將時(shí)間賦值給origin
timestamp(T1),如下圖所示:(時(shí)間戳參考文末附1)
但是這種情況在使用ntpdate
同步本地時(shí)間時(shí)并不存在,時(shí)間都是正確的:
經(jīng)過抓包后,可以初步確定問題出現(xiàn)在chrony上了。經(jīng)過查詢資料發(fā)現(xiàn),自chrony2.3
開始不顯示客戶端數(shù)據(jù)包中的本地時(shí)間和同步狀態(tài),這個(gè)版本是2016年2月16日發(fā)布的。參考:https://chrony.tuxfamily.org/news.html
而centos7.9的測(cè)試環(huán)境中,chrony的版本是3.4。
但是,chrony2.3版本更新記錄中,只是說明不再顯示客戶端數(shù)據(jù)包中的本地時(shí)間和同步狀態(tài),但是沒說明本地時(shí)間為什么是隨機(jī)的。
經(jīng)過查詢資料發(fā)現(xiàn),chrony與NTP對(duì)比官方文檔的安全性對(duì)比表格中,有關(guān)于隨機(jī)時(shí)間戳的說明,如下圖所示
同時(shí)RFC5905(NTPv4)中也給出了隨機(jī)時(shí)間戳的說明:雖然該備忘錄要求客戶端數(shù)據(jù)包中的大部分字段設(shè)置為零,但發(fā)送時(shí)間戳應(yīng)該是隨機(jī)的。這個(gè)決定是出于安全和隱私的動(dòng)機(jī)。在沒有密碼認(rèn)證的情況下,驗(yàn)證原始時(shí)間戳是客戶端對(duì)NTP響應(yīng)進(jìn)行盲欺騙的主要防御手段。因此,客戶端的傳輸時(shí)間戳不可預(yù)測(cè)是很重要的。
chrony官方為了安全考慮,從chrony2.3起不在客戶端數(shù)據(jù)包中顯示本地時(shí)間和同步狀態(tài),即客戶端發(fā)起NTP校時(shí)的數(shù)據(jù)包中的本地時(shí)間直接被賦值為隨機(jī)時(shí)間,這樣NTP服務(wù)器收到客戶端的校時(shí)請(qǐng)求后,經(jīng)過解析后保存同步日志,我們看到的客戶端時(shí)間就是一個(gè)隨機(jī)時(shí)間。
根據(jù)上面的分析可得出:
使用chrony2.3及以上版本作為同步服務(wù)的系統(tǒng),客戶端時(shí)間(T1)均是隨機(jī)時(shí)間戳。
一些遵循NTPv4(RFC5905)協(xié)議開發(fā)的時(shí)間同步工具,客戶端時(shí)間(T1)均是隨機(jī)時(shí)間戳。
Linux7及以下版本系統(tǒng)使用的同步服務(wù)是ntpd,客戶端時(shí)間(T1)是客戶端本地時(shí)間。
NTS授時(shí)狀態(tài)監(jiān)控系統(tǒng)同步日志中的客戶端時(shí)間只是將T1時(shí)間戳展示出來,作為對(duì)客戶端進(jìn)行同步超時(shí)告警和客戶端時(shí)間偏差告警時(shí)的參考依據(jù)。所以,當(dāng)客戶端時(shí)間隨機(jī)化后,NTS授時(shí)狀態(tài)監(jiān)控系統(tǒng)將無法對(duì)此類客戶端進(jìn)行同步超時(shí)告警和時(shí)間偏差告警。
目前可以先將chrony的版本降低至chrony2.2.1,這樣可保證正常監(jiān)控客戶端時(shí)間偏差。后續(xù)我們會(huì)繼續(xù)對(duì)NTS授時(shí)狀態(tài)監(jiān)控系統(tǒng)進(jìn)行升級(jí),屆時(shí)可不降低chrony版本的同時(shí)監(jiān)控高版本的Linux客戶端。
一個(gè)完整的NTP協(xié)議校時(shí)請(qǐng)求數(shù)據(jù)包中有4個(gè)時(shí)間戳(T1、T2、T3、T4),分別表示:
起源時(shí)間戳 T1(origin timestamp):請(qǐng)求離開服務(wù)器時(shí)在客戶端的時(shí)間,即:請(qǐng)求數(shù)據(jù)包離開客戶端時(shí),客戶端本地時(shí)間
接收時(shí)間戳 T2(receive timestamp):請(qǐng)求從客戶端到達(dá)時(shí)在服務(wù)器的時(shí)間,即:請(qǐng)求數(shù)據(jù)包到達(dá)服務(wù)器時(shí),服務(wù)器本地時(shí)間
發(fā)送時(shí)間戳 T3(transmit timestamp):響應(yīng)離開客戶端時(shí)在服務(wù)器的時(shí)間,即:響應(yīng)數(shù)據(jù)包離開服務(wù)器時(shí),服務(wù)器本地時(shí)間
目的地時(shí)間戳 T4(destination timestamp):響應(yīng)到達(dá)客戶端時(shí)在客戶端的時(shí)間,即:響應(yīng)數(shù)據(jù)包到達(dá)客戶端時(shí),客戶端本地時(shí)間
通過這4個(gè)時(shí)間戳可以得出:
網(wǎng)絡(luò)延遲: delay=(T4-T1)-(T3-T2)
客戶端時(shí)間偏差: offset=((T2-T1)+(T3-T4))/2