0x00 开始之前..
NTP(Network Time Protocol)服务器是一种用于同步网络时间的服务,可以确保计算机、网络设备以及其他设备的时间一致性。对于需要高精度时间同步的应用,自建 NTP 服务器可以提供更为可靠的时间同步服务。NTP 自 1985 年之前开始运行,是目前使用的最古老的互联网协议之一。
我们在生活中常用的 Windows、MacOS 和 Linux 等基本都自带了 NTP 客户端,可以连接远程服务器获取当前的时间。在 Windows 上,这项功能被称作「Internet 时间同步」。不过,Windows 默认会连接到 time.windows.com NTP 服务器同步时间,默认的服务器到国内的延迟很大并且容易受晚高峰等因素影响波动,在这种条件下 NTP 客户端也很难得出准确的时间(所以有人电脑快/慢五分钟也不足为奇了)
0x01 为啥要自建 NTP 服务器
显然,中国大陆是有很多 NTP 服务器的,我从中挑选了几个可用或有历史代表意义的出来单独讲讲:
-
cn.pool.ntp.org这是一个由 www.pool.ntp.org 维护的 NTP 服务器池项目,所有服务器基本由志愿者提供和维护(也有大公司比如 Cloudflare),服务器池通过 DNS 将不同地区的请求负载均衡到不同的服务器上。
截止撰稿时,共有 82 台服务器位于 CN 池内,但并不是所有服务器都能提供低延迟的服务(还是提一嘴 Cloudflare)
-
ntp.ntsc.ac.cn来自中科院国家授时中心的 NTP 服务器,时间精度非常高
-
ntp{1-7}.aliyun.com阿里云提供的 NTP 服务器,时间精度高,可以作为日常使用
-
cn.ntp.org.cn他们的 网站 有点似了,不过可以在互联网档案馆查看历史快照
截止撰稿时,部分服务器无法顺利同步时间,不过由于其历史作用较大,故在此提一嘴
回到正题,如果你很好奇自建 NTP 到底有什么用,我列举了这些常见的用途:
- 跨地区数据同步:如果需要跨地区同步,有一个准确的时间是非常重要的,这在一些时间戳的生成上有非常好的体现
- 大型企业、数据中心、云平台、集群系统都需要所有节点时间高度一致,否则会导致日志混乱、短效证书错误过期等问题
- 机房禁连接 NTP 以防反射攻击,于是在内网自建 NTP 以同步时间
0x02 环境准备
请注意,这是一篇由软件实现 NTP 服务器的文章,这里不会有硬件购买推荐部分。
- 一台能同步时间的服务器 / 树莓派 (Pi Zero 就够了)
如果你还没有好的服务器,可以前往 雨云 购买一台,使用我的优惠码 lz932 获得新人无门槛优惠券!
- 这篇文章
貌似互联网并没有真人撰写的 ntpd-rs 安装配置教程,故你很大概率需要这篇文章。你可以可以在这里阅读 官方文档
- 趁手的 SSH 连接工具
这条并没有带货环节,我倾向于使用 openssh-client 或者跳板机的网页界面。
0x03 安装 ntpd-rs
在 Debian 13 上,我推荐使用官方提供的预编译包安装 ntpd-rs,这样可以自动配置路径、用户和权限。默认配置文件位于 /etc/ntpd-rs/ntp.toml。
下载 .deb 包
从官方的发行版页面下载符合自己架构的 .deb 包,这里我下载的是 ./ntpd-rs_1.7.0.alpha.20251003-1_amd64.deb(仅供参考)
wget https://github.com/pendulum-project/ntpd-rs/releases/download/v1.6.2/./ntpd-rs_1.7.0.alpha.20251003-1_amd64.deb
# --2077-10-12 04:34:42-- https://github.com/pendulum-project/ntpd-rs/releases/download/v1.6.2/./ntpd-rs_1.7.0.alpha.20251003-1_amd64.deb
# Resolving github.com (github.com)... 20.205.243.166
# Connecting to github.com (github.com)|20.205.243.166|:443... connected.
# HTTP request sent, awaiting response...
使用 dpkg / apt 安装
这里按文档,我使用 dpkg 安装:
dpkg -i ././ntpd-rs_1.7.0.alpha.20251003-1_amd64.deb
# (Reading database ... 35597 files and directories currently installed.)
# Preparing to unpack .../ntpd-rs_1.7.0.alpha.20251003-1_amd64.deb ...
# Unpacking ntpd-rs (1.7.0~alpha.20251003-1) over (1.5.0-1) ...
# Setting up ntpd-rs (1.7.0~alpha.20251003-1) ...
安装完成后使用 ntp-ctl -v 查看一下版本:
ntp-ctl -v
# ntp-ctl 1.7.0-alpha.20251003
0x04 配置你的 NTP 服务器
ntpd-rs使用 TOML 格式的配置文件
默认情况下,ntpd-rs 仅充当 NTP 客户端,不在任何网络接口上提供 NTP 服务。我们要为 ntpd-rs 启用服务器功能,在配置中添加以下内容:
# /etc/ntpd-rs/ntp.toml
[[server]]
listen = "0.0.0.0:123"
这将使 ntpd-rs 监听所有网络接口上的 123/udp 以接收 NTP 客户端的请求。如果在您的使用条件下仅需监听特定网络接口(如内网),请将 0.0.0.0 替换为该接口的 IP 地址(如 10.0.0.1)。
配置访问权限
在一些情况(比如混杂的内网)你可能需要只允许特定范围的子网访问您的服务器,这时候可以使用 允许列表机制 功能:
# /etc/ntpd-rs/ntp.toml
[[server]]
listen = "0.0.0.0:123"
[server.allowlist]
filter = ["<ipv4 1>/32", "<ipv4 2>/32", "<ipv6 1>/128"]
action = "ignore"
允许列表和拒绝列表配置在 ntpd-rs 中都是可选的。默认情况下如果配置了服务器,它将接受来自任何地方的流量。在配置允许列表和拒绝列表时,ntpd-rs 将首先检查远程是否在拒绝列表中;只有当情况并非如此时,才会考虑允许列表。
allowlist.action 和 denylist.action 属性可以有两个值:
ignore静默忽略请求deny发送拒绝响应包
如果你不想被扫描到正在提供 NTP 服务,我推荐使用
ignore静默忽略
配置时间池
默认的 ntpd-rs 配置中已经包含了来自 NTPPool 的服务器池,我们可以手动配置其他的源以降低延迟和提高精度:
# /etc/ntpd-rs/ntp.toml
[[source]]
mode = "pool"
address = "ntp.ntsc.ac.cn"
count = 2 # 从服务器池检索两个服务器用于同步时间
[[source]]
mode = "server"
address = "ntp3.aliyun.com" # 单一服务器用于同步时间
[[source]]
mode = "server"
address = "ntp.tencent.com"
这里的 source 支持不同类型的源,源的类型及其简要介绍如下:
server服务器源连接到单个特定的 NTP 服务器。如果连接丢失,将尝试重新连接到源pool服务器池 源通过 DNS 解析主机名来检索多个 NTP 服务器。然后,它会尝试同时连接到多个这样的服务器。如果连接丢失,将从池中检索新服务器nts连接到单个 NTS 源。NTS 协议使用 TLS 握手与服务器交换机密,以允许验证 NTP 消息是否未被篡改socksock 源连接到 GPSd 以从 GPS 接收器获取定时数据。请注意,启动 ntpd-rs 后必须(重新)启动 GPSd,GPSd 才能连接到 ntpdppsPPS 源连接到每秒脉冲设备,默认情况下,该设备每四舍五入一秒发送一个脉冲
使用 ntp-ctl 查看状态
# ntp-ctl
ntp-ctl - NTP 守护进程监控工具
用法
ntp-ctl validate [-c PATH]
ntp-ctl status [-f FORMAT]
ntp-ctl force-sync [-c PATH]
ntp-ctl -h | ntp-ctl -v [-c PATH]
ntp-ctl force-sync [-c PATH]
ntp-ctl -h | ntp-ctl -v
选项
-f, --format 用于打印统计信息的格式 [plain, prometheus]
-c, --config 读取套接字路径的配置文件
-h, --help 显示此帮助文本
-v, --version 显示版本信息
我们需要使用 ntp-ctl status 来查看状态:
# ntp-ctl status
Synchronization status:
Dispersion: 0.001152s, Delay: 0.000048s
Stratum: 3
Sources:
ntp.tencent.com:123/106.55.184.199:123 (4): -0.003312±0.000826(±0.028514)s
poll interval: 1024s, missing polls: 0
root dispersion: 0.035934s, root delay:0.000534s
Servers:
[::]:123: received 28, accepted 11, errors 0
denied 0, nts nak 0, rate limited 0, ignored 17
0x06 使用客户端测试
我们可以使用各类客户端同步时间,以确认服务器是否正常运行,最简单的方式是在另一台机器上安装并配置 ntpd-rs,然后使用 ntp-ctl 查看时间同步进度。
在 Windows 控制中心 -> 日期和时间 -> Internet 时间 里我们可以找到配置 NTP 服务器的地方,配置完成后前往服务器查看状态中 accepted 值是否有变化,随后打开 []time.is](https://time.is/UTC) 查看自己电脑时间是否准确吧!
0x07 安全
(未完待续…)
0x08 总结
至此,我们已经成功在 Debian 13 (Trixie) 系统上部署并配置了 ntpd-rs NTP 服务。通过本文的指引,你不仅搭建了一个功能完整的 NTP 服务器,还掌握了其核心配置项,包括如何启用服务器模式、设置监听地址、配置访问控制列表以及优化时间源选择。
自建 NTP 服务器的意义远不止于让自己的电脑时间更准。在企业级应用中,它是保障系统日志一致性、分布式事务正确性、安全证书有效性乃至整个业务稳定运行的基石。对于追求技术深度的爱好者而言,这也是理解时间同步协议、网络基础设施和系统运维的一个绝佳实践项目。
ntpd-rs 作为一款现代、高性能且安全的 NTP 守护进程,其基于 Rust 编写,具有内存安全和并发处理的优势,非常适合用于生产环境。它提供了灵活的配置选项,能够满足从个人实验室到大型数据中心的各种需求。在我近六个月的生产环境测试中,ntpd-rs 表现出了极高的稳定性和可靠性。如您有任何问题,欢迎随时留言讨论。
参考资料
官方文档与安装指南
公共时间源
- NTP Pool 项目官网 - 提供全球分布的 NTP 服务器池,通过 DNS 实现负载均衡。
- 阿里云 NTP 服务 - 提供低延迟、高可用的公共 NTP 服务,适合作为国内用户的上游时间源。
技术与协议
- Rust 编程语言官网 -
ntpd-rs使用的编程语言,具备内存安全和高性能特性。 - SystemD 服务管理手册 - 提供将
ntpd-rs配置为系统服务的参考文档。 - NTP 协议 RFC 5905 - NTPv4 协议的官方技术规范。