時間伺服器: NTP 伺服器及客戶端搭建 一. NTP 伺服器的安裝與設定 1. NTP 伺服器的安裝與設定前言 2. 所需軟體與軟體結構 3. 主要配置文件 ntp.conf 的處理 4. NTP 的啟動與觀察: ntpstat, ntpq 5. 安全性設定 1.NTP 伺服器的安裝與設定前言 N ...
時間伺服器: NTP 伺服器及客戶端搭建
一. NTP 伺服器的安裝與設定
1. NTP 伺服器的安裝與設定前言
2. 所需軟體與軟體結構
3. 主要配置文件 ntp.conf 的處理
4. NTP 的啟動與觀察: ntpstat, ntpq
5. 安全性設定
1.NTP 伺服器的安裝與設定前言
NTP 伺服器很容易就可以架設成功,不過這個軟體在不同的 distribution 上面可能有不一樣的名稱,要作的其實就是將他安裝起來之後,規定一部上層 NTP 伺服器來同步化你的時間即可啊!如果只是想要進行單部主機的時間同步化,不用架設 NTP ,直接使用 NTP 客戶端軟體即可!
2.所需軟體與軟體結構
*在 CentOS 6.x 上頭,所需要的軟體其實僅有 ntp 這個玩意兒而已,利用 yum install ntp 即可!不過,我們還需要時區相關的數據文件,所以你需要的軟體有:
ntp: 就是NTP伺服器的主要軟體啦,包括配置文件以及執行檔等等。
tzdata: 軟體名稱為『 Time Zone data 』的縮寫,提供各時區對應的顯示格式。
*與時間及 NTP 伺服器設定相關的配置文件與重要數據文件有底下幾個:
/etc/ntp.conf: 就是NTP伺服器的主要配置文件,也是唯一的一個;
/usr/share/zoneinfo/:由tzdata所提供,為各時區的時間格式對應檔。 例如臺灣地區的時區格式對應檔案在 /usr/share/zoneinfo/Asia/Taipei 就是了,這個目錄裡面的檔案與底下要談的兩個檔案 (clock 與 localtime) 是有關係;
/etc/sysconfig/clock:設定時區與是否使用UTC時間鐘的配置文件。每次開機後Linux會自動的讀取這個檔案來設定自己系統所預設要顯示的時間說!舉個例子來說, 在臺灣地區的本地時間設定中,這個檔案內應該會出現一行『ZONE="Asia/Taipei"』的字樣,這表示時間配置文件案要取用/usr/share/zoneinfo/Asia/Taipei 那個檔案的意思;
/etc/localtime:這個檔案就是『本地端的時間配置文件』,剛剛那個 clock 檔案裡面規定了使用的時間配置文件(ZONE)為/usr/share/zoneinfo/Asia/Taipei,所以說這就是本地端的時間了,此時Linux系統就會將Taipei那個檔案複製一份成為/etc/localtime,所以未來我們的時間顯示就會以Taipei那個時間配置文件案為準;
*至於在常用於時間伺服器與修改時間的指令方面,主要有底下這幾個啦:
/bin/date:用於 Linux 時間 (軟體時鐘) 的修改與顯示的指令;
/sbin/hwclock:用於BIOS時鐘(硬體時鐘)的修改與顯示的指令。這是一個 root 才能執行的指令,因為Linux系統上面BIOS時間與Linux系統時間是分開的,所以使用date這個指令調整了時間之後,還需要使用hwclock才能將修改過後的時間寫入 BIOS 當中;
/usr/sbin/ntpd:主要提供NTP服務的程式啰!配置文件為/etc/ntp.conf;
/usr/sbin/ntpdate:用於客戶端的時間校正,如果你沒有要啟用 NTP 而僅想要使用 NTP Client 功能的話,那麼只會用到這個指令而已;
測試用例:
假設你的筆記本電腦安裝CentOS這套系統,而且選擇的時區為臺灣。現在,你將有一個月的時間要出差到美國的紐約去,你會帶著這個筆電,那麼到了美國之後,時間會不一致啊!你該如何手動的調整時間參數呢?
解決方法:因為時區數據文件在/usr/share/zoneinfo內,在該目錄內會找到/usr/share/zoneinfo/America/New_York這個時區檔。而時區配置文件在/etc/sysconfig/clock,且目前的時間格式在 /etc/localtime ,所以應該這樣做:
[root@www ~]# date
Thu Jul 28 15:08:39 CST 2011 <==重點是 CST 這個時區喔!
[root@www ~]# vim /etc/sysconfig/clock
ZONE="America/New_York" <==改的是這裡啦!
[root@www ~]# cp/usr/share/zoneinfo/America/New_York/etc/localtime
[root@www ~]# date
Thu Jul 28 03:09:21 EDT 2011 <==時區與時間都改變了!
這個範例做完之後,記得將這兩個檔案改回.
3.主要配置文件 ntp.conf 的處理
由於 NTP 伺服器的設定需要有上游伺服器的支持才行,假設NTP 伺服器所需要設定的架構如下:
我的上層 NTP 伺服器共有tock.stdtime.gov.tw,tick.stdtime.gov.tw,time.stdtime.gov.tw 三部,其中以tock.stdtime.gov.tw最優先使用(prefer);
不對Internet提供服務,僅允許來自內部網域192.168.100.0/24的查詢而已;
偵測一些 BIOS 時鐘與 Linux 系統時間的差異並寫入/var/lib/ntp/drift 檔案當中。
先讓談一談如何在 ntp.conf 裡面設定許可權控制。利用 restrict 來管理許可權控制在 ntp.conf 檔案內可以利用『 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 的許可權,然後再一個一個的啟用允許登入的網段。
利用 server 設定上層 NTP 伺服器上層 NTP 伺服器的設定方式為:
server [IP or hostname] [prefer]
在server後端可以接IP或主機名,個人比較喜歡使用 IP 來設定說!至於那個 perfer 表示『優先使用』的伺服器。
以 driftfile 記錄時間差異設定的方式如下:
driftfile [可以被 ntpd 寫入的目錄與檔案]
因為預設的NTP Server本身的時間計算是依據BIOS的晶元震蕩周期頻率來計算的,但是這個數值與上層 Time Server 不見得會一致,所以 NTP 這個 daemon (ntpd) 會自動的去計算我們自己主機的頻率與上層 Time server 的頻率,並且將兩個頻率的誤差記錄下來,記錄下來的檔案就是在 driftfile 後面接的完整檔名當中了!
關於檔名:
driftfile 後面接的檔案需要使用完整路徑文件名;該檔案不能是連結檔;該檔案需要設定成ntpd這個daemon可以寫入的許可權。該檔案所記錄的數值單位為:百萬分之一秒 (ppm)。
driftfile 後面接的檔案會被 ntpd 自動更新,所以他的許可權一定要能夠讓 ntpd 寫入才行。在 CentOS 6.x 預設的 NTP 伺服器中,使用的 ntpd 的 owner 是 ntp ,這部份可以查閱 /etc/sysconfig/ntpd 就可以知道了。
關於keys:
keys [key_file]
除了以 restrict 來限制客戶端的聯機之外,我們也可以透過密鑰系統來給客戶端認證, 如此一來可以讓主機端更放心了。不過在這個章節裡面我們暫不討論這個部分,有興趣的朋友可以參考 ntp-keygen 這個指令的相關說明喔!
根據上面的說明,我們最終可以取得這樣的配置文件案內容:
(底下僅修改部分數據,保留大部分的設定值)
[root@www ~]# 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.100.0 mask 255.255.255.0 nomodify <==放行區網來源
# 2. 設定主機來源,請先將原本的 [0|1|2].centos.pool.ntp.org 的設定批註掉:
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
這樣就設定好了,準備來啟動 NTP 服務。
4.NTP 的啟動與觀察
設定完 ntp.conf 之後就可以啟動 ntp 伺服器了。啟動與觀察的方式如下:
# 1. 啟動 NTP
[root@www ~]# /etc/init.d/ntpd start
[root@www ~]# chkconfig ntpd on
[root@www ~]# tail /var/log/messages <==自行檢查看看有無錯誤
# 2. 觀察啟動的埠看看:
[root@www ~]# netstat -tlunp | grep ntp
Proto Recv-Q Send-Q Local Address Foreign Address PID/Program name
udp 0 0 192.168.100.254:123 0.0.0.0:* 3492/ntpd
udp 0 0 192.168.1.100:123 0.0.0.0:* 3492/ntpd
udp 0 0 127.0.0.1:123 0.0.0.0:* 3492/ntpd
udp 0 0 0.0.0.0:123 0.0.0.0:* 3492/ntpd
udp 0 0 ::1:123 :::* 3492/ntpd
udp 0 0 :::123 :::* 3492/ntpd
# 主要是 UDP 封包,且在 port 123 這個埠的了。
這樣就表示我們的 NTP 伺服器已經啟動了,不過要與上層 NTP 伺服器聯機則還需要一些時間, 通常啟動 NTP 後約在 15 分鐘內才會和上層 NTP 伺服器順利連接上。 那要如何確認我們的 NTP 伺服器有順利的更新自己的時間呢?你可以使用底下幾個指令來查閱 (請自行等待數分鐘後再以下列指令查閱):
[root@www ~]# ntpstat
synchronised to NTP server (220.130.158.71) at stratum 3
time correct to within 538 ms
polling server every 128 s
這個指令可以列出我們的NTP伺服器有跟上層聯機否。由上述的輸出結果可以知道,時間有校正約 538 * 10^(-3) 秒,且每隔64秒會主動去更新時間.
[root@www ~]# ntpq -p
remote refid st t when poll reach delay offset jitter
==============================================================================
*tock.stdtime.go 59.124.196.87 2 u 19 128 377 12.092 -0.953 0.942
+59-124-196-83.H 59.124.196.86 2 u 8 128 377 14.154 7.616 1.533
+59-124-196-84.H 59.124.196.86 2 u 2 128 377 14.524 4.354 1.079
這個 ntpq -p 可以列出目前我們的 NTP 與相關的上層 NTP 的狀態,上頭的幾個欄位的意義為:
remote:亦即是 NTP 主機的 IP 或主機名啰~註意最左邊的符號
如果有『 * 』代表目前正在作用當中的上層 NTP
如果是『 + 』代表也有連上線,而且可作為下一個提供時間更新的候選者。
refid:參考的上一層 NTP 主機的地址
st:就是 stratum 階層啰!
when:幾秒鐘前曾經做過時間同步化更新的動作;
poll:下一次更新在幾秒鐘之後;
reach:已經向上層 NTP 伺服器要求更新的次數
delay:網路傳輸過程當中延遲的時間,單位為 10^(-6) 秒
offset:時間補償的結果,單位與 10^(-3) 秒
jitter:Linux 系統時間與 BIOS 硬體時間的差異時間, 單位為 10^(-6) 秒。
事實上這個輸出的結果告訴我們,時間真的很準了!因為差異都在 0.001 秒以內, 可以符合我們的一般使用了。另外,你也可以檢查一下你的 BIOS 時間與 Linux 系統時間的差異,就是/var/lib/ntp/drift這個檔案的內容,就能瞭解到 Linux 系統時間與 BIOS 硬體時鐘到底差多久?單位為 10^(-6) 秒。
要讓你的 NTP Server/Client 真的能運作,在上述的動作中得註意:
上述的 ntpstat 以及 ntpq -p 的輸出結果中,你的NTP伺服器真的要能夠連結上層NTP才行,否則你的客戶端將無法對你的 NTP 伺服器進行同步更新的,這點很重要!
你的 NTP 伺服器時間不可與上層差異太多。舉例來說,我測試 NTP 伺服器約在 2011/7/28 下午, 如果我的伺服器時間原本是錯誤的 2015/11/11,差了幾年,其實超過不到一年上層伺服器就不會將正確的時間傳給我們! 這時就會造成困擾了!
伺服器防火牆在 UDP port 123 有沒有開,要特別註意!
等待的時間夠不夠長?設定 NTP 等過最久的時間可能會大約是一小時!
5.安全性設定
NTP 伺服器在安全的相關性方面,其實剛剛我們在 /etc/ntp.conf 裡面的 restrict 參數中就已經設定了 NTP 這個 daemon 的服務限制範圍了!不過,在防火牆 iptables 的部分,還是需要開啟聯機監聽的啦!所以,在你的 iptables 規則的 scripts 當中,需要加入這一段 (我是以開放 192.168.100.0/24 這個網域作為範例的!)
[root@www ~]# vim /usr/local/virus/iptables/iptables.allow
iptables -A INPUT -i $EXTIF -p udp -s 192.168.100.0/24 --dport 123 -j ACCEPT
[root@www ~]# /usr/local/virus/iptables/iptables.rule
若還要開放其他的網段或者客戶端主機,修改 /etc/ntpd.conf 以及防火牆機制即可!
二. 客戶端的時間更新方式
1. 客戶端的時間更新方式
2. Linux 手動校時工作: date, hwclock
3. Linux 的網路校時: ntpdate
4. 案例演示
1.客戶端的時間更新方式
上頭介紹了 NTP 伺服器的安裝與設定,如果我們僅有十部不到的主機時,老實說,實在沒有架設 NTP 伺服器的需求。 只要能夠在你的主機上頭以 NTP 客戶端軟體來進行網路校時就能夠同步化時間了,沒必要時時刻刻進行時間的校正吧, 但是,如果是類似一定要時間同步的叢集電腦群或登錄伺服器群,那就得要使用時間伺服器比較好.
2.Linux 手動校時工作: date, hwclock
軟體時鐘: Linux 自己的系統時間,由 1970/01/01 開始記錄的時間參數
硬體時鐘: 電腦系統在BIOS記錄的實際時間,這也是硬體所記錄的在軟體時鐘方面,我們可以透過date這個指令來進行手動修訂,但如果要修改BIOS 記錄的時間,就得要使用 hwclock 這個指令來寫入才行。
相關的用法如下:
[root@clientlinux ~]# date MMDDhhmmYYYY
選項與參數:
MM:月份
DD:日期
hh:小時
mm:分鐘
YYYY:公元年
# 1. 修改時間成為 1 小時後的時間該如何是好?
[root@clientlinux ~]# date
Thu Jul 28 15:33:38 CST 2011
[root@clientlinux ~]# date 072816332011
Thu Jul 28 16:33:00 CST 2011
# 這樣時間立刻就變成一個小時後了!
[root@clientlinux ~]# hwclock [-rw]
選項與參數:
-r :亦即 read ,讀出目前 BIOS 內的時間參數;
-w :亦即 write ,將目前的 Linux 系統時間寫入 BIOS 當中啊!
# 2. 查閱 BIOS 時間,並且寫入更改過的時間啰!
[root@clientlinux ~]# date; hwclock -r
Thu Jul 28 16:34:00 CST 2011
Thu 28 Jul 2011 03:34:57 PM CST -0.317679 seconds
# 看一看,是否剛好差異約一個小時!這就是 BIOS 時間!
[root@clientlinux ~]# hwclock -w; hwclock -r; date
Thu 28 Jul 2011 04:35:12 PM CST -0.265656 seconds
Thu Jul 28 16:35:11 CST 2011
# 這樣就寫入,所以軟體時鐘與硬體時鐘就同步!
這樣可以瞭解當我們進行完 Linux 時間的校時後,還需要以 hwclock 來更新 BIOS 的時間,因為每次重新啟動的時候,系統會重新由 BIOS 將時間讀出來,所以,BIOS才是重要的時間依據。
3.Linux 的網路校時
在 Linux 的環境當中可利用 NTP 的客戶端程式,亦即是 ntpdate 這支程式就能夠進行時間的同步化。 不過你要知道的是,因為 NTP 伺服器本來就會與上層時間伺服器進行時間的同步化, 所以在預設的情況下,NTP 伺服器不可以使用 ntpdate !也就是說 ntpdate 與 ntpd 不能同時啟用的。 所以你不要在 NTP server 上頭執行這個指令,我們就來看看如何處理吧:
[root@clientlinux ~]# ntpdate [-dv] [NTP IP/hostname]
選項與參數:
-d :進入除錯模式 (debug) ,可以顯示出更多的有效信息。
-v :有較多訊息的顯示。
[root@clientlinux ~]# ntpdate 192.168.100.254
28 Jul 17:19:33 ntpdate[3432]: step time server 192.168.100.254 offset -2428.396146 sec
# 最後面會顯示微調的時間有多少 (offset),因為這部主機時間差很多,所以秒數...
[root@clientlinux ~]# date; hwclock -r
四 7月 28 17:20:27 CST 2011
公元2011年07月28日 (周四) 18時19分26秒 -0.752303 seconds
# 這裡還得 hwclock -w 寫入 BIOS 時間才行!
[root@clientlinux ~]# vim /etc/crontab
# 加入這一行去!
10 5 * * * root (/usr/sbin/ntpdate tock.stdtime.gov.tw && /sbin/hwclock -w) &> /dev/null
使用 crontab 之後,每天 5:10 Linux 系統就會自動的進行網路校時啰!相當的簡易,不過,這個方式僅適合不要啟動 NTP 的情況。如果你的機器數量太多了,那麼客戶端最好也啟動一下 NTP 服務!透過 NTP 去主動的更新時間吧!如何達成這個動作呢?也很簡單啊,修改 /etc/ntp.conf 即可:
[root@clientlinux ~]# ntpdate 192.168.100.254
# 由於 ntpd 的 server/client 之間的時間誤差不允許超過 1000 秒,
# 因此你得先手動進行時間同步,然後再設定與啟動時間伺服器。
[root@clientlinux ~]# vim /etc/ntp.conf
#server 0.centos.pool.ntp.org
#server 1.centos.pool.ntp.org
#server 2.centos.pool.ntp.org
restrict 192.168.100.254 <==放行伺服器來源!
server 192.168.100.254 <==這就是伺服器!
# 很簡單,就是將原本的 server 項目批註,加入我們要的伺服器即可
[root@clientlinux ~]# /etc/init.d/ntpd start
[root@clientlinux ~]# chkconfig ntpd on
然後取消掉crontab的更新程式,這樣你的client電腦就會主動的到NTP伺服器去更新。不過針對客戶端來說,我還是比較習慣使用crontab的方式來處理就是了,這種方式同樣很通用,效果也不錯。
4.案例演示
讓我們來做個實際演練,在練習之前,請將伺服器的 NFS 設定數據都清除,但是保留 rpcbind 不可關閉。至於客戶端的環境下, 先關閉 autofs 以及取消之前在 /etc/rc.d/rc.local 裡面寫入的開機自動掛載項目。同時刪除 /home/nfs 目錄呦! 接下來請看看我們要處理的環境為何:
模擬的環境狀態中,伺服器端的想法如下:
假設伺服器的 IP 為 192.168.100.254 這一部;
/tmp 分享為可擦寫,並且不限制使用者身份的方式,分享給所有 192.168.100.0/24 這個網域中的所有電腦;
/home/nfs 分享的屬性為只讀,可提供除了網域內的工作站外,向 Internet 亦提供數據內容;
/home/upload 做為 192.168.100.0/24 這個網域的數據上傳目錄,其中,這個 /home/upload 的使用者及所屬群組為 nfs-upload 這個名字,他的 UID 與 GID 均為 210;
/home/andy 這個目錄僅分享給 192.168.100.10 這部主機,以提供該主機上面 andy 這個使用者來使用,也就是說, andy 在 192.168.100.10 及 192.168.100.254 均有賬號,且賬號均為 andy ,所以預計開放 /home/andy 給 andy 使用他的家目錄.
伺服器端設定的實地演練:
首先,就是要建立 /etc/exports 這個檔案的內容.
[root@www ~]# vim /etc/exports
/tmp 192.168.100.0/24(rw,no_root_squash)
/home/nfs 192.168.100.0/24(ro) *(ro,all_squash)
/home/upload 192.168.100.0/24(rw,all_squash,anonuid=210,anongid=210)
/home/andy 192.168.100.10(rw)
再建立每個對應的目錄的實際 Linux 許可權,我們一個一個來看:
# 1. /tmp
[root@www ~]# ll -d /tmp
drwxrwxrwt. 12 root root 4096 2011-07-27 23:49 /tmp
# 2. /home/nfs
[root@www ~]# mkdir -p /home/nfs
[root@www ~]# chmod 755 -R /home/nfs
# 修改較為嚴格的檔案許可權將目錄與檔案設定成只讀!不能寫入的狀態,會更保險一點!
# 3. /home/upload
[root@www ~]# groupadd -g 210 nfs-upload
[root@www ~]# useradd -g 210 -u 210 -M nfs-upload
# 先建立對應的賬號與組名及 UID 喔!
[root@www ~]# mkdir -p /home/upload
[root@www ~]# chown -R nfs-upload:nfs-upload /home/upload
# 修改擁有者!如此,則用戶與目錄的許可權都設定妥當啰!
# 4. /home/andy
[root@www ~]# useradd andy
[root@www ~]# ll -d /home/andy
drwx------. 4 andy andy 4096 2011-07-28 00:15 /home/andy
這樣一來,許可權的問題大概就可以解決了!
重新啟動 nfs 服務:
[root@www ~]# /etc/init.d/nfs restart
在 192.168.100.10 這部機器上面演練一下:
# 1. 確認遠程伺服器的可用目錄:
[root@clientlinux ~]# showmount -e 192.168.100.254
Export list for 192.168.100.254:
/home/andy 192.168.100.10
/home/upload 192.168.100.0/24
/home/nfs (everyone)
/tmp 192.168.100.0/24
# 2. 建立掛載點:
[root@clientlinux ~]# mkdir -p /mnt/{tmp,nfs,upload,andy}
# 3. 實際掛載:
[root@clientlinux ~]# mount -t nfs 192.168.100.254:/tmp /mnt/tmp
[root@clientlinux ~]# mount -t nfs 192.168.100.254:/home/nfs /mnt/nfs
[root@clientlinux ~]# mount -t nfs 192.168.100.254:/home/upload /mnt/upload
[root@clientlinux ~]# mount -t nfs 192.168.100.254:/home/andy /mnt/andy
整個步驟大致上就是這樣.