NTP伺服器搭建
一、NTP通信協定
實際上,Linux作業系統的計時方式主要從1970年1月1日開始計算總秒數,是以,如果你還記得date這個指令的話,會發現他有個+%s的參數,可以去的總秒數,這個就是軟體時鐘。但是,如同前面說的,計算機硬體主要是以BIOS内部的時間為主要的時間依據(硬體時鐘),而偏偏這個時間可能因為BIOS内部晶片本身的問題,而導緻BIOS時間與标準時間(UTC)存在一點點的差異。是以,為了避免主機時間因為長期運作而導緻時間偏差,進行時間同步(synchronize)的工作就顯得很重要了。
軟體時鐘:由Linux作業系統根據1970/01/01開始計算的總秒數。
硬體時鐘:主機硬體系統上面的時鐘,例如BIOS記錄的時間。
那麼怎麼讓時間同步化呢?如果我們選擇幾部主要主機(Primary Server)調校時間,讓這些Primary Server的時間同步之後,在開放網絡服務讓Client段連結,并且允許Client端調整自己的時間,不就可以實作全部計算機的時間同步了嗎。那麼什麼協定可以實作這樣的功能呢,那就是Network Time Protocol,即NTP協定,另外還有Digital Time Synchronization Protocol(DTSS)也可以實作相同的功能。不過,NTP是如何讓Server與Client同步他們的時間的呢?
1)首先,主機當然需要啟動這個daemon。
2)之後,Client會向NTP Server發送出校對時間的message.
3)然後NTP Server會送出目前的标準時間給Client。
4)Client接受了來自Server的時間後,會據此調整自己的時間,這樣就實作了網絡校時。
至于NTP這個daemon是以port123為連接配接的接口(使用UDP資料包),是以我們利用Time Server來進行時間同步更新時,就需要使用NTP這個軟體提供的ntpdateup來進行port123的連接配接。
二、NTP伺服器的層次概念
由于NTP時間伺服器采用類似分級架構(straum)來處理時間的同步化,是以它使用的是類似一般Server/Client的主從架構。網絡社會上會提供一些主要與次要的時間伺服器,這些均屬于第一級與第二級的時間伺服器。
再進行NTP主機的設定時,都會選擇多台上層的Time Server來作為我們這一台NTP Server的校時之用,選擇堕胎的原因是因為可以避免因為某台時間伺服器突然當機時,其他主機仍然可以提供NTP主機來自我更新,然後NTP Server才提供給自己的Client端更新時間。
三、NTP伺服器的安裝和配置
1、所需軟體與軟體結構
Yum install ntp
Yum install tzdata
與時間及NTP伺服器設定相關的的配置檔案與重要資料檔案有下面幾個。
/etc/ntp.conf :就是NTP伺服器的主要配置檔案,也是唯一一個
/usr/share/zoneinfo/:由tzdata所提供的,為個時區的時間格式對應檔案。例如我過的時區格式對應檔案是/usr/share/zoneinfo/Asia/Shanghai.這個目錄裡面的問價與下面要談的兩個檔案(clock與localtime)是有關系的。
/etc/sysconfig/clock:設定時區與是否使用UTC時鐘的配置檔案。每次開機候Linux會自動讀取這個檔案設定自己系統所預設要顯示的時間。舉例來說,在我們中國本地的時間設定中,這個檔案内應該會出現一行ZONE=“Asia/Shanghai”的字樣,這表示我們的時間配置檔案要使用/usr/share/zoneinfo/Asia/Shanghai那個檔案。
[[email protected] zoneinfo]# cat /etc/sysconfig/clock
ZONE="Asia/Shanghai"
/etc/localtime:就是本地的時間配置檔案。剛剛那個clock檔案裡面規定了适應的時間配置檔案為/usr/share/zoneinfo/Asia/Shanghai,是以說這就是本地的時間了,此時Linux系統會以Shanghai那個時間配置檔案為準。
至于常用于時間伺服器與修改時間指令,主要有以下幾個:
/bin/date:用于Linux時間(軟體時間)的修改與顯示的指令。
/sbin/hwclock:用于BIOS時鐘(硬體時鐘)的修改與顯示的指令。這個指令隻有root才能執行,因為Linux系統上面的BIOS時間與Linux系統時間是分開的,是以使用date這個指令調整了時間之後,還需要使用hwclock才能将修改過後的時間寫入BIOS中。
/usr/sbin/ntpd:主要提供NTP服務的程式。配置檔案為/etc/ntp.conf
/usr/sbin/ntpdate:用于用戶端的時間校正,如果不啟用NTP而僅想要使用NTPclient功能的話,會用到這個指令。
2、主要配置檔案ntp.conf的處理
舉例配置
上層NTP伺服器共有 tock.stdtime.gov.tw , tick. stdtime.gov.tw ,time. stdtime.gov.tw 三台,其中以tock.stdtime.gov.tw最為優先使用。
不對internet提供服務,僅允許來自内部網絡912.168.100.0/24的查詢。
檢測BIOS時鐘與Linux系統時間的差異并寫入/var/lib/ntp/drift檔案中。
下面來看一下如何在ntp.conf中設定權限控制。
1)利用restrict來管理權限控制
restrict參數設定方式:
restrict [你的IP] mask [netmask_IP] [parameter]
其中parameter的參數主要有以下這些。
ignore:拒絕所有類型的NTP連接配接。
nomodify:用戶端不能使用ntpc與ntpq這兩個程式來修改伺服器的時間參數,但用戶端仍可通過這部主機進行網絡校時。
noquery:用戶端不能通過使用ntpq、ntpc等指令來查詢時間伺服器,等于不提供NTP的網絡校時。
notrap:不提供trap這個遠端事件登入(remote event logging)的功能。
notrust:拒絕沒有認證的用戶端。
如果沒有在parameter的地方加上任何參數的話,這表示“該IP或網段不受任何限制“。一般來說,我們可以先關閉NTP的權限,然後再一個一個地啟用允許登入的網段。
2)利用server設定上層NTP伺服器
上冊NTP伺服器的設定方式為:
server [IP or hostname] [prefer]
在server後端可以按接IP或主機名,最好用IP,防止修改主機名後的麻煩。那個prefer表示優先适用的伺服器。
3)以driftfile記錄時間差異
driftfile [可以被ntpd寫入的目錄或檔案]
因為預設的NTP Server本身的時間計算是依據BIOS的晶片時間振蕩周期頻率來計算的,但是這個數值與上層Time Server不見得一緻。是以NTP這個daemon(ntpd)會自動去計算我們的主機的頻率與上層Time Server的頻率,并且将兩個頻率的誤差記錄下來,記錄下來的檔案就是在driftfile後面的完整檔案名所指的檔案。關于檔案名必須要知道:
Driftfile後面接的檔案需要使用完整路徑檔案名。
該檔案不能是連結檔案。
該檔案所記錄的數值機關為百萬分之一秒(ppm)。
dirftfile 後面接的檔案會被ntpd自動更新,是以他的權限一定要能夠讓ntpd寫入才行。
4)keys[key_file]
除了restrict來限制用戶端的連接配接之外,我們也可以通過密匙系統來給用戶端認證,如此一來,可以讓主機端放心了。
[[email protected] jboss6]#vim /etc/ntp.conf
#1、先處理權限方面的問題,包括放行上層伺服器以及開放區域網路使用者來源
restrict default kod nomodify notrap nopeer noquery 拒絕IPv4的使用者
restrict -6 default kod nomodify notrap nopeer noquery 拒絕IPv6的使用者
restrict 220.130.158.71 放行tock.stdtime.gov.tw進入本NTP伺服器
restrict 59.124.196.83 放行tick. stdtime.gov.tw進入本NTP伺服器
restrict 59.124.196.84 放行time. stdtime.gov.tw進入本NTP伺服器
restrict 127.0.0.1 這兩個是預設值
restrict -6 ::1
restrict 192.168.10.0 mask 255.255.255.0 nomodify 放行區域網路來源
#2、設定主機來源,可以先把本來的下面這些内容注釋掉
# Use public servers from the pool.ntp.org project.
# Please consider joining the pool (http://www.pool.ntp.org/join.html).
#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
server 220.130.158.71 prefer 以這台主機最為優先
server 59.124.196.83
server 59.124.196.84
#3、預設時間差異分析檔案與咱不用的keys,不需要改變他
driftfile /var/lib/ntp/drift
keys /etc/ntp/keys
這樣就設定好了
3、NTP的啟動與觀察
#1、啟動NTP
[[email protected] zoneinfo]# /etc/init.d/ntpd start 啟動
Starting ntpd: [ OK ]
[[email protected] zoneinfo]# chkconfig ntpd on 設定開機啟動
[[email protected] zoneinfo]# tail /var/log/messages 檢視日志資訊
Jan 28 17:09:28 localhost ntpd[33990]: Deferring DNS for 1.rhel.pool.ntp.org 1
Jan 28 17:09:28 localhost ntpd[33990]: Deferring DNS for 2.rhel.pool.ntp.org 1
Jan 28 17:09:28 localhost ntpd[33990]: Deferring DNS for 3.rhel.pool.ntp.org 1
Jan 28 17:09:28 localhost ntpd[33990]: 0.0.0.0 c016 06 restart
Jan 28 17:09:28 localhost ntpd[33990]: 0.0.0.0 c012 02 freq_set kernel 0.000 PPM
Jan 28 17:09:28 localhost ntpd[33990]: 0.0.0.0 c011 01 freq_not_set
Jan 28 17:09:30 localhost ntpd_intres[33992]: host name not found: 0.rhel.pool.ntp.org
Jan 28 17:09:30 localhost ntpd_intres[33992]: host name not found: 1.rhel.pool.ntp.org
Jan 28 17:09:30 localhost ntpd_intres[33992]: host name not found: 2.rhel.pool.ntp.org
Jan 28 17:09:30 localhost ntpd_intres[33992]: host name not found: 3.rhel.pool.ntp.org
#2、檢視啟動的端口
[[email protected] zoneinfo]# netstat -tlunp | grep ntp
udp 0 0 192.168.211.128:123 0.0.0.0:* 33990/ntpd
udp 0 0 127.0.0.1:123 0.0.0.0:* 33990/ntpd
udp 0 0 0.0.0.0:123 0.0.0.0:* 33990/ntpd
udp 0 0 fe80::20c:29ff:fe82:6e49:123 :::* 33990/ntpd
udp 0 0 ::1:123 :::* 33990/ntpd
udp 0 0 :::123 :::* 33990/ntpd
#主要是UDP資料包,并且在port 123這個端口
這就表示我們的NTP伺服器已經啟動了不過要與上層NTP伺服器連接配接還需要一些時間,通常啟動NTP後約在15分鐘内才會和上層NTP伺服器順利連接配接上。那要如何确認我們的NTP伺服器已經順利地更新了自己的時間呢?
[[email protected] zoneinfo]# ntpstat 這是我自己的虛拟機,沒有上層伺服器
unsynchronised
time server re-starting
polling server every 8 s
[[email protected] zoneinfo]# ntpstat 鳥哥的例子
synchronized to NTP server (220.130.158.71) at stratum 3
time correct to within 538 ms
polling server every 128 s
這個指令可以列出我們的NTP伺服器是否已經與上層連接配接。由上述的輸出結果可以知道,時間已經校正約538ms,且每隔128秒會主動去更新時間。
[[email protected] zoneinfo]# ntpq –p
這個指令可以列出目前我們的NTP與相關上層NTP的狀态。
4、安全性設定
伺服器防火牆在UDP port 123上打開
[[email protected] zoneinfo]# vi /etc/sysconfig/iptables
iptables –A INPUT –I $EXTIF –p udp –s 192.168.100.0/24 –dport 123 –j ACCEPT
四、用戶端時間更新方式
1、Linux手動校時工作:date hwclock
date MMDDhhmmYYYYY 月份 日期 小時 分鐘 公元年
[[email protected] zoneinfo]# date 012809511016
date: cannot set date: Invalid argument
Sun Jan 28 09:51:00 LMT 1016
[[email protected] zoneinfo]#hwclock [-rw]
-r:read 讀出目前BIOS内的時間參數
-w:write,将目前的linux系統時間寫入BIOS中
查閱BIOS時間,并且寫入更改過的時間
[[email protected] zoneinfo]# date ;hwclock –r
[[email protected] zoneinfo]# hwclock –w;hwclock –r;date
[[email protected] zoneinfo]# date 012809572016
Thu Jan 28 09:57:00 CST 2016
[[email protected] zoneinfo]# date
Thu Jan 28 09:57:11 CST 2016
[[email protected] zoneinfo]# hwclock -r
Thu 28 Jan 2016 05:58:18 PM CST -0.283336 seconds
[[email protected] zoneinfo]# hwclock -w
[[email protected] zoneinfo]# hwclock -r
Thu 28 Jan 2016 09:57:30 AM CST -0.095152 seconds
[[email protected] zoneinfo]# date
Thu Jan 28 09:57:34 CST 2016
[[email protected] zoneinfo]#
2、Linux的網絡校時
因為NTP伺服器本來就會與上層時間伺服器進行時間的同步化,是以預設情況下,NTP伺服器不可以使用ntpdate。即ntpdate與ntpd不能同時啟用。
[[email protected] zoneinfo]#ntpdate 192.168.100.254 伺服器
用戶端最好也啟動一下NTP服務,通過NTP去主動的更新時間。
[[email protected] zoneinfo]#ntpdate 192.168.100.254
[[email protected] zoneinfo] #vi /etc/ntp.conf
restrict 192.168.100.254 放行伺服器來源
server 192.168.100.254 這就是伺服器
[[email protected] zoneinfo]#/etc/init.d/ntpd start
[[email protected] zoneinfo]#chkconfig ntpd on
這樣Client計算機就會主動到NTP伺服器上去更新時間了。
不這樣也可以
[[email protected] zoneinfo]#vi /etc/crontab
10 5 * * * root (/usr/sbin/ntpdate tock.ssdtime.gov.tw && /sbin/hwclock –w) &>/dev/null
這樣每天05:10LINUX系統就會自動進行網絡校時。
本文轉自aaa超超aaa 51CTO部落格,原文連結:http://blog.51cto.com/10983441/1739431