openwrt 中時間同步 ntp 使用

前言

openwrt 開發中,我們可能遇到這樣需求,使用路由器支持局域網內設備 ntp 授時功能。

作者:羽林君

轉載授權以及圍觀:歡迎關注微信公衆號:羽林君

或者添加作者個人微信:become_me


ntp 是什麼

NTP(Network Time Protocol,網絡時間協議)是由 RFC 1305 定義的時間同步協議,用來在分佈式時間服務器和客戶端之間進行時間同步。NTP 基於 UDP 報文進行傳輸,使用的 UDP 端口號爲 123。

使用 NTP 的目的是對網絡內所有具有時鐘的設備進行時鐘同步,使網絡內所有設備的時鐘保持一致,從而使設備能夠提供基於統一時間的多種應用。

對於運行 NTP 的本地系統,既可以接收來自其他時鐘源的同步,又可以作爲時鐘源同步其他的時鐘,並且可以和其他設備互相同步。

關於 NTP 原理分析,有人寫的很詳細,這裏貼一個連接:https://www.cnblogs.com/lsgxeva/p/16587984.html

客戶端啓 ntp 服務器

我們可以在界面直接選中 Enable NTP client, 在下方填寫自己需要的 ntp 同步的網站 (具體網址可以自行搜索),然後 openwrt 就會幫你啓動配置好網站的命令。

上面默認 123 端口,當然我們也可以在配置文件中指定 NTP 服務器的端口,在 OpenWRT 中,常見的 NTP 客戶端是 "ntpd",其配置文件通常位於 "/etc/ntp.conf" 或 "/etc/config/system" 等位置:

server 1.openwrt.pool.ntp.org iburst port 123

在這個示例中,"port 123" 指定了 NTP 服務器的端口爲 123。請注意,大多數情況下,無需手動指定端口,因爲 NTP 客戶端會默認使用標準的 UDP 端口 123 與 NTP 服務器通信。一般情況下,默認的 UDP 端口 123 對於 NTP 時間同步已經足夠了。

下面是寫好了同步網站後 openwrt 啓動的命令,填寫NTP網站,大家把網站前面序號去掉

r/sbin/ntpd -n -N -S /usr/sbin/ntpd-hotplug -p openwrt.pool.ntp.org -p openwrt.pool.ntp.org -p openwrt.pool.ntp.org -p tp1.aliyun.com

這個命令是在 OpenWRT 系統中用於啓動 ntpd(NTP 守護進程)的命令,具體解釋如下:

  1. /usr/sbin/ntpd:這是要執行的程序,即 NTP 守護進程。
ntpd就是ntp daemon。是一個系統的後臺進程(system daemon),用來同步本地系統時鐘和遠程NTP時間服務器的時間,或者其他參考時間源。
該程序實現了全部的NTP4協議,並對版本3,2,1,進行了兼容。
的定義該程序可以工作在client/server模式,symmetric模式,broadcast模式。
ntpd通常需要一個配置文件/etc/ntp.conf,ntpd後面的選項和命令可以寫在該配置文件中。通常,ntpd啓動後會讀取ntp.conf文件。也可以在ntpd後面接相應指令,讓ntpd不考慮該配置文件。
ntpd可以自動發現遠程服務器並自動配置。
nptd通常連續工作,隔一段時間調整一次系統時間。也可以在調整完系統時間後自動退出,如果沒有收到NTP服務器的回覆,將會超時退出。
  1. -n:表示以前臺方式運行,通常用於調試目的。

  2. -N:表示不進行守護進程化,通常也是爲了調試目的。

  3. -S /usr/sbin/ntpd-hotplug:指定了一個腳本或程序,可能是在 NTP 時間同步發生變化時觸發的熱插拔腳本。

  4. -p openwrt.pool.ntp.org -p openwrt.pool.ntp.org -p ntp1.aliyun.com:這些是指定的 NTP 服務器地址。"-p" 參數後面跟着的是 NTP 服務器的地址,這裏包括了 openwrt 官方的 NTP 服務器和阿里雲的 NTP 服務器。

綜合來看,這個命令的作用是以前臺方式運行 ntpd(NTP 守護進程),不進行守護進程化,同時指定了一組 NTP 服務器地址用於時間同步,並且可能在時間同步發生變化時會觸發 "/usr/sbin/ntpd-hotplug" 腳本。

openwrt 服務端開啓 ntp 服務器下發功能

選中provide NTP server即可開啓路由器 ntp 服務器同步功能。

啓動 openwrt 的 ntp 服務器後,原生的 openwrt 會幫你啓動這樣命令:

{ntpd} /sbin/ujail -t 5 -n ntpd -U ntp -G ntp -C /etc/capabilities/ntpd.json -c -u -r /bin/ubus -r /usr/bin/env -r /usr/bin/jshn -r /usr/sbin/ntpd-hotplug -r /usr/share/libubox/jshn.sh -- /usr/sbin/ntpd -n -N

這個命令是在 OpenWRT 系統中用於啓動 ntpd(NTP 守護進程)的命令,具體解釋如下:

  1. {ntpd}:一個佔位符,用於指代命令名稱,實際上應該替換爲 "ntpd"。

  2. /sbin/ujail:這是一個命令,通常用於在 OpenWRT 系統中以受限制的環境中執行其他程序。它提供了對 OpenWRT 的沙盒(sandboxing)支持,以增加系統安全性。

  3. -t 5:這是 ujail 命令的選項之一,表示設置超時時間爲 5 秒。

  4. -n ntpd:指定要運行的程序名稱爲 "ntpd"。

  5. -U ntp -G ntp:分別指定了新的進程用戶和組,這裏將 ntpd 進程的用戶設置爲 "ntp",組也設置爲 "ntp"。

  6. -C /etc/capabilities/ntpd.json:指定了一個 JSON 格式的文件,其中包含了 ntpd 進程的能力(capabilities)配置。

  7. -c:表示創建一個新的控制終端。

  8. -u:在後臺運行進程。

  9. -r /bin/ubus -r /usr/bin/env -r /usr/bin/jshn -r /usr/sbin/ntpd-hotplug -r /usr/share/libubox/jshn.sh:這些都是指定了要在沙盒環境中可用的程序或腳本。

  10. -- /usr/sbin/ntpd -n -N:最後部分是實際要執行的命令,包括路徑和參數。這裏運行了 "/usr/sbin/ntpd" 命令,帶有 "-n" 和 "-N" 參數。

這個命令的作用是以沙盒環境中以 "ntp" 用戶和組的身份運行 ntpd(NTP 守護進程),並且使用指定的能力配置文件以及相關的必要程序和腳本。

簡單示例

上面稍微詳細介紹了使用,這裏我們直接命令簡單執行一下,進行 NTP 同步。服務端:

/usr/sbin/ntpd -n -N -l -S /usr/sbin/ntpd-hotplug -p ntp1.aliyun.com -p ntp2.aliyun.com -p ntp.tencent.com -p ntp1.tencent.com -p time.windows.com

客戶端:

ntpd -n -N  -p 192.168.1.1

我的 openwrt 路由器 ip 爲 192.168.1.1 **協議抓取:**使用 wireshark 抓取,用 ntp 關鍵詞篩選 client 請求:

server 迴應:

wireshark 抓包分析可以參考這篇:https://blog.csdn.net/chen1415886044/article/details/112549133

**實際執行:**大家可以下面看到設備的 date 查詢中時間更新了:

結語

這就是我自己在 openwrt 使用 ntp 的記錄。如果大家有更好的想法,也歡迎大家加我好友交流分享哈。


作者:良知猶存,白天努力工作,晚上原創公號號主。公衆號內容除了技術還有些人生感悟,一個認真輸出內容的職場老司機,也是一個技術之外豐富生活的人,攝影、音樂 and 籃球。關注我,與我一起同行。

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/X-3vLIcgCx4yHy_N2vA3RA