如何在 Linux 上運行你自己的公共時間伺服器
最重要的公共服務之一就是 報時 ,但是很多人並沒有意識到這一點。大多數公共時間伺服器都是由志願者管理,以滿足不斷增長的需求。這裡學習一下如何運行你自己的時間伺服器,為基礎公共利益做貢獻。(查看 在 Linux 上使用 NTP 保持精確時間 去學習如何設置一台區域網時間伺服器)
著名的時間伺服器濫用事件
就像現實生活中任何一件事情一樣,即便是像時間伺服器這樣的公益項目,也會遭受不稱職的或者惡意的濫用。
消費類網路設備的供應商因製造了大混亂而臭名昭著。我回想起的第一件事發生在 2003 年,那時,NetGear 在它們的路由器中硬編碼了威斯康星大學的 NTP 時間伺服器地址。使得時間伺服器的查詢請求突然增加,隨著 NetGear 賣出越來越多的路由器,這種情況越發嚴重。更有意思的是,路由器的程序設置是每秒鐘發送一次請求,這將使伺服器難堪重負。後來 Netgear 發布了升級固件,但是,升級他們的設備的用戶很少,並且他們的其中一些用戶的設備,到今天為止,還在不停地每秒鐘查詢一次威斯康星大學的 NTP 伺服器。Netgear 給威斯康星大學捐獻了一些錢,以幫助彌補他們帶來的成本增加,直到這些路由器全部淘汰。類似的事件還有 D-Link、Snapchat、TP-Link 等等。
對 NTP 協議進行反射和放大,已經成為發起 DDoS 攻擊的一個選擇。當攻擊者使用一個偽造的目標受害者的源地址向時間伺服器發送請求,稱為反射攻擊;攻擊者發送請求到多個伺服器,這些伺服器將回復請求,這樣就使偽造的源地址受到轟炸。放大攻擊是指一個很小的請求收到大量的回複信息。例如,在 Linux 上,ntpq
命令是一個查詢你的 NTP 伺服器並驗證它們的系統時間是否正確的很有用的工具。一些回復,比如,對端列表,是非常大的。組合使用反射和放大,攻擊者可以將 10 倍甚至更多帶寬的數據量發送到被攻擊者。
那麼,如何保護提供公益服務的公共 NTP 伺服器呢?從使用 NTP 4.2.7p26 或者更新的版本開始,它們可以幫助你的 Linux 發行版不會發生前面所說的這種問題,因為它們都是在 2010 年以後發布的。這個發行版都默認禁用了最常見的濫用攻擊。目前,最新版本是 4.2.8p10,它發佈於 2017 年。
你可以採用的另一個措施是,在你的網路上啟用入站和出站過濾器。阻塞宣稱來自你的網路的數據包進入你的網路,以及攔截髮送到偽造返回地址的出站數據包。入站過濾器可以幫助你,而出站過濾器則幫助你和其他人。閱讀 BCP38.info 了解更多信息。
層級為 0、1、2 的時間伺服器
NTP 有超過 30 年的歷史了,它是至今還在使用的最老的網際網路協議之一。它的用途是保持計算機與世界標準時間(UTC)的同步。NTP 網路是分層組織的,並且同層的設備是對等的。 層次 0 包含主報時設備,比如,原子鐘。層級 1 的時間伺服器與層級 0 的設備同步。層級 2 的設備與層級 1 的設備同步,層級 3 的設備與層級 2 的設備同步。NTP 協議支持 16 個層級,現實中並沒有使用那麼多的層級。同一個層級的伺服器是相互對等的。
過去很長一段時間內,我們都為客戶端選擇配置單一的 NTP 伺服器,而現在更好的做法是使用 NTP 伺服器地址池,它使用輪詢的 DNS 信息去共享負載。池地址只是為客戶端服務的,比如單一的 PC 和你的本地區域網 NTP 伺服器。當你運行一台自己的公共伺服器時,你不用使用這些池地址。
公共 NTP 伺服器配置
運行一台公共 NTP 伺服器只有兩步:設置你的伺服器,然後申請加入到 NTP 伺服器池。運行一台公共的 NTP 伺服器是一種很高尚的行為,但是你得先知道這意味著什麼。加入 NTP 伺服器池是一種長期責任,因為即使你加入伺服器池後,運行了很短的時間馬上退出,然後接下來的很多年你仍然會接收到請求。
你需要一個靜態的公共 IP 地址,一個至少 512Kb/s 帶寬的、可靠的、持久的網際網路連接。NTP 使用的是 UDP 的 123 埠。它對機器本身要求並不高,很多管理員在其它的面向公共的伺服器(比如,Web 伺服器)上順帶架設了 NTP 服務。
配置一台公共的 NTP 伺服器與配置一台用於區域網的 NTP 伺服器是一樣的,只需要幾個配置。我們從閱讀 協議規則 開始。遵守規則並注意你的行為;幾乎每個時間伺服器的維護者都是像你這樣的志願者。然後,從 StratumTwoTimeServers 中選擇 4 到 7 個層級 2 的上游伺服器。選擇的時候,選取地理位置上靠近(小於 300 英里的)你的網際網路服務提供商的上游伺服器,閱讀他們的訪問規則,然後,使用 ping
和 mtr
去找到延遲和跳數最小的伺服器。
以下的 /etc/ntp.conf
配置示例文件,包括了 IPv4 和 IPv6,以及基本的安全防護:
# stratum 2 server list
server servername_1 iburst
server servername_2 iburst
server servername_3 iburst
server servername_4 iburst
server servername_5 iburst
# access restrictions
restrict -4 default kod noquery nomodify notrap nopeer limited
restrict -6 default kod noquery nomodify notrap nopeer limited
# Allow ntpq and ntpdc queries only from localhost
restrict 127.0.0.1
restrict ::1
啟動你的 NTP 伺服器,讓它運行幾分鐘,然後測試它對遠程伺服器的查詢:
$ ntpq -p
remote refid st t when poll reach delay offset jitter
=================================================================
+tock.no-such-ag 200.98.196.212 2 u 36 64 7 98.654 88.439 65.123
+PBX.cytranet.ne 45.33.84.208 3 u 37 64 7 72.419 113.535 129.313
*eterna.binary.n 199.102.46.70 2 u 39 64 7 92.933 98.475 56.778
+time.mclarkdev. 132.236.56.250 3 u 37 64 5 111.059 88.029 74.919
目前表現很好。現在從另一台 PC 上使用你的 NTP 伺服器名字進行測試。以下的示例是一個正確的輸出。如果有不正確的地方,你將看到一些錯誤信息。
$ ntpdate -q yourservername
server 66.96.99.10, stratum 2, offset 0.017690, delay 0.12794
server 98.191.213.2, stratum 1, offset 0.014798, delay 0.22887
server 173.49.198.27, stratum 2, offset 0.020665, delay 0.15012
server 129.6.15.28, stratum 1, offset -0.018846, delay 0.20966
26 Jan 11:13:54 ntpdate[17293]: adjust time server 98.191.213.2 offset 0.014798 sec
一旦你的伺服器運行的很好,你就可以向 manage.ntppool.org 申請加入池中。
查看官方的手冊 分散式網路時間伺服器(NTP) 學習所有的命令、配置選項、以及高級特性,比如,管理、查詢、和驗證。訪問以下的站點學習關於運行一台時間伺服器所需要的一切東西。
通過來自 Linux 基金會和 edX 的免費課程 「Linux 入門」 學習更多 Linux 的知識。
via: https://www.linux.com/learn/intro-to-linux/2018/2/how-run-your-own-public-time-server-linux
作者:CARLA SCHRODER 譯者:qhwdw 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive