作者:羽林君,转载授权以及围观:欢迎关注微信公众号:羽林君,或者添加作者个人微信:become_me
openwrt开发中,我们可能遇到这样需求,使用路由器支持局域网内设备ntp授时功能。
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守护进程)的命令,具体解释如下:
/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服务器的回复,将会超时退出。
-n:表示以前台方式运行,通常用于调试目的。
-N:表示不进行守护进程化,通常也是为了调试目的。
-S /usr/sbin/ntpd-hotplug:指定了一个脚本或程序,可能是在NTP时间同步发生变化时触发的热插拔脚本。
-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守护进程)的命令,具体解释如下:
**{ntpd}**:一个占位符,用于指代命令名称,实际上应该替换为"ntpd"。
/sbin/ujail:这是一个命令,通常用于在OpenWRT系统中以受限制的环境中执行其他程序。它提供了对OpenWRT的沙盒(sandboxing)支持,以增加系统安全性。
-t 5:这是ujail命令的选项之一,表示设置超时时间为5秒。
-n ntpd:指定要运行的程序名称为"ntpd"。
-U ntp -G ntp:分别指定了新的进程用户和组,这里将ntpd进程的用户设置为"ntp",组也设置为"ntp"。
-C /etc/capabilities/ntpd.json:指定了一个JSON格式的文件,其中包含了ntpd进程的能力(capabilities)配置。
-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:最后部分是实际要执行的命令,包括路径和参数。这里运行了"/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 篮球。关注我,与我一起同行。