場景描述
- 內網主機之間時間不一致,需要作同步;主機多數不能連接外網,只有極少數幾台能連接外網
系統環境
- centos7
- root權限
實施方案
-
內網中一台主機A (如172.16.59.25)與外網互通,通過外網 NTP 服務器同步時間
-
主機A對內網提供 NTP 服務
-
內網其他機器通過主機A進行對時
實施過程
主機A設置
# 安裝NTP軟件
# 方式1
yum -y install ntp
# 方式2(嚴格按照順序autogen->ntpdate->ntp)
rpm -hiv autogen-libopts-5.18-5.el7.x86_64.rpm
rpm -hiv ntpdate-4.2.6p5-18.el7.centos.x86_64.rpm
rpm -hiv ntp-4.2.6p5-18.el7.centos.x86_64.rpm
# 編輯NTP配置
vim /etc/ntp.conf
ntp.conf
配置如下
driftfile /var/lib/ntp/drift
# 默認拒絕客戶端所有操作
restrict default kod notrap nomodify nopeer noquery
# 允許本地操作
restrict 127.0.0.1
restrict ::1
# 允許該網段同步時間,但不可修改NTP服務器時間
restrict 172.16.59.0 mask 255.255.255.0 nomodify
# 用於NTPD的上級服務器、本機時鍾的同步,以及時鍾的層次stratum
server cn.ntp.org.cn prefer
server edu.ntp.org.cn iburst
# 本機時間兜底
server 127.127.1.0
fudge 127.127.1.0 stratum 8
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
disable monitor
# 編輯 ntpd 文件
vim /etc/sysconfig/ntpd
ntpd
文件修改如下
OPTIONS="-u ntp:ntp -p /var/run/ntpd.pid"
# BIOS時間也會跟隨改變
SYNC_HWCLOCK=yes
# 查看狀態
systemctl status ntpd.service
ntpstat
# 重啟服務
systemctl restart ntpd.service
# 開機啟動
systemctl enable ntpd.service
其他主機設置
# 安裝 ntpdate 軟件
# 方式1
yum -y install ntp
# 方式2(嚴格按照順序autogen->ntpdate->ntp)
rpm -hiv autogen-libopts-5.18-5.el7.x86_64.rpm
rpm -hiv ntpdate-4.2.6p5-18.el7.centos.x86_64.rpm
rpm -hiv ntp-4.2.6p5-18.el7.centos.x86_64.rpm
# 編輯配置文件
vi /etc/ntp.conf
ntp.conf
配置如下
driftfile /var/lib/ntp/drift
# 默認拒絕客戶端所有操作
restrict default kod notrap nomodify nopeer noquery
# 禁止本身的server
# server cn.ntp.org.cn prefer
# server edu.ntp.org.cn iburst
restrict 172.16.59.25
restrict 127.0.0.1
restrict ::1
server 172.16.59.25
# server 127.127.1.0
# fudge 127.127.1.0 stratum 10
includefile /etc/ntp/crypto/pw
keys /etc/ntp/keys
disable monitor
# 編輯 ntpd 文件
vim /etc/sysconfig/ntpd
ntpd
文件修改如下
OPTIONS="-u ntp:ntp -p /var/run/ntpd.pid"
# BIOS時間也會跟隨改變
SYNC_HWCLOCK=yes
systemctl restart ntpd.service
# 開機啟動
systemctl enable ntpd.service
過程總結
可能失敗原因及分析
-
NTP 服務剛啟動后,客戶端無法同步時間,需等待幾分鍾才可以
-
關閉或者設置防火牆,允許123端口
-
網絡上存在多個 NTP 服務器時,客戶端切換同步源后需要重啟
-
如果本機與 NTP 服務器時間誤差超過1000s,則同步失敗。可以按照下面命令解決。
# 更改時區為中國 timedatectl set-timezone "Asia/Shanghai" # 與外網同步一次時間 ntpdate cn.ntp.org.cn # 注意 ntpdate
stratum 的概念
-
頂層是1,值為0時表示層數不明,層的值是累加的,比如 NTP 授時方向是 A -> B -> C,假設 A 的層值是3,那么B從A獲取到時間層值為4,C從B獲取到時間,C的層值被置為5。一般只有整個 NTP 系統最頂層的服務器stratum才設為1。
-
NTP 同步的方向是從stratum 值較小的節點向較大的節點傳播,如果某個 NTP 客戶端接收到 stratum 比自己還要大,那么 NTP 客戶端認為自己的時間比接受到的時間更為精確,不會進行時間的更新。
-
對於大部分 NTP 軟件系統來說,服務啟動后,stratum 值初始是0,一旦 NTP 服務獲取到了時間,NTP 層次就設置為上級服務器 stratum +1。對於具備衛星時鍾、原子鍾的專業 NTP 設備,一般 stratum 值初始是1。
NTPD運行過程
-
NTPD 啟動后,stratum 值初始是0,此時 NTPD 接收到 NTP 請求,回復 stratum 字段為0的 NTP 包,客戶端接收后,發現 stratum 字段無效,拒絕更新時間,造成時間更新失敗。
-
幾分鍾后,NTPD從上級服務器獲取到了更新,設置了正確的 stratum,回復 stratum 字段為 n+1的 NTP 包,客戶端接收后,確認 stratum 有效,成功進行時間更新。
-
在 NTPD 上級服務器不可用的情況下,NTPD 將本機時鍾服務模擬為一個上級 NTP 服務器,地址使用環回127.127.1.0。服務啟動幾分鍾后,NTPD 從 127.127.1.0 更新了時鍾,設置了有效的 stratum,客戶端接收后,成功進行時間更新。
ntpd與ntpdate修改時間的區別
ntpd 不僅僅是時間同步服務器,他還可以做客戶端與標准時間服務器進行同步時間,而且是平滑同步,並非ntpdate立即同步,在生產環境中慎用ntpdate,也正如此兩者不可同時運行。
時鍾的躍變,對於某些程序會導致很嚴重的問題。許多應用程序依賴連續的時鍾——畢竟,這是一項常見的假定,即,取得的時間是線性的,一些操作,例如數據庫事務,通常會地依賴這樣的事實:時間不會往回跳躍。不幸的是,ntpdate調整時間的方式就是我們所說的”躍變“:在獲得一個時間之后,ntpdate使用settimeofday設置系統時間,這有幾個非常明顯的問題:
第一,這樣做不安全。ntpdate的設置依賴於ntp服務器的安全性,攻擊者可以利用一些軟件設計上的缺陷,拿下ntp服務器並令與其同步的服務器執行某些消耗性的任務。由於ntpdate采用的方式是跳變,跟隨它的服務器無法知道是否發生了異常(時間不一樣的時候,唯一的辦法是以服務器為准)。
第二,這樣做不精確。一旦ntp服務器宕機,跟隨它的服務器也就會無法同步時間。與此不同,ntpd不僅能夠校准計算機的時間,而且能夠校准計算機的時鍾。
第三,這樣做不夠優雅。由於是跳變,而不是使時間變快或變慢,依賴時序的程序會出錯(例如,如果ntpdate發現你的時間快了,則可能會經歷兩個相同的時刻,對某些應用而言,這是致命的)。
因而,唯一一個可以令時間發生跳變的點,是計算機剛剛啟動,但還沒有啟動很多服務的那個時候。其余的時候,理想的做法是使用ntpd來校准時鍾,而不是調整計算機時鍾上的時間。
NTPD 在和時間服務器的同步過程中,會把 BIOS 計時器的振盪頻率偏差——或者說 Local Clock 的自然漂移(drift)——記錄下來。這樣即使網絡有問題,本機仍然能維持一個相當精確的走時
RTC硬件時間相關命令
clock –r 顯示硬件時鍾與日期
clock –s 將系統時鍾調整為與目前的硬件時鍾一致。
clock –w 將硬件時鍾調整為與目前的系統時鍾一致
查看和修改時間
# 查看時間和日期
date
date -R
timedatectl
# 查看本月月歷
cal
# 設置時間和日期
# 例如:將系統日期設定成2019年11月3日的命令
date -s 11/03/2019
#將系統時間設定成下午5點55分55秒的命令
date -s 17:55:55
# 將當前時間和日期寫入BIOS,避免重啟后失效**
hwclock -w
# 修改時區
tzselect