linux服務之ntp與chrony


centos7.2變成了chrony

RHEL從7.0開始改用chrony同步時間,原ntp同步方式也可以使用,但要安裝ntp服務。

[root@1st-kvm plymouth]# rpm -qa|grep chro
chrony-2.1.1-1.el7.centos.x86_64

 

設置NTP Server前的准備
其實這個標題應該改為設置"NTP Relay Server"前的准備更加合適. 因為不論我們的計算機配置多好運行時間久了都會產生誤差,所以不足以給互聯網上的其他服務器做NTP Server. 真正能夠精確地測算時間的還是原子鍾. 但由於原子鍾十分的昂貴,只有少部分組織擁有, 他們連接到計算機之后就成了一台真正的NTP Server. 而我們所要做的就是連接到這些服務器上同步我們系統的時間,然后把我們自己的服務器做成NTP Relay Server再給互聯網或者是局域網內的用戶提供同步服務.

[root@rac02 ~]# netstat -ln|grep 123
tcp        0      0 172.16.2.2:12382            0.0.0.0:*                   LISTEN
udp        0      0 172.16.2.2:27123            0.0.0.0:*
udp        0      0 172.16.2.2:123              0.0.0.0:*
udp        0      0 192.168.2.2:123             0.0.0.0:*
udp        0      0 127.0.0.1:123               0.0.0.0:*
udp        0      0 0.0.0.0:123                 0.0.0.0:*


1). 架設一個NTP Relay Server其實非常簡單,我們先把需要的RPM包裝上
[root@localhost ~]# yum install ntp
Installing:
 ntp                               x86_64                           4.2.6p5-2.el6.centos                              updates                           593 k
Installing for dependencies:
 ntpdate                           x86_64                           4.2.6p5-2.el6.centos                              updates                            75 k

[root@localhost ~]# rpm -ql ntp
/etc/dhcp/dhclient.d
/etc/dhcp/dhclient.d/ntp.sh
/etc/ntp.conf
/etc/ntp/crypto
/etc/ntp/crypto/pw
/etc/rc.d/init.d/ntpd
/etc/sysconfig/ntpd
/usr/bin/ntpstat
/usr/sbin/ntp-keygen
/usr/sbin/ntpd
/usr/sbin/ntpdc
/usr/sbin/ntpq
/usr/sbin/ntptime
/usr/sbin/tickadj
/var/lib/ntp
/var/lib/ntp/drift
/var/log/ntpstats
[root@localhost ~]# rpm -ql ntpdate
/etc/ntp
/etc/ntp/keys
/etc/ntp/step-tickers
/etc/rc.d/init.d/ntpdate
/etc/sysconfig/ntpdate
/usr/sbin/ntpdate
2).找到在互聯網上給我們提供同步服務的NTP Server ,http://www.pool.ntp.org是NTP的官方網站,在這上面我們可以找到離我們城市最近的NTP Server. NTP建議我們為了保障時間的准確性,最少找兩個NTP Server。
下面是一個中國的,兩個亞洲的
server 2.cn.pool.ntp.org
server 1.asia.pool.ntp.org
server 3.asia.pool.ntp.org

下面是另一些可選的
server 133.100.11.8 prefer
server 210.72.145.44
server 203.117.180.36
server 131.107.1.10
server time.asia.apple.com
server 64.236.96.53
server 130.149.17.21
server 66.92.68.246
server www.freebsd.org
server 18.145.0.30
server clock.via.net
server 137.92.140.80
server 133.100.9.2
server 128.118.46.3
server ntp.nasa.gov
server 129.7.1.66
server ntp-sop.inria.fr
server (國家授時中心服務器IP地址)

3).在打開NTP服務器之前先和這些服務器做一個同步,使得我們機器的時間盡量接近標准時間. 這里我們可以用ntpdate命令

要注意的是,ntpd 有一個自我保護設置: 如果本機與上源時間相差太大, ntpd 不運行. 所以新設置的時間服務器一定要先 ntpdate 從上源取得時間初值, 然后啟動 ntpd服務。ntpd服務 運行后, 先是每64秒與上源服務器同步一次, 根據每次同步時測得的誤差值經復雜計算逐步調整自己的時間, 隨着誤差減小, 逐步增加同步的間隔. 每次跳動, 都會重復這個調整的過程.


####假如你的時間差的很離譜的話第一次會看到調整的幅度比較大,所以保險起見可以運行兩次. 那么為什么在打開NTP服務之前先要手動運行同步呢?
1. 因為根據NTP的設置,如果你的系統時間比正確時間要快的話那么NTP是不會幫你調整的,所以要么你把時間設置回去,要么先做一個手動同步
2. 當你的時間設置和NTP服務器的時間相差很大的時候,NTP會花上較長一段時間進行調整.所以手動同步可以減少這段時間
[root@localhost ~]# date
Mon Feb 16 03:28:27 EST 2015
[root@localhost ~]# ntpdate 2.cn.pool.ntp.org
26 Feb 01:50:10 ntpdate[6018]: step time server 202.112.31.197 offset 858068.183303 sec
[root@localhost ~]# date
Thu Feb 26 01:51:01 EST 2015
[root@localhost ~]# ntpdate 2.cn.pool.ntp.org
26 Feb 01:53:12 ntpdate[6021]: adjust time server 202.112.29.82 offset 0.010526 sec
[root@localhost ~]# date
Thu Feb 26 01:53:16 EST 2015

這方面的文章網上有很多,講的也很詳細,主要就是修改/etc/init.d/ntp.conf文件,我稍作了修改,加了兩行:

server 210.72.145.44

server cn.pool.ntp.org

之后我就可以同步時間了,有人加了這么一行

restrict 192.168.1.1mask 255.255.255.0 nomodify

我沒有加,但依然成功,看了下配置文件有這第一行

restrict ::1

可能這一行就包含那一行的意思吧!僅僅是猜測。下面給出一個樣本加注釋,僅供參考:

# 1. 關於權限設定部分
#   權限的設定主要以 restrict 這個參數來設定,主要的語法為:
#   restrict IP mask netmask_IP parameter
#   其中 IP 可以是軟件地址,也可以是 default ,default 就類似 0.0.0.0
#   至於 paramter 則有:
#   ignore :關閉所有的 NTP 聯機服務
#   nomodify:表示 Client 端不能更改 Server 端的時間參數,不過,

#   Client 端仍然可以透過 Server 端來進行網絡校時。
#   notrust :該 Client 除非通過認證,否則該 Client 來源將被視為不信任網域
#   noquery :不提供 Client 端的時間查詢

#   notrap :不提供trap這個遠程事件登入

#  如果 paramter 完全沒有設定,那就表示該 IP (或網域)“沒有任何限制”

restrict default nomodify notrap noquery # 關閉所有的 NTP 要求封包
restrict 127.0.0.1    #這是允許本級查詢
restrict 192.168.0.1 mask 255.255.255.0 nomodify
#在192.168.0.1/24網段內的服務器就可以通過這台NTP Server進行時間同步了
# 2. 上層主機的設定
#  要設定上層主機主要以 server 這個參數來設定,語法為:
#  server [IP|HOST Name] [prefer]
#  Server 后面接的就是我們上層 Time Server 啰!而如果 Server 參數
#  后面加上 perfer 的話,那表示我們的 NTP 主機主要以該部主機來作為
#  時間校正的對應。另外,為了解決更新時間封包的傳送延遲動作,
#  所以可以使用 driftfile 來規定我們的主機
#  在與 Time Server 溝通時所花費的時間,可以記錄在 driftfile 
#  后面接的文件內,例如下面的范例中,我們的 NTP server 與 
#  cn.pool.ntp.org聯機時所花費的時間會記錄在 /etc/ntp/drift文件內
server 0.pool.ntp.org

server 1.pool.ntp.org

server 2.pool.ntp.org

server cn.pool.ntp.org prefer

#其他設置值,以系統默認值即可

server  127.127.1.0     # localclock

fudge   127.127.1.0 stratum 10

driftfile /var/lib/ntp/drift
broadcastdelay  0.008
keys /etc/ntp/keys

總結一下,restrict用來設置訪問權限,server用來設置上層時間服務器,driftfile用來設置保存漂移時間的文件。

 


配置和運行NTP Server
現在我們就來創建NTP的配置文件了, 它就是/etc/ntp.conf. 我們只需要加入上面的NTP Server和一個driftfile就可以了

# vi /etc/ntp.conf
server 0.uk.pool.ntp.org
server 1.uk.pool.ntp.org
driftfile /var/lib/ntp/ntp.drift

####非常的簡單. 接下來我們就啟動NTP Server,並且設置其在開機后自動運行

####兩種啟動方式都可以
[root@localhost ~]# /etc/init.d/ntpd start
[root@localhost ~]# chkconfig --level 35 ntpd on
[root@localhost ~]# service ntpd start
Starting ntpd:                                             [  OK  ]
[root@localhost ~]# watch ntpq -p
[root@localhost ~]# ntpq -p
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 gus.buptnet.edu 202.112.10.60    3 u   15   64    3   88.266    8.172   0.832
 ns1.verd.co.id  202.162.32.12    3 u   14   64    3  210.501  -13.741   2.086
 ktdns.cdnetwork 131.107.13.100   2 u   12   64    3   76.944    7.119   2.529
[root@localhost ~]# date
Thu Feb 26 01:58:51 EST 2015
現在我就來解釋一下其中的含義
remote: 它指的就是本地機器所連接的遠程NTP服務器
refid: 它指的是給遠程服務器(e.g. gus.buptnet.edu)提供時間同步的服務器
st: 遠程服務器的級別. 由於NTP是層型結構,有頂端的服務器,多層的Relay Server再到客戶端. 所以服務器從高到低級別可以設定為1-16. 為了減緩負荷和網絡堵塞,原則上應該避免直接連接到級別為1的服務器的.
t: 這個.....我也不知道啥意思^_^
when: 我個人把它理解為一個計時器用來告訴我們還有多久本地機器就需要和遠程服務器進行一次時間同步
poll: 本地機和遠程服務器多少時間進行一次同步(單位為秒). 在一開始運行NTP的時候這個poll值會比較小,那樣和服務器同步的頻率也就增加了,可以盡快調整到正確的時間范圍.之后poll值會逐漸增大,同步的頻率也就會相應減小
reach: 這是一個八進制值,用來測試能否和服務器連接.每成功連接一次它的值就會增加
delay: 從本地機發送同步要求到服務器的round trip time
offset: 這是個最關鍵的值, 它告訴了我們本地機和服務器之間的時間差別. offset越接近於0,我們就和服務器的時間越接近
jitter: 這是一個用來做統計的值. 它統計了在特定個連續的連接數里offset的分布情況. 簡單地說這個數值的絕對值越小我們和服務器的時間就越精確
那么大家細心的話就會發現兩個問題: 第一我們連接的是0.uk.pool.ntp.org為什么和remote server不一樣? 第二那個最前面的+和*都是什么意思呢?
第一個問題不難理解,因為NTP提供給我們的是一個cluster server所以每次連接的得到的服務器都有可能是不一樣.同樣這也告訴我們了在指定NTP Server的時候應該使用hostname而不是IP
第二個問題和第一個相關,既然有這么多的服務器就是為了在發生問題的時候其他的服務器還可以正常地給我們提供服務.那么如何知道這些服務器的狀態呢? 這就是第一個記號會告訴我們的信息
*
它告訴我們遠端的服務器已經被確認為我們的主NTP Server,我們系統的時間將由這台機器所提供
+
它將作為輔助的NTP Server和帶有*號的服務器一起為我們提供同步服務. 當*號服務器不可用時它就可以接管
-
遠程服務器被clustering algorithm認為是不合格的NTP Server
x
遠程服務器不可用
了解這些之后我們就可以實時監測我們系統的時間同步狀況了


NTP安全設置
運行一個NTP Server不需要占用很多的系統資源,所以也不用專門配置獨立的服務器,就可以給許多client提供時間同步服務, 但是一些基本的安全設置還是很有必要的
那么這里一個很簡單的思路就是第一我們只允許局域網內一部分的用戶連接到我們的服務器. 第二個就是這些client不能修改我們服務器上的時間
在/etc/ntp.conf文件中我們可以用restrict關鍵字來配置上面的要求
首先我們對於默認的client拒絕所有的操作
restrict default kod nomodify notrap nopeer noquery
然后允許本機地址一切的操作
restrict 127.0.0.1
最后我們允許局域網內所有client連接到這台服務器同步時間.但是拒絕讓他們修改服務器上的時間
restrict 192.168.1.0 mask 255.255.255.0 nomodify
把這三條加入到/etc/ntp.conf中就完成了我們的簡單配置. NTP還可以用key來做authenticaiton,這里就不詳細介紹了

只要在client的ntp.conf加上ntp server地址就可以了
server 192.168.2.249

1. 配置文件中的driftfile是什么?
我們每一個system clock的頻率都有小小的誤差,這個就是為什么機器運行一段時間后會不精確. NTP會自動來監測我們時鍾的誤差值並予以調整.但問題是這是一個冗長的過程,所以它會把記錄下來的誤差先寫入driftfile.這樣即使你重新開機以后之前的計算結果也就不會丟失了
2. 如何同步硬件時鍾?
NTP一般只會同步system clock. 但是如果我們也要同步RTC的話那么只需要把下面的選項打開就可以了

vi /etc/sysconfig/ntpd  添加 SYNC_HWCLOCK=yes 這樣,就可以讓硬件時間與系統時間一起同步。

在建立好ntp服務以后,可以用2個工具命令對ntp服務進行管理。
一個是ntpq是一個交互式應用命令,在它的下面有很多的子命令可以供大家使用.使用peers可以查看同步進程。如果還需要其他的命令可以輸入help 進行查看。還有一個工具命令是ntpdate這個命令一般用於ntp的客戶端使用。可以在/var/adm/messages中看到ntp的同步信息的情況。如果需要更加詳細的ntpq和ntpdate的信息可以使用man幫助進行查詢。
ntpdate與ntpd的關系類似於snmpwalk與snmpd的關系,一個客戶端,一個服務端。

 

ntpd與ntpdate的區別

之前配置ntpd的時候搜到一句話,印象很深刻,也覺得很有標題黨的效果,就借鑒為標題了:
“我認為有幾種人是必須不招聘/裁掉的: 1 用ntpdate代替ntpd的人”
但具體原因不太懂,總覺得還是用ntpdate比較方便。
今天問了紅帽技術支持,對方的解釋是:
ntpd在實際同步時間時是一點點的校准過來時間的,最終把時間慢慢的校正對。而ntpdate不會考慮其他程序是否會陣痛,直接調整時間。
一個是校准時間,一個是調整時間。
以下是一個形象的假設:
linuxtone限制用戶注冊1小時才能發帖。
數據庫服務器在 10:00分接受了我的注冊邀請;
10:03分,ntpdate將數據庫時間強行改成9:35分;
然后10:05分(9:37分)我嘗試發帖,系統判斷我注冊時間是否滿一小時會使用:9:37 - 10:00
最后電腦就邏輯混亂了。。。
類似的帖子網上也有很詳細的說明,貼出來給大家看看:
時鍾的躍變,有時候會導致很嚴重的問題。許多應用程序依賴連續的時鍾??畢竟,這是一項常見的假定,即,取得的時間是線性的,一些操作,例如數據庫事務,通常會地依賴這樣的事實:時間不會往回跳躍。
不幸的是,ntpdate調整時間的方式就是我們所說的”躍變“:在獲得一個時間之后,ntpdate使用settimeofday(2)設置系統時間,這有幾個非常明顯的問題:
第 一,這樣做不安全。ntpdate的設置依賴於ntp服務器的安全性,攻擊者可以利用一些軟件設計上的缺陷,拿下ntp服務器並令與其同步的服務器執行某 些消耗性的任務。由於ntpdate采用的方式是跳變,跟隨它的服務器無法知道是否發生了異常(時間不一樣的時候,唯一的辦法是以服務器為准)。
第二,這樣做不精確。一旦ntp服務器宕機,跟隨它的服務器也就會無法同步時間。與此不同,ntpd不僅能夠校准計算機的時間,而且能夠校准計算機的時鍾。
第三,這樣做不夠優雅。由於是跳變,而不是使時間變快或變慢,依賴時序的程序會出錯(例如,如果ntpdate發現你的時間快了,則可能會經歷兩個相同的時刻,對某些應用而言,這是致命的)。
因而,唯一一個可以令時間發生跳變的點,是計算機剛剛啟動,但還沒有啟動很多服務的那個時候。其余的時候,理想的做法是使用ntpd來校准時鍾,而不是調整計算機時鍾上的時間。
NTPD 在和時間服務器的同步過程中,會把 BIOS 計時器的振盪頻率偏差??或者說 Local Clock 的自然漂移(drift)??記錄下來。這樣即使網絡有問題,本機仍然能維持一個相當精確的走時。
##############
最后提醒一下使用vmware的各位,因為虛擬機的時鍾不太正常,比正常速度慢好多秒,所以在虛擬機上測試ntpd很難得到理想的結果,我當年就是為這個問題耽擱了好幾天。。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM