網路時間協議介紹以及伺服器同步網路時間

  • 2020 年 11 月 14 日
  • 筆記

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帳號操作。

  1. A從外網同步時間,
  2. 把A配置成ntp伺服器(NTP server),
  3. 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 [email protected] 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