NTP介紹
網絡時間協議(英語:Network Time Protocol,縮寫:NTP)是在數據網絡潛伏時間可變的計算機系統之間通過分組交換進行時鍾同步的一個網絡協議,位於OSI模型的應用層。自1985年以來,NTP是目前仍在使用的最古老的互聯網協議之一。NTP由特拉華大學的David L. Mills設計。
NTP意圖將所有參與計算機的協調世界時(UTC)時間同步到幾毫秒的誤差內。它使用Marzullo算法的修改版來選擇准確的時間服務器,其設計旨在減輕可變網絡延遲造成的影響。NTP通常可以在公共互聯網保持幾十毫秒的誤差,並且在理想的局域網環境中可以實現超過1毫秒的精度。不對稱路由和擁塞控制可能導致100毫秒(或更高)的錯誤。
該協議通常描述為一種主從式架構,但它也可以用在點對點網絡中,對等體雙方可將另一端認定為潛在的時間源。發送和接收時間戳采用用戶數據報協議(UDP)的端口123實現。這也可以使用廣播或多播,其中的客戶端在最初的往返校准交換后被動地監聽時間更新。NTP提供一個即將到來閏秒調整的警告,但不會傳輸有關本地時區或夏時制的信息。
當前協議為版本4(NTPv4),這是一個RFC 5905文檔中的建議標准。它向下兼容指定於RFC 1305的版本3。
ntp組件是Linux平台ntp協議的軟件實現,部分Linux操作系統默認安裝了ntp組件,如果沒有先安裝ntp,才能使用該協議完成時間同步。
服務器可訪問互聯網時的時間同步方法
已配置DNS
服務器能訪問外網並且配置了DNS,直接
ntpdate 0.cn.pool.ntp.org 或 nptdate ntp1.aliyun.com
就可以同步外網時間。
未配置DNS
部分服務器出於安全考慮,雖然通外網,但沒有配置DNS,這時需要直接從時間服務器的ip地址同步時間。可以使用阿里雲(ntp1.aliyun.com)的時間服務器ip直接同步,
ntpdate 120.24.81.91 或者 清華的時間服務器ntpdate 84.16.73.33
服務器不能訪問互聯網的時間同步方法
假設局域網有一台服務器(ip地址是IP_TIME)時間是正確的,將這台服務器配置為局域網ntp時間服務器,其它服務器執行
ntpdate IP_TIME
這樣,至少所有服務器就和這台的時間同步了,這台是否需要和網絡時間同步要看功能要求。確實需要的話,這台必須可以訪問互聯網,按上面描述同步到網絡時間,其余可保持不能訪問互聯網的狀態。
舉個例子
假設A B兩台Linux服務器,要將兩台都同步到網絡時間。
A是開通了外網的,雖然沒配置DNS服務器,但能ping通120.24.81.91(阿里雲時間服務器)。可以直接同步時間。
B沒開通外網,ping 120.24.81.91會報connect: Network is unreachable,這種肯定無法從外網服務器同步時間。執行ntpdate 120.24.81.91,會報no server suitable for synchronization found,或者no servers can be used, exiting。
解決辦法統共分三步,A和B的防火牆都關閉,整個過程用root賬號操作。
- A從外網同步時間,
- 把A配置成ntp服務器(NTP server),
- B從A同步時間。
A同步網絡時間
服務器第一次同步時間顯示如下
[root@localhost ~]# ntpdate 120.24.81.91
10 Aug 09:46:07 ntpdate[15071]: step time server 120.24.81.91 offset 1.423469 sec
第2-n次顯示如下
[root@localhost ~]# ntpdate 120.24.81.91
10 Aug 14:16:14 ntpdate[12150]: adjust time server 120.24.81.91 offset -0.030012 sec
每執行一次,offset后面的誤差都會變化,趨勢是越來越准確。
把A配置為NTP server
配置A為NTP server,首先修改配置文件/etc/ntp.conf。怎么修改往下看。
修改完成執行如下cat指令,除了192.168.2.0改成你自己局域網的網段,其余要求必須和下面一樣,有比下面多出的語句就注釋掉,沒有的語句就加上。如果恰好和下面一樣,192位置也是你的局域網網段,那就什么都不用改。
#cat /etc/ntp.conf |awk '{if($0 !~ /^$/ && $0 !~ /^#/) {print $0}}'
restrict default ignore //#設置默認策略為允許任何主機進行時間同步
restrict 127.0.0.1 //給於本機所有權限
restrict 192.168.2.0 mask 255.255.255.0 nomodify notrap //給於局域網機的機器有同步時間的權限
server 0.127.127.1.0 //設置時間服務器為本機,可以設為120.24.81.91外網服務器
server 127.127.1.0 # local clock
fudge 127.127.1.0 stratum 10
driftfile /var/lib/ntp/drift
broadcastdelay 0.008
keys /etc/ntp/keys
然后執行
# /etc/init.d/ntpd start 或 #service ntpd start
會顯示OK,表示成功,本機已經是NTP server了。
如果配置文件反復修改,執行
# /etc/init.d/ntpd restart
重新加載配置文件。
B和A同步時間
A啟動NTP server服務后,要等待5分鍾,才能在B上執行同步時間指令,這個時間是給NTP server同步本機時間用的。
5分鍾后在B上執行
[root@DB1 ~]# ntpdate AIP (AIP是A的內網IP地址)
10 Aug 13:35:59 ntpdate[10737]: adjust time server AIP offset 0.004937 sec
,就可以同步A的系統時間到B,也相當於同步了外網時間。
如果A啟動NTP server后,不等5分鍾,馬上在B上同步時間會怎么樣?
由於NTP server本身時間還沒和操作系統同步好,會返回錯誤
no server suitable for synchronization found
可以使用ntpdate –d AIP指令查看。
[root@DB1 ~]# ntpdate -d AIP
10 Aug 13:28:07 ntpdate[10719]: ntpdate 4.2.0a@1.1190-r Thu Oct 5 04:11:32 EDT 2006 (1)
Looking for host 192.168.2.10 and service ntp
host found : 192.168.2.10
transmit(192.168.2.10)
receive(192.168.2.10)
省略
192.168.2.10: Server dropped: strata too high
server 192.168.2.10, port 123
stratum 16, precision -20, leap 11, trust 000
refid [192.168.2.10], delay 0.02573, dispersion 0.00000
省略
有“Server dropped: strata too high”的提示,並且“stratum 16”。
stratum的正常范圍是“0~15”。
什么都不用做,等一段時間再執行指令試試,就會變成stratum 11, precision -20, leap 00, trust 000。stratum 11是正常范圍,此時執行ntpdate AIP就成功同步時間了。
B服務器要始終和A保持一致怎么辦?
B需要頻繁校正時間的話,crontab配置ntpdate指令可以達到目的。
crontab -e
9 7 * * * /usr/sbin/ntpdate AIP
操作系統時間同步到硬件時間也都可以根據需要設定crontab。硬件時間保持和操作系統時間一致的好處是可以避免重啟服務器后硬件時間覆蓋系統時間導致誤差。
A可以一邊從外網同步時間,一邊作為局域網的NTP server嗎?
經測試,ntpd服務運行時,無法執行ntpdate指令。要頻繁同步網絡時間,還要作為局域網的NTP server給其它服務器同步時間,A上的crontab定時任務要按照如下順序執行
1. ntpdate 外網時間服務器ip
2. service ntpd start
3. 間隔一段可接受的時間,間隔約長,和網絡時間的誤差越大。
此時B可同步到A的時間
4. service ntpd stop
下面循環回第一步
1. ntpdate 外網時間服務器ip