為公益伸出援手,自建NTP 伺服器池

騰訊雲加社群發表於2019-03-01

歡迎大家前往騰訊雲+社群,獲取更多騰訊海量技術實踐乾貨哦~

本文由吳凌雲 發表於雲+社群專欄

介紹

什麼是 NTP

準確時間對於幾乎所有服務或軟體都至關重要。在分散式平臺上執行的電子郵件,記錄器,事件系統和排程程式,使用者身份驗證機制和服務都需要準確的時間戳記錄事件。這些服務使用網路時間協議(NTP)將系統時鐘與可信外部源同步。NTP 全稱為 Network Time Protocol ,中文翻譯為網路時間協議,1985年就已經被提出,旨在縮短網際網路上所有計算機裝置與 UTC 的時間差。通過 Marzullo 演算法,他可以選擇準確的時間伺服器,並且可以適當減輕由於網路延遲所帶來的誤差。NTP 客戶端將定期輪詢不同網路上的三個或更多伺服器。為同步其時鐘,客戶端必須計算其時間偏移量和來回通訊延遲,隨後,從最好的三個剩餘中匯出估算的時間偏移。然後調整時脈頻率以逐漸減小偏移 。

什麼是 NTP 伺服器池

NTP 伺服器池是一個分散式的公益性專案,簡單來說,他就是各個地區可用的 NTP 伺服器的一個集合。全世界各地的志願者可以提交自己的 NTP 伺服器到這個池中,在使用者需要進行 NTP 查詢的時候,通過 DNS 的按區域解析,使用者可以被分配到最近的伺服器上,這樣可以減少網路延遲帶來的誤差,準確的提供時間。

這是NTP PoolProject專案發揮作用的地方。它是一個龐大的全球時間伺服器叢集,被全球數以千萬計的客戶稱為“美妙時光”。它是Ubuntu和大多數其他主要Linux發行版的預設時間伺服器,以及許多聯網裝置和軟體應用程式。

如果你有位於國內的、長期可以使用的、有固定 IP 的伺服器,你可以考慮參與進來這個專案。無論你的頻寬多少,只要在伺服器池中設定了伺服器頻寬,DNS 會對伺服器的權重進行調整,使之儘可能的不超過你所設定的頻寬。因此只要你有閒置的頻寬,就可以參與進來,而不用擔心影響正常的業務。

在本教程中,您將在伺服器上設定NTP並將其配置為NTP池專案的一部分,以便為NTP池專案的其他使用者提供準確的時間。提供備用CPU週期和未使用的頻寬也是是向社群提供回饋的絕佳方式。

NTP所需頻寬相對較低,可根據您提供的數量和伺服器所在的位置進行調整。每個客戶端每20分鐘只傳送幾個UDP資料包,大多數伺服器每秒只接收大約12個NTP資料包,每天傳送一次高達每秒數百個資料包的峰值。這意味著頻寬使用量為10-15Kb/秒,峰值為50-120Kb /秒。

在加入NTP池專案之前,您必須滿足三個基本要求:

  1. 您的伺服器必須具有靜態IP地址。
  2. 您的伺服器必須具有永久穩定的Internet連線。
  3. 您的IP地址一般不更改,或者很少更改(每年一次或更少)。

對於大多數雲的伺服器,通常會滿足前兩個要求。第三個要求強調,在加入NTP池專案將構成一個長期的承諾。當然,如果您的情況發生變化,也可以將伺服器從池中取出,但在流量完全消失之前需要很長時間。

準備

要完成本教程,您需要:

  • 一臺配置了公網IP的Ubuntu 16.04伺服器。沒有伺服器的同學可以在這裡購買,不過我個人更推薦您使用免費的騰訊雲開發者實驗室進行試驗,學會安裝後在購買伺服器
  • 在您的伺服器上啟用防火牆,如果您使用的是騰訊雲的CVM伺服器,您可以直接在騰訊雲控制檯中的安全組進行設定。

第一步、安裝NTP

預設情況下系統不安裝NTP軟體包,因此您將使用軟體包管理器apt進行安裝。首先,更新您的包:

sudo apt-get update
複製程式碼

然後安裝NTP:

sudo apt-get install ntp
複製程式碼

如果已按準備教程配置防火牆,則必須允許123埠上的UDP通訊才能與NTP池通訊,如果您使用的是騰訊雲的CVM伺服器,您可以直接在騰訊雲控制檯中的安全組進行設定。:

sudo ufw allow 123/udp
複製程式碼

NTP現已安裝,但已配置為使用預設的NTP池時間伺服器。讓我們選擇一些特定的時間伺服器。

第二步、選擇一個合適的上游伺服器

NTP池專案要求加入池的運營商選擇良好的網路本地時間伺服器,而不是使用預設pool.ntp.org伺服器。這可確保NTP池專案可靠,快速。在選擇時間源時,您需要穩定的網路連線,不會丟失資料包,並且伺服器之間的轉跳數儘可能少。

多層和分層NTP協議將所涉及的各方分為主伺服器,輔助伺服器和客戶端。主伺服器稱為***Stratum1***,主伺服器接連線到稱為***Stratum 0的時間源。該源可以是一個原子鐘,GPS接收器或無線電導航系統。輔助伺服器稱為*Stratum2***,*Stratum 3** 等。

每個伺服器也是一個客戶端。Stratum 2客戶端從上游Stratum 1伺服器接收時間,併為下游Stratum 3伺服器或其他客戶端提供時間。要使NTP池專案正常工作,NTP至少需要配置三個伺服器。該專案建議至少四個,不超過七個的時間源。

NTP池專案提供了公共Stratum 1Startum 2時間的伺服器的列表。這些列表指定了在規定限制下可用於公共訪問的NTP時間伺服器。您會發現大致有三種型別:

  • OpenAccess:此時間伺服器對符合NTP池的任何客戶端開放。
  • RestrictedAccess:此時間伺服器除了NTP池使用外還有一些訪問限制。
  • ClosedAccess:此時間伺服器已關閉或關機。

警告:除非您已獲得批准,否則請勿使用未列為OpenAccess的伺服器。

訪問Stratum 1 Time Servers列表。您將看到如下列表:

img

ISO程式碼列對列表進行排序,找到一個或兩個地理位置靠近你的伺服器的伺服器。當伺服器的宣告OpenAccess時,您可以放心地使用它。如果顯示“RestrictedAccess”,請單擊以開啟該條目並閱讀AccessDetails欄位中指出的說明。通常,您會發現NotificationMessage設定為Yes,這意味著您必須製作一個指向ServerContact中提供的地址的電子郵件,通知伺服器運營商您希望將此時間伺服器用作NTP池專案的時間源。

確定要使用的伺服器後,單擊ISO列中每個伺服器的連結並複製其主機名或IP地址。您將在第三步中使用這些地址。接下來,按照相同的過程從Stratum2列表中選擇三個或四個伺服器。

選擇時間伺服器後,就可以配置NTP客戶端來使用它們了。

第三步、配置NTP以加入池

要將伺服器與NTP池一起使用,需要配置新的時間伺服器,您需要對NTP守護程式的配置進行一些修改。為此,請編輯/etc/ntp.conf檔案:

sudo nano /etc/ntp.conf
複製程式碼

首先,確保配置了一個頻率檔案。頻率檔案儲存以其標稱頻率執行的系統時鐘與保持與正確時間同步所需的頻率之間的頻率偏移。它有助於實現穩定和準確的時間。您應該在預設安裝的配置檔案頂部找到它:

# /etc/ntp.conf, configuration for ntpd; see ntp.conf(5) for help

driftfile /var/lib/ntp/ntp.drift
...
複製程式碼

接下來,從配置中刪除預設時間源條目。你需要尋找所有帶有pool [0-3].ubuntu.pool.ntp.org iburstpool ntp.ubuntu.com格式的行。如果您使用的是預設配置,請刪除:

# Use servers from the NTP Pool Project. Approved by Ubuntu Technical Board
# on 2011-02-08 (LP: #104525). See http://www.pool.ntp.org/join.html for
# more information.
pool 0.ubuntu.pool.ntp.org iburst
pool 1.ubuntu.pool.ntp.org iburst
pool 2.ubuntu.pool.ntp.org iburst
pool 3.ubuntu.pool.ntp.org iburst

# Use Ubuntu`s ntp server as a fallback.
pool ntp.ubuntu.com
複製程式碼

您可在上一步中選擇的伺服器刪除的行上使用server關鍵字替換pool關鍵字。

...
server ntp_server_hostname_1 iburst
server ntp_server_hostname_2 iburst
server ntp_server_hostname_3 iburst
server ntp_server_hostname_4 iburst
server ntp_server_hostname_5 iburst
...
複製程式碼

我們根據NTP池建議為每個伺服器使用iburst選項。接下來,確保預設配置不允許管理查詢。如果不這樣做,你的伺服器可以在NTP反射攻擊中使用,也可能會受到ntpqntpdc試圖修改伺服器狀態。檢查noquery選項是否已新增到預設restrict行:

...
# By default, exchange time with everybody, but don`t allow configuration.
restrict -4 default kod notrap nomodify nopeer noquery limited
restrict -6 default kod notrap nomodify nopeer noquery limited

# Local users may interrogate the ntp server more closely.
restrict 127.0.0.1
restrict ::1
複製程式碼

您的NTP守護程式配置檔案現在應如下所示,儘管您的檔案可能有其他註釋,您可以忽略它們:

driftfile /var/lib/ntp/ntp.drift

server ntp_server_hostname_1 iburst
server ntp_server_hostname_2 iburst
server ntp_server_hostname_3 iburst
server ntp_server_hostname_4 iburst
server ntp_server_hostname_5 iburst

# By default, exchange time with everybody, but don`t allow configuration.
restrict -4 default kod notrap nomodify nopeer noquery limited
restrict -6 default kod notrap nomodify nopeer noquery limited

# Local users may interrogate the ntp server more closely.
restrict 127.0.0.1
restrict ::1
複製程式碼

儲存檔案並退出編輯器。現在重新啟動NTP服務,讓時間伺服器將其時鐘同步到上游伺服器。

sudo systemctl restart ntp.service
複製程式碼

幾分鐘後,使用以下ntpq命令檢查時間伺服器的執行狀況:

ntpq -p
複製程式碼

輸出結果應該類似於:

     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
 mizbeaver.udel. .INIT.          16 u    -   64    0    0.000    0.000   0.000
 montpelier.ilan .GPS.            1 u   25   64    7   55.190    2.121 130.492
+nist1-lnk.binar .ACTS.           1 u   28   64    7   52.728   23.860   3.247
*ntp.okstate.edu .GPS.            1 u   31   64    7   19.708   -8.344   6.853
+ntp.colby.edu   .GPS.            1 u   34   64    7   51.518   -5.914   6.669
複製程式碼

remote列告訴您NTP守護程式正在使用的伺服器的主機名,refid列告訴您的伺服器使用的原始碼。因此,對於Stratum 1伺服器,refid欄位應顯示GPSPPSACTSPTB,而Stratum 2和更其他輔助伺服器將顯示上游伺服器的IP地址。在ST列顯示層級,和delay,offsetjitter告訴你時間源的質量。這三個欄位的值越低越好。

您的時間伺服器現在可以為公共服務。您可以通過從其他主機輸入ntpdate呼叫來驗證這一點:

ntpdate -q your_server_ip
複製程式碼

輸出結果應該與以下類似,它告訴您它調整了時間伺服器和偏移量:

server your_server_ip, stratum 2, offset 0.001172, delay 0.16428
 2 Mar 23:06:44 ntpdate[18427]: adjust time server your_server_ip offset 0.001172 sec
複製程式碼

您現在可以使用NTP池專案註冊NTP伺服器,以便其他人可以使用它。

第四步 – 將伺服器新增到NTP池

要新增您的伺服器以便其他人可以使用,可以訪問manage.ntppool.org並註冊一個帳戶。您將收到來自NTP Poolhelp@ntppool.org的電子郵件,要求您驗證您的帳戶。按照電子郵件中的說明確認您的帳戶,然後登入manage.ntppool.org。登入後,您將看到新增伺服器的介面:

img

輸入伺服器的IP地址,然後單擊“ 提交”

下一個螢幕會要求您驗證它是否已標識伺服器的區域。如果它將您的伺服器顯示在與您不同的地區,使用“**Comment”**框可讓他們瞭解情況。

如果您滿意,請單擊Yes, this is my server, add it!

您的伺服器現在已經是NTP池專案的一部分了。訪問www.pool.ntp.org/scores/your…以檢視NTP Pool的監控系統收集的有關您的伺服器的資訊。它每小時會檢查您的伺服器幾次,並顯示偏移資料,與系統的分數對應。只要您的伺服器保持良好的時間並且可以訪問,分數就會上升,直到達到20分。池中僅使用分數高於10的伺服器。

結論

在本教程中,您成功學習瞭如何設定了自己的時間伺服器,並使其成為NTP池專案的成員,為社群服務,現在國內NTP伺服器數量還是不夠樂觀,還是那句話,如果你有位於國內的、長期可以使用的、有固定 IP 的伺服器,你可以考慮參與進來這個專案。無論你的頻寬多少,只要在伺服器池中設定了伺服器頻寬,DNS 會對伺服器的權重進行調整,使之儘可能的不超過你所設定的頻寬。因此只要你有閒置的頻寬,就可以參與進來,而不用擔心影響正常的業務。更多Linux教程請前往騰訊雲+社群學習更多知識。


參考文獻:

《How to Configure NTP for Use in the NTP Pool Project on Ubuntu 16.04》

《國內 NTP 伺服器池可能需要你的幫助》

問答

機器學習入門需要哪些數學基礎?

相關閱讀

安全報告 | 2018上半年網際網路惡意爬蟲分析:從全景視角看爬蟲與反爬蟲

安全報告 | SSH 暴力破解趨勢:從雲平臺向物聯網裝置遷移

給你的CVM安裝一個皮膚吧!

此文已由作者授權騰訊雲+社群釋出,原文連結:https://cloud.tencent.com/developer/article/1175079?fromSource=waitui

歡迎大家前往騰訊雲+社群或關注雲加社群微信公眾號(QcloudCommunity),第一時間獲取更多海量技術實踐乾貨哦~

海量技術實踐經驗,盡在雲加社群

相關文章