OpenNTPD - 架設時間校對伺服器

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 對時。
  1. 下載 http://www.stdtime.gov.tw/chinese/EXE/NTPClock.exe,並安裝它
  2. 在【時間伺服器】欄位上填上 FreeBSD NTP Server IP Address --> 按下【增加】
  3. 勾選【信任未同步伺服器時間】
  4. 預設為一個小時跟指定的 NTP Server 對時若想馬上對時可按下【立即查尋主機時間】
  5. 有關於 NTPClock 軟體的操作可參考 標準時間網路校時客戶端程式 (NTPClock) 操作說明



7、參考




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 中也有人討論到這個問題。