網際網路協議 — NTP 時間同步協議

語言: CN / TW / HK

目錄

數字化時間

時間定義的型別

  • UTC(Universal Time Coordinated,國際標準時間):地球分為二十四時區,每個時區都有自己的本地時間。
  • GMT(Greenwich Mean Time,格林威治標準時間):指位於英國倫敦郊區的皇家格林尼治天文臺的標準時間,因為本初子午線被定義在通過那裡的經線。(UTC 與 GMT 時間基本相同)
  • CST(China Standard Time,中國標準時間):CST = GMT + 8 = UTC + 8
  • DST(Daylight Saving Time,夏令時):指在夏天太陽升起的比較早時,將時間撥快一小時,以提早日光的使用。(中國不使用)

伺服器時間的型別

  • 硬體時間:又稱 RTC(Real-Time Clock)或 CMOS 時間,在主機板上靠電池供電,僅儲存日期時間數值,無法儲存時區和夏令時設定。
  • 系統時間:作業系統啟動時複製 RTC 時間,之後就獨立執行,儲存了時間、時區和夏令時設定。

常見的時間操作

  • 檢視當前系統的時區和時間。
$ timedatectl status
      Local time: 六 2021-01-30 23:58:51 CST
  Universal time: 六 2021-01-30 15:58:51 UTC
        RTC time: 六 2021-01-30 15:58:51
       Time zone: Asia/Shanghai (CST, +0800)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a
  • 設定當前系統時區。
# 檢視時區清單
timedatectl list-timezones |  grep  -E "Asia/S.*"

# 選擇上海時區
timedatectl set-timezone Asia/Shanghai

# 強制同步系統時鐘
chronyc -a makestep
  • 設定當前系統時間。
timedatectl set-time "2019-10-31 15:50:00"
  • 系統時鐘同步至硬體。
timedatectl set-local-rtc
# or
hwclock --systohc --localtime
  • 硬體時鐘同步至系統。
hwclock --hctosys
  • 啟用或者禁止 NTP 時間同步。
timedatectl set-ntp yes/no

NTP

NTP(Network Time Protocol,網路時間同步協議)是一種用來進行計算機時間同步的協議,由特拉華大學的 David L. Mills 設計,位於 OSI 模型的應用層。自 1985 年以來,NTP 是目前仍在使用的最古老的網際網路協議之一。

NTP 時鐘源可以是 NTP Server 或 GPS。NTP 提供了一種高精準度的時間校正服務:LAN 環境中,時鐘偏差小於 1ms;WAN 環境中,時鐘偏差在 1-50ms 之間。NTP 還支援加密認證(Authentication)機制,以防止中間人攻擊。

NTP 的目的是在無序的 Internet 環境中提供精確且健壯的時間同步(校正)服務,在分散式時間敏感的系統至關重要。

NTP 的實現原理

在 Internet 中,NTP Server 用於提供準確的時間,首先就要有準確的時鐘源,並且這一時鐘源應該是 UTC 的(注:世界上最準確的時間是使用原子時鐘(Atomic clock)所計算的,UTC 就是其中一例)。NTP Server 獲得 UTC 的時鐘可以是:原子鐘、天文臺、衛星等,稱之為獨立的時間源。

為適應 Internet 的層次結構,NTP 也採用了 Stratum(層級)時間分佈模型。有了準確且可靠的時鐘源之後,時間就會按照 NTP Server 的 Stratum 進行傳播。

Stratum 的層級高低由距離時鐘源的遠近決定,獨立的時間源為 Stratum-0,直接連線到 Stratum-0 的裝置為 Stratum-1,Stratum-1 則從 Stratum-0 獲取時鐘;直接連線到 Stratum-1 的裝置為 Stratum-2,Stratum-2 則從 Stratum-1 獲取時鐘,以此類推。

NTP 規定 Stratum 的總層數限制在 15 以內,而 Stratum-1 則作為整個 NTP 系統的基礎。當下層 Stratum-X 從多個上層 Stratum-Y 中獲取時鐘源時,則需要利用統計學的演算法來選擇出最佳的路徑並以此校正本地時間。

在這裡插入圖片描述

國內 NTP 伺服器:

cn.pool.ntp.org  # 最常用的國內 NTP 伺服器,參考:http://www.ntppool.org/zh/use.html
cn.ntp.org.cn    # 中國
edu.ntp.org.cn   # 中國教育網
ntp1.aliyun.com  # 阿里雲
ntp2.aliyun.com  # 阿里雲
ntp.sjtu.edu.cn  # 上海交通大學
s1a.time.edu.cn  # 北京郵電大學
s1b.time.edu.cn  # 清華大學
s1c.time.edu.cn  # 北京大學
s1d.time.edu.cn  # 東南大學
s1e.time.edu.cn  # 清華大學
s2a.time.edu.cn  # 清華大學
s2b.time.edu.cn  # 清華大學
s2c.time.edu.cn  # 北京郵電大學
s2d.time.edu.cn  # 西南地區網路中心
s2e.time.edu.cn  # 西北地區網路中心
s2f.time.edu.cn  # 東北地區網路中心
s2g.time.edu.cn  # 華東南地區網路中心
s2h.time.edu.cn  # 四川大學網路管理中心
s2j.time.edu.cn  # 大連理工大學網路中心
s2k.time.edu.cn  # CERNET桂林主節點

NTP 的處理流程

在這裡插入圖片描述

  1. 針對每個 Peer X(上層 NTP Server)的資料過濾處理。
  2. 針對多個 Peers 的對等選擇與組合處理。NTP 就是通過利用多個 NTP Server 及多條網路路徑來確保高準確度與可靠性的。
  3. 本地時鐘校正。為維持時鐘的單調性,NTP 並不會直接使用前兩步處理得到的時鐘偏差值來調整本地時鐘,而是通過一個環路濾波器轉換為一個對可變頻率振盪器的控制量,以此來控制振盪器的振盪頻率,時間間接的調整系統時鐘。

Chrony

Chrony 是由 RedHat 開發的,NTP 協議的另一種實現,作為 ntpd 的替代品。在 RHEL/CentOS 7.x 中作為預設安裝的時間同步工具。Chrony 可以同時做為 NTP Server 或 NTP Client。

  • 官網:http://chrony.tuxfamily.org/

Chrony 專為間歇性網際網路連線的系統而設計,也能良好應用於持久網際網路連線的環境。Chrony 可以在各種複雜的環境中良好執行,包括:間歇性網路連線環境、高擁擠網路連線環境、溫度變化環境(計算機時鐘對溫度敏感),以及不能連續執行的、或在虛擬機器上執行的作業系統。

Chrony 具有兩個核心元件:

  • chronyd 守護程序:用於與 NTP Server 進行時間同步。
  • chronyc CLI tool:用於監控 chronyd 的效能並進行多樣化的配置,支援遠端連線。

Chrony 與 ntpd 的對比:

在這裡插入圖片描述

Chrony 相較於 ntpd 的優勢

  1. 更快的同步,只需要數分鐘而非數小時時間,從而最大程度減少了時間誤差率,對於並非全天 24 小時執行的虛擬機器而言非常有用。
  2. 能夠更好地響應時鐘頻率的快速變化,對於具備不穩定時鐘的虛擬機器或者時鐘頻率發生變化的節能技術而言非常有用。
  3. 在初始同步後,它不會停止時鐘,以防對需要系統時間保持單調的應用程式造成影響。
  4. 在應對臨時非對稱延遲時(例如,在大規模下載造成連結飽和時)提供更好的穩定性。
  5. 無需對伺服器進行定期輪詢,因此具備間歇性網路連線的系統仍然可以快速同步時鐘。

安裝與配置

安裝:

yum -y install chrony
systemctl status chronyd
systemctl enable chrony 

配置:/etc/chrony.conf

  • server hostname [option]:指定 NTP Server。具有以下 options。

    • iburst 引數:表示加急,指定在頭四次 NTP 請求中,採用 2s 或更短的時間間隔發出 NTP 請求,而不是以 minpoll x 指定的最小間隔。可以讓 chronyd 在啟動時快速進行一次時間同步。
    • minpoll x 引數:發出 NTP 請求的最小時間間隔,預設值是 6,代表 64s。
    • maxpoll x 引數:發出 NTP 請求的最大時間間隔,預設值是 9,代表 512s。
  • bindcmdaddress:指定 chronyd 監聽的網路介面。

  • allow/deny:NTP Client 的 ACL 限制,支援精確 IP 和 CIDR。

  • cmdallow/cmddeny:NTP CLI 的 ACL 限制,支援精確 IP 和 CIDR。

  • makestep threshold limit:通常 chronyd 會將根據需求通過 “加速/減慢” 的方式逐步糾正系統的時間偏移。但在某些特定情況下,該調整過程會消耗很長的時間,所以 makestep 指令用於強制 chronyd 在調整期大於某個域值時,直接進行 “跳躍式” 校時。例如:makestep 1.0 3 表示頭三次校時,如果時間相差 1.0s, 則進行跳躍式校時,而不是 “加速/減慢” 式校時。

  • local stratum 10:表示即使 server 指令中 NTP Server 不可用了,也允許使用本地時間作為標準時間源同步到其它的客戶端。

  • rtcsync:指定啟用核心模式,系統時間每 11 分鐘間隔就會拷貝到硬體時間。

  • logdir:指定日誌檔案路徑。

  • driftfile file:指定根據實際時間計算出 “增/減” 時間差的比率,並將補償引數記錄到一個檔案中,會在機器重啟後為系統時鐘作出補償。預設為 /var/lib/chrony/drift。

NOTE:chrony 與 ntpd 最大的區別就是:時間的修正是連續進行的,而 ntpd 需要搭配 Crontab 來自動定時同步時間,本質就是用 crontab 定時執行一次手動時間同步命令 ntp,因此會出現間斷。

配置示例:

# 指定上層 NTP 伺服器為阿里雲提供的公網 NTP 伺服器。
server ntp1.aliyun.com iburst minpoll 4 maxpoll 10
server ntp2.aliyun.com iburst minpoll 4 maxpoll 10
server ntp3.aliyun.com iburst minpoll 4 maxpoll 10
server ntp4.aliyun.com iburst minpoll 4 maxpoll 10

# 當阿里雲提供的公網 NTP 伺服器不可用時,採用本地時間作為同步標準。
local stratum 8

# 讓 chronyd 在選擇源時忽略源的層級。
stratumweight 0

# 記錄系統時鐘獲得/丟失時間的速率至 drift 檔案中。
driftfile /var/lib/chrony/drift

# 啟用 RTC(實時時鐘)的核心同步。
rtcsync

# 如果系統時鐘的偏移量大於 10 秒,則允許在前三次更新中步進式的調整系統時鐘。
makestep 10 3

# 只允許 192.168.1 網段的客戶端進行時間同步。
allow 192.168.1.0/24

# 指定包含 NTP 驗證金鑰的檔案。
keyfile /etc/chrony.keys

# 如果時鐘調整大於 0.5 秒,則向系統日誌傳送訊息。
logchange 0.5

# 指定存放日誌檔案的目錄。
logdir /var/log/chrony

# 禁用客戶端訪問的日誌記錄
noclientlog

# Select which information is logged.
log measurements statistics tracking

chronyc CLI

在這裡插入圖片描述

  • 檢視時間同步情況。
$ chronyc tracking
Reference ID    : A29FC801 (time.cloudflare.com)              # 當前進行時間同步的參考。
Stratum         : 4                                           # 連線參考時鐘的跳數。
Ref time (UTC)  : Sat Jan 30 13:36:04 2021                    # 參考時間。
System time     : 0.003950741 seconds fast of NTP time        # 系統時間。
Last offset     : +0.001695401 seconds                        # 最後一次時間校對偏移量。
RMS offset      : 0.001266512 seconds                         # RMS 偏移,偏移值的長期平均值。
Frequency       : 5.060 ppm slow                              # 系統的時鐘錯誤的頻率,單位為 ppm(百萬分率)。
Residual freq   : +0.000 ppm                                  # 殘餘頻率,表示參考源的測量值與當前使用的頻率之間的差異。
Skew            : 0.010 ppm                                   # 偏斜,估計頻率的誤差界限。
Root delay      : 0.228649795 seconds                         # 根延遲,網路路徑延遲到計算機正在同步的層計算機的總和。
Root dispersion : 0.010007298 seconds                         
Update interval : 15499.7 seconds                             # 說明最後兩次更新的時間間隔。
Leap status     : Normal                                      # 跳躍狀態,列舉:正常、插入秒、刪除秒、或不同步。
  • 顯示所有 Source NTP Server 的資訊。
$ chronyc sources -v
210 Number of sources = 4

  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
 / .- Source state '*' = current synced, '+' = combined , '-' = not combined,
| /   '?' = unreachable, 'x' = time may be in error, '~' = time too variable.
||                                                 .- xxxx [ yyyy ] +/- zzzz
||      Reachability register (octal) -.           |  xxxx = adjusted offset,
||      Log2(Polling interval) --.      |          |  yyyy = measured offset,
||                                \     |          |  zzzz = estimated error.
||                                 |    |           \
MS Name/IP address         Stratum Poll Reach LastRx Last sample
===============================================================================
^+ ntp16.doctor.com              2  10   127   49m    +24ms[  +24ms] +/-  169ms
^* time.cloudflare.com           3  10   271  121m    +26ms[  +28ms] +/-  145ms
^+ lax1.nonce.monster            2  10   377  200m  -6349us[-4660us] +/-  161ms
^+ ntp1.ams1.nl.leaseweb.net     2  10   277   402   -788us[ -788us] +/-  153ms
  • 顯示所有 Source NTP Server 的狀態。
$ chronyc sourcestats -v
210 Number of sources = 4
                             .- Number of sample points in measurement set.
                            /    .- Number of residual runs with same sign.
                           |    /    .- Length of measurement set (time).
                           |   |    /      .- Est. clock freq error (ppm).
                           |   |   |      /           .- Est. error in freq.
                           |   |   |     |           /         .- Est. offset.
                           |   |   |     |          |          |   On the -.
                           |   |   |     |          |          |   samples. \
                           |   |   |     |          |          |             |
Name/IP Address            NP  NR  Span  Frequency  Freq Skew  Offset  Std Dev
==============================================================================
ntp16.doctor.com            6   3   15h     +0.320      0.949    +14ms  1099us
time.cloudflare.com        64  30   69h     -0.003      0.009  -6159us  1469us
lax1.nonce.monster          7   3  137m     +0.126      0.186  -4871us   165us
ntp1.ams1.nl.leaseweb.net  37  19   11h     +0.048      0.059  -1273us  1203us
  • 檢視 Source NTP Server 的線上和離線狀態。
$ chronyc activity
200 OK
4 sources online
0 sources offline
0 sources doing burst (return to online)
0 sources doing burst (return to offline)
0 sources with unknown address
  • 檢視 Chrony 服務的日誌。
$ journalctl -u chronyd
  • 檢查 NTP 訪問是否對 Source NTP Server 可用。
$ chronyc accheck <server>
  • 手動新增一臺新的 Source NTP Server。
$ chronyc add server <server>
  • 手動移除 NTP Server 或對等伺服器。
$ chronyc delete <server>
  • 手動設定 chronyd 的時間。
$ chronyc settime

使用 Chrony 作為 NTP Server

要將 Chrony 作為一個 NTP Server,方法很簡單。

  1. 首先,需要修改 /etc/chrony.conf 檔案,並新增以下配置即可。
allow 192.168.1.0/24   # ACL 限制。
bindcmdaddress 0.0.0.0 # chronyd 監聽介面。
local stratum 10       # 即使伺服器沒有上層時間源,也可使用本地時間作為時鐘源。
  1. 重啟 Chronyd 服務。
systemctl restart chronyd

佔用埠:

  • 123/udp:標準的 NTP Server 監聽埠。
  • 323/udp:預設的管理埠。