29.11. NTP 時間校對

隨著使用時間,電腦的時鐘會逐漸偏移,這對需要網路上電腦有相同準確度時間的許多網路服務來說是一個大問題。準確的時間同樣能確保檔案時間戳記的一致性。網路時間協定 (Network Time Protocol, NTP) 是一種在網路上可以確保時間準確的方式。

FreeBSD 內含 ntpd(8) 可設定來查詢其他 NTP 伺服器來同步電腦的時間或提供時間服務給其他在網路上的電腦。

本節將會介紹如何設定 FreeBSD 上的 ntpd,更進一步的說明文件可於 /usr/share/doc/ntp/ 找到 HTML 格式的版本。

29.11.1. NTP 設定

在 FreeBSD,內建的 ntpd 可用來同步系統的時間,Ntpd 要使用 rc.conf(5) 中的變數以及下一節會詳細說明的 /etc/ntp.conf 來設定。

Ntpd 與網路中各節點的通訊採用 UDP 封包,在伺服器與 NTP 各節點間的防火牆必須設定成可允許進/出埠 123 的 UDP 封包。

29.11.1.1. /etc/ntp.conf

Ntpd 會讀取 /etc/ntp.conf 來得知要從那些 NTP 伺服器查詢時間,建議可設定多個 NTP 伺服器,來避免萬一其中一個伺服器無法連線或是時間不可靠的問題,當 ntpd 收到回應,它會偏好先採用較可信賴的伺服器。查詢的伺服器可以是來自本地網路的 ISP 所提供,也可從線上可公開存取的NTP 伺服器清單中挑選,您可以選擇一個離您地理位置較近的伺服器並閱讀它的使用規則。也有 可公開存取的 NTP 池線上清單可用,由一個地理區域所組織,除此之外 FreeBSD 提供了計劃贊助的伺服器池,0.freebsd.pool.ntp.org

範例 29.4. /etc/ntp.conf 範例

這份簡單的 ntp.conf 範例檔可以放心的使用,其中包含了建議的 restrict 選項可避免伺服器被公開存取。

# Disallow ntpq control/query access.  Allow peers to be added only
# based on pool and server statements in this file.
restrict default limited kod nomodify notrap noquery nopeer
restrict source  limited kod nomodify notrap noquery

# Allow unrestricted access from localhost for queries and control.
restrict 127.0.0.1
restrict ::1

# Add a specific server.
server ntplocal.example.com iburst

# Add FreeBSD pool servers until 3-6 good servers are available.
tos minclock 3 maxclock 6
pool 0.freebsd.pool.ntp.org iburst

# Use a local leap-seconds file.
leapfile "/var/db/ntpd.leap-seconds.list"

這個檔案的格式在 ntp.conf(5) 有詳細說明,以下的說明僅快速的帶過以上範例檔有用到的一些關鍵字。

預設 NTP 伺服器是可以被任何網路主機所存取,restrict 關鍵字可以控制有那些系統可以存取伺服器。restrict 支援設定多項,每一項可再更進一步調整前面所做的設定。範例中的設定授權本地系統有完整的查詢及控制權限,而遠端系統只有查詢時間的權限。要了解更詳細的資訊請參考 ntp.conf(5) 中的 Access Control Support 一節。

server 關鍵字可指定要查詢的伺服器,設定檔中可以使用多個 server 關鍵字,一個伺服器列一行。pool 關鍵字可指定伺服器池,Ntpd 會加入該伺服器池中的一或多台伺服器,直到數量滿足 tos minclock 的設定。iburst 關鍵字會指示 ntpd 在建立連線時執行 8 連發快速封包交換,可以更快的同步系統時間。

leapfile 關鍵字用來指定含有閏秒 (Leap second) 資訊的檔案位置,該檔案是由 periodic(8) 自動更新。這個關鍵字指定的檔案位置必須與 /etc/rc.conf 中設定的 ntp_db_leapfile 相同。

29.11.1.2. 在 /etc/rc.conf 中的 NTP 設定項目

設定 ntpd_enable="YES" 可讓開機時會啟動 ntpd。將 ntpd_enable=YES 加到 /etc/rc.conf 之後,可輸入以下指令讓 ntpd 不需重新開機立即啟動:

# service ntpd start

要使用 ntpd 必須設定 ntpd_enable,以下所列的 rc.conf 變數可視所需請況設定。

設定 ntpd_sync_on_start=YES 可讓 ntpd 可以在系統啟動時一次同步任何差距的時間,正常情況若時鐘的差距超過 1000 秒便會記錄錯誤並且中止。這個設定項目在沒有電池備援的時鐘上特別有用。

設定 ntpd_oomprotect=YES 可保護 ntpd daemon 被系統中止並嘗試從記憶體不足 (Out Of Memory, OOM) 的情況恢復運作。

設定 ntpd_config= 可更改 ntp.conf 檔案的位置。

設定 ntpd_flags= 可設定使用任何其他所需 ntpd 參數,但要避免使用由 /etc/rc.d/ntpd 內部控管的參數如下:

  • -p (pid 檔案位置)

  • -c (改用ntpd_config= 設定)

29.11.1.3. 使用無特權的 ntpd 使用者執行 Ntpd

在 FreeBSD 上的 Ntpd 現在可以使用無特權的使用者啟動並執行,要達到這個功能需要 mac_ntpd(4) 規則模組。/etc/rc.d/ntpd 啟動 Script 會先檢查 NTP 的設定,若可以的話它會載入 mac_ntpd 模組,然後以無特權的使用者 ntpd (user id 123) 來啟動 ntpd。為了避免檔案與目錄存取權限的問題,當設定中有任何檔案相關的選項時,啟動 Script 不會自動以 ntpd 身份啟動 ntpd

ntpd_flags 若出現以下任何參數則需要以最下面的方式手動設定才能以 ntpd 使用者的身份執行:

  • -f 或 --driftfile

  • -i 或 --jaildir

  • -k 或 --keyfile

  • -l 或 --logfile

  • -s 或 --statsdir

ntp.conf 若出現以下任何關鍵字則需要以最下面的方式手動設定才能以 ntpd 使用者的身份執行:

  • crypto

  • driftfile

  • key

  • logdir

  • statsdir

要手動設定以使用者 ntpd 身份執行 ntpd 你必須:

  • 確保 ntpd 使用者有權限存取所有在設定檔中指定的檔案與目錄。

  • mac_ntpd 模組載入或編譯至核心,請參考 mac_ntpd(4) 取得詳細資訊。

  • /etc/rc.conf 中設定 ntpd_user="ntpd"

29.11.2. 在 PPP 連線使用 NTP

ntpd 並不需要永久的網際網路連線才能正常運作,若有一個 PPP 連線是設定成需要時撥號,那麼便需要避免 NTP 的流量觸發撥號或是保持連線不中斷,這可在 /etc/ppp/ppp.conf 使用 filter 項目設定,例如:

set filter dial 0 deny udp src eq 123
# Prevent NTP traffic from initiating dial out
set filter dial 1 permit 0 0
set filter alive 0 deny udp src eq 123
# Prevent incoming NTP traffic from keeping the connection open
set filter alive 1 deny udp dst eq 123
# Prevent outgoing NTP traffic from keeping the connection open
set filter alive 2 permit 0/0 0/0

要取得更詳細的資訊,請參考於 ppp(8)PACKET FILTERING 小節以及在 /usr/share/examples/ppp/ 中的範例。

注意:

部份網際網路存取提供商會封鎖較小編號的埠,這會讓 NTP 無法運作,因為回應永遠無到傳送到該主機。

本文及其他文件,可由此下載: ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/

若有 FreeBSD 方面疑問,請先閱讀 FreeBSD 相關文件,如不能解決的話,再洽詢 <questions@FreeBSD.org>。

關於本文件的問題,請洽詢 <doc@FreeBSD.org>。