RHEL6.5中部署NTP(ntp server + client)

NTP全稱爲Network Time Protocol,即網絡時間協議。一般在Linux系統中用來同步集羣中不同機器的時間。

本文描述的ntp服務部署框架如下圖示

如上圖,框架中的有外網ntp服務器內網ntp服務器內網中的其他機器。爲講解方便先作如下假設:

外網ntp服務器:xx.cn.pool.ntp.org

內網ntp服務器:10.xxx.xxx.189

內網中的其他機器:10.xxx.xxx.148和10.xxx.xxx.149

 (189、148和149等的操作系統都是Red Hat 6.5)

機器之間的關係是這樣的:

(1)外網ntp服務器與內網ntp服務器的關係:

內網ntp服務器189首先根據外網ntp服務器的時間,調整自己的時間至同準確時間一致,然後通過ntpd或ntpdate定時向外網ntp服務器同步時間。此時外網服務器爲ntp服務器,189爲ntp客戶端;

(2)內網ntp服務器與內網其他機器的關係:

在189的時間調整準確之後,它便可以作爲ntp服務器爲內網中的其他機器提供服務了。此時189爲ntp服務端,而148和149等其他機器爲ntp客戶端。

 

即整個架構中189同時作爲ntp服務器和客戶端而存在,就像一個三世同堂的家庭中,爸爸既是爸爸也是兒子,同樣的道理。

 

一、內網ntp服務器(10.xxx.xxx.189)的設置

1、檢查並安裝ntp

使用rpm -qa | grep ntp 命令查看服務器是否安裝了ntp,如果出現下面兩個說明已安裝。

 

倘若沒有安裝,可使用yum install -y ntp命令進行安裝(前提是服務器的yum可用,若是yum無法使用,也可以到網上找到相應的rpm包進行手動安裝)


2、使用ntpdate同步NTP服務器時間

這一步的主要命令有兩個:

(1)   ntpdate 0.cn.pool.ntp.org  #ntpdate修改系統時間

(2)   hwclock –systohc   #將硬件時間修改到與系統時間相同


由於NTP的限制,如果系統時間與正確的時間相差太大的話,NTP是不會幫你做調整的——網上也有另一種說法,就是當你的時間設置和正確的時間相差很大的時候,NTP不會直接不同步,而是會花上很長一段時間進行同步調整——關於這點我沒有實際測試過,反正不管是由於哪種原因,總之我們需要先通過ntpdate做一個時間同步,把189的時間調整到跟實際相同,用到的是第(1)個命令。

 

2.1

首先我們要先確定好自己的時區(若時區已經正確了可略過這步)。

根據所在地點重新設置時區。以上海爲例。

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime    #將時區設置成上海

 

[[email protected] ~]# date

Mon Mar 12 18:28:42 CST 2018   #可以看到我們的時區已經設置過來了,因爲時區顯示爲CST了,CST即china standard time。

 

 

2.2

同步之前需要知道可用的外網NTP服務器是多少,通過NTP官網http://www.pool.ntp.org找到離自己城市最近的NTP服務器,如下圖:

我取到的公網NTP服務器地址如下:

server 0.cn.pool.ntp.org

server 1.cn.pool.ntp.org

server 2.cn.pool.ntp.org

server 3.cn.pool.ntp.org

 

2.3

找到外網ntp服務器之後,接下來使用ntpdate將時間調準。

 [[email protected]bbix ~]# ntpdate 0.cn.pool.ntp.org

12 Mar 14:03:12 ntpdate[19868]: step time server 85.199.214.100 offset 1114.672613 sec

注:可以執行兩三遍以減少時延

 執行前系統時間爲下午1點42分,是錯誤的。

執行後系統時間修改爲下午2點3分,已修改爲正確時間。

注意:

(1)使用ntpdate修改時使用的是躍變的方式,就是說ntpdate命令是簡單的將時間從某個點修改爲另一個時間點,中間沒有平滑的過渡。

(2)執行ntpdate  xx.cn.pool.ntp.org命令時可能會報「the NTP socket is in use」的錯誤,如下圖:

原因:造成該錯誤一般是因爲系統ntpd服務器正在運行中,導致udp的123端口被ntpd佔用。這可以通過service  ntpd  status或者 ps aux | grep ntpd 命令加以驗證——大部分情況都是這個原因沒跑了。

解決辦法:若確實是這個原因,可使用命令 service ntpd stop 終止ntpd服務。實在不行可強行kill掉ntpd對應的pid。關閉ntpd服務之後就可以繼續執行命令了。如上圖。

 

(3)還有一種可能的報錯是:no server suitable for synchronization found,這種情況可能是防火牆的原因,可直接跳到下面的防火牆部分,按照步驟開啓防火牆的123 udp端口即可。「可能」兩字使得這句話顯得不那麼自信,其實我在本地虛擬機上測試時確實報過這個錯誤,然後我開啓123端口之後就解決了,但是當時並沒有留下截圖。但是不管怎樣,123端口是無論如何都要打開的,所以作爲排錯,你在這一步先設置了也未嘗不可。

 

2.4

上面2.3步驟中同步的是系統時間,接下來使用hwclock –systohc命令(sys(系統時間)to(寫到)hc(Hard Clock))將系統時間設置成硬件時間。

 

 

3、配置/etc/ntp.conf主配置文件

此時若直接用service ntpd start命令啓動189的ntp服務,其實已經可以向客戶端提供時間更新服務了——這是因爲,只要將NTP服務器的時間設定爲正確時間,再將ntp服務啓動,189就可以作爲ntp服務器對內網中其他機器提供服務了,無需配置它的ntp主配置文件。但是,這樣是滿足不了企業安全性需求的(需配置ntp.conf中的restrict參數),並且誰也無法保證在189這一次性的時間調整之後,在接下來的時間裏就它的時間永遠都是對的(189需定時與外網ntp服務器做時間同步)。

因此在服務器接下來的運行期間,189需要定時與外網ntp服務器做時間同步,以保證它自己的時間不會跑偏。有兩種方法:

(1)   ntpdate + crontab的方法。

由前面我們知道,ntpdate 0.cn.pool.ntp.org命令可以將189的時間跟外網ntp服務器進行同步,因此只需在機器上建立相應的crontab任務定時的執行該命令就可以保證189在其運行期間的時間一致性了。比如,在crontab中添加:

0 12 * * * * ntpdate 0.cn.pool.ntp.org

若是採用這種方法,到這裏就可以不用繼續往下看了。

(2)   ntpd服務的方法。

這種方法要好過第一種方法,因爲ntpdate採用躍變的方式直接將時間修改過來,對一些依賴時間的應用程序可能會有影響。理想的做法是,在開機的時候使用ntpdate強制同步時間(因爲機器剛開機,機器上的許多服務還沒有啓動,而且即使有個別應用已經啓動並且ntpdate命令對其造成影響,影響也是相對較小的),在其他時候使用ntpd服務來平滑地同步時間。

 

接下來講解的主要是採用第二種方法時ntp主配置文件/etc/ntp.conf的設置,該文件中需要注意的幾個參數如下:

1)driftfile參數:解決NTP服務器校準時間時的傳送延遲

格式: driftfile 文件名

用途:將與上級時間服務器聯繫時所花費的時間,記錄在driftfile參數後面指定的文件內

注意:driftfile後面必須接完整的文件路徑,不能是鏈接文件,並且必須要有ntpd守護進程可以寫入的權限。

對應默認配置項:driftfile /var/lib/ntp/drift

注:實際操作中我沒改過driftfile參數

 

2)restrict參數:權限的控制(非常重要的參數,內網ntp服務器需修改,內網ntp客戶端可不用修改

格式:restrict IP mask 掩碼 參數

用途:IP規定了允許或不允許訪問的地址(此處若爲default,即爲0.0.0.0所有ip),配合掩碼可以對某一網段進行限制。

restrict參數包括:

ignore:關閉所有NTP服務

nomodify:客戶端不能修改服務端的時間,但可以作爲客戶端的校正服務器

noquery:不提供時間查詢,即用戶端不能使用ntpq,ntpc等命令來查詢ntp服務器

nopeer:不與同一層的其他服務器進行時間同步

kod:kod技術可以阻止「kiss of death」包(一種DOS攻擊)對服務器的破壞

notrap:不提供trap遠端事件登陸的功能

notrust:客戶端除非通過認證,否則指定的網段爲不信任網段 #ntp4.2之後的版本,已經默認沒有這個參數,如果你添加了,會報錯的。

對應默認配置項:

restrict default kod nomodify notrap nopeer noquery  #默認對所有client拒絕所有的操作

restrict -6 default kod nomodify notrap nopeer noquery

restrict 127.0.0.1  #允許本機地址的一切操作

restrict -6 ::1

 

3)server參數:設定上級時間服務器(非常重要的參數,內網ntp服務器和客戶端都需要配置

格式: server IP地址或域名 [prefer]

用途:IP地址或域名即爲該NTP服務器指定的上級NTP服務器。當指定多個NTP服務器時,使用prefer參數的服務器優先級最高,如果都沒有使用prefer參數,那麼服務器的優先級則按從上到下的順序依次由高到低。在指定上層服務器後,至少15min纔會與上層NTP服務器進行時間校對。

默認配置項:

server 0.rhel.pool.ntp.org iburst

server 1.rhel.pool.ntp.org iburst

server 2.rhel.pool.ntp.org iburst

server 3.rhel.pool.ntp.org iburst

 

在實際操作中我的修改只有兩點,分別爲: restrict和server。如下圖

4)ntp服務默認只會同步系統時間。若是希望ntp也同時能修改機器的硬件時間,則需要將硬件時間的修改加入配置文件:在/etc/sysconfig/ntpd文件中,添加SYNC_HWCLOCK=yes

 

5)除此之外,還有一個文件:/etc/ntp/step-tickers

在我的實際操作中,內網ntp服務器189沒有修改這個文件的也沒有問題,但是內網的ntp客戶端如148和149都配置了,不配置的話148、149無法與189進行時間同步,出現的情況爲:148、149等ntp客戶端的ntpd服務雖然啓動了,但是不會與189的ntp服務器進行同步,查看客戶端ntp狀態時會一直顯示下圖所示的狀態

 

網上關於step-tickers文件的解釋是:當ntpd服務啓動時,會自動與該文件中記錄的上層NTP服務進行時間校對。

關於ntp.conf and step-tickers區別:

step-tickers is used by ntpdate where as ntp.conf is the configuration file for the ntpd daemon. ntpdate is initially run to set the clock before ntpd to make sure time is within 1000 sec. ntp will not run if the time difference between the server and client by more then 1000 sec ( or there about). The start up script will read step-tickers for servers to be polled by ntpdate.

默認情況下,我們配置的NTP服務器不會去時間源那裏同步時間,所以必須修改/etc/ntp/step-tickers文件,加入我們的時間源,這樣每次通過/etc/init.d/ntpd 來啓動服務的時候就會自動更新時間了。

4、防火牆設置

配置完成之後,其實就可以啓動服務了,但是在啓動之前,我們先看一下防火牆設置。

NTP服務需要使用到UDP端口號123,在系統的防火牆(Iptables)啓動的情況下,必須開放UDP端口號123。

使用/etc/init.d/iptables status命令查看防火牆狀態。

 

上圖中我的防火牆在我之前安裝其他服務的時候已經關閉了,所以這裏不需要再設置了。但是如果你的防火牆沒關。則需要按照如下步驟開放防火牆的123端口。

(1)   /sbin/iptables -I INPUT -p udp --dport 123 -j ACCEPT  #開放udp的123端口

(2)   /etc/rc.d/init.d/iptables save    #保存配置

(3)   /etc/rc.d/init.d/iptables restart #重啓防火牆服務 

(4)   /etc/init.d/iptables status      #查看已開放端口

在服務器的防火牆開啓,並且開放了123端口的示例:

(5)   也可以使用 lsof 命令來查看某一端口是否開放:lsof -i:123

如果防火牆沒有開放UDP端口號123,肯定是會出問題的,到時候出錯了可以直接上網查。

5.將ntp服務加入開機自啓動

這一步其實挺有必要的,因爲你的集羣在部署好ntp服務之後,在往後項目的開發過程中都極少去關注它了,若某個時候你的某臺服務器由於某些原因重啓了(這總會發生的….),而你的ntp服務又不是開機自啓動的,那麼這臺服務器在一段時間後就有可能時間跑偏了。

步驟如下:

(1)使用chkconfig --list | grep ntpd命令查看是否已將ntp服務加入開機自啓動

(2)若沒有加入,則使用chkconfig ntpd on命令將其加入

6.接下來就可以啓動ntpd服務了。

(1)service ntpd start    #開啓ntp服務

(2)service ntpd status   #查看狀態

(3)service ntpd stop     #停止ntp服務

(4)service ntpd restart  #重啓ntp服務

 

上圖可見,在開啓ntpd服務之後若是立馬查詢狀態則有可能會出現unsynchronised

這是由於每次重啓NTP服務器之後大約要3-5分鐘客戶端才能與server建立正常的通訊連接。當此時用客戶端連接服務端就會報這樣的信息。一般等待幾分鐘就可以了。因此客戶端重啓ntpd服務之後執行ntpstat查看的時候有可能會出現這種情況。

 

NTP服務啓動之後,可以使用下面幾個命令進行查看其狀態。

(1)ntpstat命令:查看ntp服務器有無和上層ntp連通

正常連通的情況如下圖所示:

 

(2)ntpq –p命令:該命令可以列出目前我們的NTP與相關的上層NTP的狀態

其中:

remote:即NTP主機的IP或主機名稱。注意最左邊的符號,如果由「+」則代表目前正在作用鐘的上層NTP,如果是「*」則表示也有連上線,不過是作爲次要聯機的NTP主機。

refid:參考的上一層NTP主機的地址

st:即stratum階層——理論上說,NTP 服務器是分等級(Stratum)的,Stratum = 1 的 NTP 服務器是直接和世界標準時鍾同步的,包括 GPS 時間、銫原子鐘、某些手機網絡等。NIST、中國國家授時中心和中國教育網的第一級時間服務器都是這個級別的。Stratum = 2 的 NTP 服務器是和 Stratum = 1 的服務器同步的,性能稍差,但精確度也在毫秒的量級,所以用起來沒什麼區別。再往下每同步一級,Stratum 就加一。(這一段從網上摘抄過來)

when:幾秒前曾做過時間同步更新的操作

poll:下次更新在幾秒之後

reach:已經向上層NTP服務器要求更新的次數

delay:網絡傳輸過程鍾延遲的時間

offset:時間補償的結果

jitter:Linux系統時間與BIOS硬件時間的差異時間

 

(3)watch 「ntpq –p」命令:

 

Ctrl + C 退出。

二、內網ntp客戶端(10.xxx.xxx.148/149)設置

內網ntp客戶端的設置跟內網ntp服務器189的ntp服務器設置其實差別不大:在上一步中,189是客戶端,外網的xx.cn.pool.ntp.org是服務器;這一步,148和149是客戶端,189變成服務器了。

所以在這一步的配置中,只需要把上一步中的外網服務器地址全部換成189的地址就可以了。

簡要步驟如下:

1.rpm -qa | grep ntp檢查是否安裝了ntp

2.ntpdate同步系統時間,並修改硬件時間
ntpdate 10.xxx.xxx.189 (兩遍)
hwclock --systohc

3.修改/etc/ntp.conf主配置文件,添加server
server 10.xxx.xxx.189 prefer
server 10.xxx.xxx.180

:ntp客戶端不用修改restrict參數

4.修改/etc/ntp/step-tickers,添加server:
server 10.xxx.xxx.189 prefer
server 10.xxx.xxx.180

5.將硬件時間的修改加入配置文件
在/etc/sysconfig/ntpd文件中,添加
SYNC_HWCLOCK=yes

6.防火牆的設置
/etc/init.d/iptables status

7.是否開機自啓動
chkconfig --list | grep ntpd

8.啓動服務並查看狀態
service ntpd start

ntpstat

ntpq -p

 

主要的不同有兩點:

(1)客戶端的/etc/ntp.conf文件中的restrict參數可以不用配置,它的/etc/ntp.conf文件中只需要修改server來設定189爲它的上層時間服務器即可,其他保持默認

(2)上一步配置內網ntp服務器設置時/etc/ntp/step-tickers是不用配置的,但是在這裏的客戶端設置時需要配置該文件:在該文件中加上189,如下所示:

 

圖中之所以有兩行是因爲我做了簡單的負載均衡和高可用,因此用prefer參數指定189爲首選ntp服務器。