1、前言
OpenNTPD 是 OpenBSD 的子計劃之一其目標就是提供一個安全的 NTP Service;當您的區網有許多伺服器,而每一台伺服器各自去和 stratum 1/2 public ntp servers 對時是浪費網路資源且不智的做法。較好的作法是 DMZ 裡一、二台伺服器 (屆時擔任 NTP Server 角色) 和外面 stratum 1/2 ntp servers 對時,而其它 DMZ 或 LAN 的機器 (屆時擔任 NTP Client 角色) 與之對時。
文章目錄
1、前言2、實作環境
3、NTP Server 設定
步驟1.安裝 openntpd
步驟2.設定 ntp.conf
步驟3.修改 /etc/rc.conf、syslog.conf
步驟4.啟動 openntpd 服務
步驟5.查看 openntpd.log
4、NTP Client 設定 (FreeBSD)
步驟1.安裝 openntpd
步驟2.設定 ntp.conf
步驟3.修改 /etc/rc.conf、syslog.conf
步驟4.啟動 openntpd 服務
步驟5.查看 openntpd.log
5、NTP Client 設定 (Solaris 9)
步驟1.設定 ntp.conf
步驟2.建立相關檔案 ntp.drift、ntp.log
步驟3.啟動 xnptd 服務
步驟4.查看 ntp.log、messages
6、NTP Client 設定 (Windows)
7、參考
8、Me FAQ
Q1.openntpd.log 內沒有任何訊息寫入?
Q2.啟動 openntpd 服務失敗 fatal: bad privsep dir permissions?
Q3.無法與 OpenNTPD 時間伺服器對時 Server dropped: Leap not in sync?
2、實作環境
- FreeBSD 7.2-RELEASE-p3
- openntpd-4.4,2
- NTPClock.exe (Windows NTP Client UI Software)
3、NTP Server 設定
步驟 1. 安裝 openntpd
安裝過程中系統會自動幫您新增 _ntp 這個 user、group,而屆時也會以這個帳號來啟動 openntpd 服務。# cd /usr/ports/net/openntpd //切換至安裝路徑
# make install clean //安裝並清除暫存檔案
步驟 2. 設定 ntp.conf
修改 NTP 設定檔 ntpd.conf 將離您地區較近的時間校對伺服器加入 (此例為填入台灣及亞洲時間校對伺服器)。# vi /usr/local/etc/ntpd.conf //修改 openntpd 設定檔
listen on 192.168.1.10 //指定屆時 openntpd 的 IP
server tick.stdtime.gov.tw //指定 Time Server
server tock.stdtime.gov.tw
server clock.stdtime.gov.tw
server watch.stdtime.gov.tw
server time.stdtime.gov.tw
server ntp.ntu.edu.tw
server 3.tw.pool.ntp.org
server 1.asia.pool.ntp.org
server 3.asia.pool.ntp.org
步驟 3. 修改 /etc/rc.conf、syslog.conf
修改 /etc/rc.conf 以便系統重新開機時能自動啟動 openntpd 服務。# vi /etc/rc.conf
openntpd_enable="YES"
修改 /etc/syslog.conf 以便讓我們隨時檢查 NTP Server 去跟外面 Time Server 對時及調整本機時間的訊息。
# vi /etc/syslog.conf
ntp.info /var/log/openntpd.log
加入上列一行後我們先建立 openntpd.log 這個空檔後在 reload syslogd 服務。
# touch /var/log/openntpd.log //建立 openntpd.log 空檔
# /etc/rc.d/syslogd reload //重新載入 syslogd 服務
步驟 4. 啟動 openntpd 服務
依如下方式啟動 openntpd 服務。# /usr/local/etc/rc.d/openntpd.sh start //啟動 openntpd 服務
Starting openntpd.
檢查 openntpd 服務是否啟動成功。
# ps ax |grep ntpd
72621 ?? Is 0:00.00 ntpd: [priv] (ntpd)
72622 ?? S 0:00.16 ntpd: ntp engine (ntpd)
73161 p3 R+ 0:00.00 grep ntpd
啟動成功後可發現內部的 NTP Server (192.168.1.10) 已經開始跟外面的 Time Server 連接。
# sockstat |grep ntpd
_ntp ntpd 72622 3 dgram -> /var/run/logpriv
_ntp ntpd 72622 4 udp4 192.168.1.10:54512 220.130.158.51:123
_ntp ntpd 72622 5 stream -> ??
_ntp ntpd 72622 6 udp4 192.168.1.10:123 *:*
_ntp ntpd 72622 7 udp4 192.168.1.10:51987 220.130.158.71:123
_ntp ntpd 72622 8 udp4 192.168.1.10:49509 220.130.158.72:123
_ntp ntpd 72622 9 udp4 192.168.1.10:62446 220.130.158.54:123
_ntp ntpd 72622 10 udp4 192.168.1.10:51543 192.115.133.35:123
_ntp ntpd 72622 11 udp4 192.168.1.10:58900 140.112.4.189:123
_ntp ntpd 72622 12 udp4 192.168.1.10:62115 61.70.206.117:123
_ntp ntpd 72622 13 udp4 192.168.1.10:52513 60.56.119.79:123
_ntp ntpd 72622 14 udp4 192.168.1.10:56684 220.130.158.52:123
root ntpd 72621 3 dgram -> /var/run/logpriv
root ntpd 72621 4 stream -> ??
使用 ntptrace 指令來了解內部的 NTP Server (192.168.1.10) 與外部 Time Server 對時狀況
# ntptrace 220.130.158.72
220-130-158-72.HINET-IP.hinet.net: stratum 2, offset 0.002189, root distance 0.012691
或使用 ntpq 指令來了解內部的 NTP Server (192.168.1.10) 與外部 Time Server 對時狀況
# ntpq -p 220.130.158.72
remote refid st t when poll reach delay offset jitter
==========================================================
+220-130-158-50. .IRIG. 1 u 187 1024 231 20.874 -0.271 499.767
*220-130-158-70. .IRIG. 1 u 492 1024 67 12.691 2.189 0.957
+220-130-158-51. 220.130.158.50 2 u - 1024 167 75.498 28.432 13.156
220-130-158-71. 220.130.158.50 2 u - 1024 377 1.329 -3.495 0.151
步驟 5. 查看 openntpd.log
我們可以查看剛才設定的 openntpd.log 來了解目前本機的時間校對情況 (大約 3 ~ 5 分鐘調整 1 秒),基本上 openntpd 是慢慢調整時間,若您想一次就調整好可以利用 -s 來一次把時間調到標準 (有可能會出事?),出現 now valid 表示該台 Time Server 有效。# tail /var/log/openntpd.log
Jul 31 15:09:46 mybsd ntpd[72622]: listening on 192.168.1.10
Jul 31 15:09:46 mybsd ntpd[72622]: ntp engine ready
Jul 31 15:10:03 mybsd ntpd[72622]: peer 220.130.158.72 now valid
Jul 31 15:10:04 mybsd ntpd[72622]: peer 61.70.206.117 now valid
Jul 31 15:10:06 mybsd ntpd[72622]: peer 220.130.158.52 now valid
Jul 31 15:11:06 mybsd ntpd[72621]: adjusting local clock by 454.400335s
Jul 31 15:15:25 mybsd ntpd[72621]: adjusting local clock by 453.485940s
Jul 31 15:18:56 mybsd ntpd[72621]: adjusting local clock by 452.473868s
Jul 31 15:22:45 mybsd ntpd[72621]: adjusting local clock by 451.561672s
Jul 31 15:26:03 mybsd ntpd[72621]: adjusting local clock by 450.369801s
Jul 31 15:29:52 mybsd ntpd[72621]: adjusting local clock by 449.532482s
Jul 31 15:33:40 mybsd ntpd[72621]: adjusting local clock by 448.585979s
4、NTP Client 設定 (FreeBSD)
步驟 1. 安裝 openntpd
安裝過程中系統會自動幫您新增 _ntp 這個 user、group,屆時也會以這帳號來啟動 openntpd 服務。# cd /usr/ports/net/openntpd //切換至安裝路徑
# make install clean //安裝並清除暫存檔案
步驟 2. 設定 ntp.conf
修改 NTP 設定檔 ntp.conf 將內部的 NTP Server IP Address 加入# vi /usr/local/etc/ntp.conf //修改 openntpd 設定檔
server 192.168.1.10 //指定內部的 NTP Server IP
步驟 3. 修改 /etc/rc.conf、syslog.conf
修改 /etc/rc.conf 以便重開機時能自動載入 openntpd 服務# vi /etc/rc.conf
openntpd_enable="YES"
修改 /etc/syslog.conf 以便讓我們了解跟內部 NTP Server 對時及調整本機時間的訊息
# vi /etc/syslog.conf
ntp.info /var/log/openntpd.log
建立 openntpd.log 這個空檔後在 reload syslogd 服務
# touch /var/log/openntpd.log //建立 openntpd.log 空檔
# /etc/rc.d/syslogd reload //重新載入 syslogd 服務
步驟 4. 啟動 openntpd 服務
依如下方式啟動 openntpd 服務# /usr/local/etc/rc.d/openntpd.sh start //啟動 openntpd 服務
Starting openntpd.
檢查 openntpd 服務是否啟動成功
# ps ax |grep ntpd
5500 ?? Is 0:00.01 ntpd: [priv] (ntpd)
5501 ?? I 0:00.02 ntpd: ntp engine (ntpd)
5524 p0 R+ 0:00.00 grep ntpd
可發現有去跟內部的 NTP Server (192.168.1.10) 連接
# sockstat |grep ntpd
_ntp ntpd 5501 3 dgram -> /var/run/logpriv
_ntp ntpd 5501 4 udp4 172.18.1.12:63701 192.168.1.10:123
_ntp ntpd 5501 5 stream -> ??
root ntpd 5500 3 dgram -> /var/run/logpriv
root ntpd 5500 4 stream -> ??
步驟 5. 查看 openntpd.log
我們可以查看剛才設定的 openntpd.log 來了解目前本機的時間校對情況 (大約 3 ~ 5 分鐘調整 1 秒),基本上 openntpd 是慢慢調整時間,若您想一次就調整好可以利用 -s 來一次把時間調到標準 (有可能會出事?)# tail /var/log/openntpd.log
Aug 1 17:21:08 testbsd ntpd[5443]: ntp engine exiting
Aug 1 17:21:08 testbsd ntpd[5442]: Terminating
Aug 1 17:21:08 testbsd ntpd[5501]: ntp engine ready
Aug 1 17:21:30 testbsd ntpd[5501]: peer 192.168.1.10 now valid
Aug 1 17:22:24 testbsd ntpd[5500]: adjusting local clock by 398.739917s
Aug 1 17:25:39 testbsd ntpd[5500]: adjusting local clock by 397.073363s
5、NTP Client 設定 (Solaris 9)
步驟 1. 設定 ntp.conf
修改 NTP 設定檔 ntp.conf 將內部的 NTP Server IP Address 加入。# cd /etc/inetd ; cp ntp.client ntp.conf //複製 ntp client 範例檔來修改
# vi ntp.conf //加入如下三行
server 192.168.1.10 //指定內部的 NTP Server IP
driftfile /var/ntp/ntp.drift //記載 System Clock 性能
logfile /var/ntp/ntp.log //指定時間校對記錄檔路徑
步驟 2. 建立相關檔案 ntp.drift、ntp.log
利用 touch 指令建立屆時存取時間校對存放訊息檔案。# touch /var/ntp/ntp.drift //屆時存放 System Clock 性能記錄檔
# touch /var/ntp/ntp.log //屆時存放時間校對記錄檔
步驟 3. 啟動 xnptd 服務
執行如下指令來啟動 xnptd 服務。# /etc/init.d/xntpd start //啟動 xnptd 服務
檢查 xntpd 服務是否啟動成功
# ps -ef |grep ntpd
root 9715 1 0 15:57:23 ? 0:00 /usr/lib/inet/xntpd
使用 ntpq 指令來了解跟內部 NTP Server (192.168.1.10) 對時狀況
# ntpq -p
remote refid st t when poll reach delay offset disp
==========================================================
*192.168.1.10 220.130.158.51 3 u 21 64 377 0.46 1.764 0.23
使用 ntptrace 指令來了解跟內部 NTP Server (192.168.1.10) 對時狀況
# ntptrace -n 127.0.0.1
127.0.0.1: stratum 4, offset 0.000028, synch distance 0.01624
192.168.1.10: stratum 3, offset 0.001898, synch distance 0.00569
220.130.158.51: stratum 2, offset 0.020941, synch distance 0.03044
220.130.158.50: stratum 1, offset 0.180524, synch distance 1.00000, refid 'IRIG'
使用 snoop 指令來了解跟內部 NTP Server (192.168.1.10) 對時狀況
# snoop |grep -i ntp
Using device /dev/bge0 (promiscuous mode)
192.168.1.11 -> 192.168.1.10 NTP client (Wed Aug 1 11:41:34 2007)
192.168.1.10 -> 192.168.1.11 NTP server (Wed Aug 1 11:41:34 2007)
步驟 4. 查看 ntp.log、messages
查看 /var/ntp/ntp.log 來了解跟內部 NTP Server (192.168.1.10) 對時狀況。# tail /var/ntp/ntp.log
1 Aug 16:01:39 xntpd[9715]: synchronized to 192.168.1.10 , stratum=3
1 Aug 12:47:43 xntpd[8605]: time reset (step) 171.638805 s
查看 /var/ntp/ntp.log 來了解跟內部 NTP Server (192.168.1.10) 對時狀況。
# tail -f /var/adm/messages |grep ntp
Aug 1 14:53:58 sundev ntpdate[9394]: [ID 558275 daemon.notice] adjust time server 192.168.1.10 offset 0.004170 sec
Aug 1 14:54:00 sundev xntpd[9396]: [ID 702911 daemon.notice] xntpd 3-5.93e Mon Sep 20 15:47:11 PDT 1999 (1)
Aug 1 14:54:00 sundev xntpd[9396]: [ID 301315 daemon.notice] tickadj = 5, tick = 10000, tvu_maxslew = 495, est. hz = 100
Aug 1 14:54:00 sundev xntpd[9396]: [ID 798731 daemon.notice] using kernel phase-lock loop 0041
6、NTP Client 設定 (Windows)
我們可使用 國家時間與頻率標準實驗室 的 NTP 校時軟體(目前最新版本為 V2.1) 來讓 Windows 機器也能跟 FreeBSD 所架設的 NTP Server 對時。- 下載 http://www.stdtime.gov.tw/chinese/EXE/NTPClock.exe,並安裝它
- 在【時間伺服器】欄位上填上 FreeBSD NTP Server IP Address --> 按下【增加】
- 勾選【信任未同步伺服器時間】
- 預設為一個小時跟指定的 NTP Server 對時若想馬上對時可按下【立即查尋主機時間】
- 有關於 NTPClock 軟體的操作可參考 標準時間網路校時客戶端程式 (NTPClock) 操作說明
7、參考
- 潛艦 | http://to2100.idv.tw , Network Lab@FreeBSD . » FreeBSD Openntpd
- Setup OpenNTPD - OSWikiHK
- OpenNTPD Org
- When {Puffy} Meets ^RedDevil^: FreeBSD Openntpd
- Configuring OpenNTPD on OpenBSD 3.7
- ports/114191: (patch) net/openntpd should use syslog facility LOG_NTP
8、Me FAQ
Q1. openntpd.log 內沒有任何訊息寫入?
Error Message:當我啟動 openntpd 服務想查看 openntpd.log 時,但該 log 內容都是 空 的
Ans:
請確定以下事項
- 修改完 /etc/syslog.conf 後是否有 reload syslogd
- 試著 restart openntpd service
- 使用 openntpd-3.9px 版本的話請注意下列版本差別
- openntpd-3.9p1,2: 請設定 daemon.info /var/log/openntpd.log
- openntpd-3.9p1_1,2: 請設定 ntp.info /var/log/openntpd.log
若還是沒有訊息寫入指定的 log 內就設定為輸出 all.log 看看是否 ok,之前碰到的問題是修改 syslogd 寫 daemon.info 但 log 內容都是空的,看了這篇後 ports/114191: (patch) net/openntpd should use syslog facility LOG_NTP 改為 ntp.info 後 log 就有訊息寫入了。
Q2. 啟動 openntpd 服務失敗 fatal: bad privsep dir permissions?
Error Message:安裝 openntpd 於 CentOS 主機上啟動 openntpd 服務失敗並且出現如下錯誤訊息
# service openntpd start
Starting ntpd: [ OK ]
# service openntpd status
ntpd dead but subsys locked
# tail /var/log/messages
Jun 20 09:32:34 centos5 ntpd[16938]: fatal: bad privsep dir permissions //目錄權限錯誤 (/var/empty/ntp)
Jun 20 09:32:34 centos5 ntpd[16937]: dispatch_imsg in main: pipe closed
Jun 20 09:32:34 centos5 ntpd[16937]: Terminating
Ans:
從上述的錯誤訊息得知是 fatal: bad privsep dir permissions 目錄權限錯誤 (/var/empty/ntp),將該目錄權限改為 root 後 openntpd 服務便可正常啟動。
# ll /var/empty/ntp
drwx------ 3 _ntp _ntp 4096 Jun 20 09:09 ntp
# chown root /var/empty/ntp
# service openntpd start
Starting ntpd: [ OK ]
# service openntpd status
ntpd (pid 21696) is running...
Q3. 無法與 OpenNTPD 時間伺服器對時 Server dropped: Leap not in sync?
Error Message:當 OpenNTPD 時間伺服器上線並且都跟網際網路上的 NTP 時間伺服器對時正常後想要跟它對時,卻一直得到如下的錯誤訊息說無法跟 OpenNTPD 對時。
4 Jul 16:26:10 ntpdate[16856]: no server suitable for synchronization found
若是想 OpenNTPD 時間伺服器服務重新啟動則一開始會得到下列錯誤訊息表示 OpenNTPD 還沒開始進行對時 (Server dropped: strata too high) 因此不提供對時服務。
# ntpdate -d ntp.weithenn.org
transmit(ntp.weithenn.org)
receive(ntp.weithenn.org)
ntp.weithenn.org: Server dropped: strata too high
server ntp.weithenn.org, port 123
stratum 3, precision -21, leap 11, trust 000
refid [ntp.weithenn.org], delay 0.02562, dispersion 0.00005
transmitted 4, in filter 4
reference time: d1bbfe9f.6c6997ff Mon, Jul 4 2011 16:55:59.423
originate timestamp: d1bc00f2.35ce57ff Mon, Jul 4 2011 17:05:54.210
transmit timestamp: d1bc00f2.35c673b5 Mon, Jul 4 2011 17:05:54.210
filter delay: 0.02562 0.02592 0.02571 0.02573
0.00000 0.00000 0.00000 0.00000
filter offset: -0.00000 0.000152 0.000042 0.000054
0.000000 0.000000 0.000000 0.000000
delay 0.02562, dispersion 0.00005
offset -0.000001
4 Jul 17:05:54 ntpdate[18208]: no server suitable for synchronization found
經過幾分鐘後仍然後無法對時不過得到的錯誤訊息有點不同,也就是 OpenNTPD 時間伺服器尚未完成時間校對 (Server dropped: Leap not in sync)' 因此不提供對時服務。
# ntpdate -d ntp.weithenn.org
transmit(ntp.weithenn.org)
receive(ntp.weithenn.org)
ntp.weithenn.org: Server dropped: Leap not in sync
server ntp.weithenn.org, port 123
stratum 3, precision -21, leap 11, trust 000
refid [ntp.weithenn.org], delay 0.02573, dispersion 0.00000
transmitted 4, in filter 4
reference time: d1bbfe9f.6c6997ff Mon, Jul 4 2011 16:55:59.423
originate timestamp: d1bc0073.863ebfff Mon, Jul 4 2011 17:03:47.524
transmit timestamp: d1bc0073.4552c16d Mon, Jul 4 2011 17:03:47.270
filter delay: 0.02586 0.02573 0.02574 0.02574[ 0.00000 0.00000 0.00000 0.00000 filter offset: 0.253520 0.253535 0.253532 0.253529 0.000000 0.000000 0.000000 0.000000 delay 0.02573, dispersion 0.00000 offset 0.253535 4 Jul 17:03:47 ntpdate[18208]: no server suitable for synchronization found
Ans:
原因在於此台主機是裝在 VMware vSphere 內的虛擬主機,有在 /boot/loader.conf 設定檔內加入 Kern.hz="100" 參數防止 FreeBSD 運作於 VM 時會有時間異常變慢的問題,但此參數卻造成 FreeBSD 成為 OpenNTPD 時間伺服器時的阻礙,請將此參數拿掉 (主機需要重新開機才會生效) 並且指定對時的網際網路 NTP 伺服器不要太多筆即可,待 OpenNTPD 服務運作一段時間後您可以看到 /var/log/openntpd 記錄檔內出現 ntpd[792]: clock is now synced 字眼表示 OpenNTPD 對時完成,此時 NTP Client 再去對時便可成功!!
# tail -f /var/log/openntpd
Jul 5 12:25:07 ntp ntpd[1217]: listening on ntp.weithenn.org
Jul 5 12:25:07 ntp ntpd[1217]: ntp engine ready
Jul 5 12:25:26 ntp ntpd[1217]: peer 220.130.158.72 now valid
Jul 5 12:25:28 ntp ntpd[1217]: peer 59.124.196.84 now valid
Jul 5 12:26:21 ntp ntpd[1216]: adjusting local clock by -0.523646s
Jul 5 12:26:25 ntp ntpd[1216]: clock is now synced
此時 NTP Client 再次嘗試對時即可成功!! 雖然如此不建議將 OpenNTPD 時間服務運作於虛擬主機上,原因是因為虛擬主機使用的 CPU 資源會隨著 Host 的負載而受到影響因此會連帶影響到身為虛擬主機的時間運作,因此建議虛擬主機只要透過所安裝 VMware Tools 跟 Host 進行對時即可,再 openntpd on openbsd on esx 中也有人討論到這個問題。