Chrony NTP 时间同步服务器部署教程:替代 ntpd,搭建内网 NTP 服务

准确的系统时间是分布式系统、日志审计、SSL 证书验证、数据库事务等众多场景的基础。传统的 ntpd 已有数十年历史,而 Chrony 是其现代替代品,由 Red Hat 主导开发,在精度、稳定性和资源消耗方面均有显著优势。Chrony 能够更好地处理网络延迟抖动,在间歇性网络连接下也能维持良好的时钟精度,是 RHEL 7+、Ubuntu 20.04+ 等主流发行版的默认 NTP 实现。

对于拥有多台服务器的内网环境,搭建私有 NTP 服务器是最佳实践。内网 NTP 服务器从上游公共 NTP 服务器同步时间,再为局域网内所有节点提供时间服务,既减少了对外部网络的依赖,也能将所有内网节点的时钟偏差控制在微秒级别。这对于分布式数据库(如 CockroachDB、TiDB)、Kafka 集群和 Kubernetes 等对时间敏感的系统尤为重要。

本教程将详细介绍 Chrony 的安装配置流程,包括作为 NTP 客户端使用、搭建内网 NTP 服务端,以及使用 chronyc 命令进行时钟精度监控和故障排查。


环境要求

Chrony 对硬件要求极低,任何一台 Linux 服务器都可以胜任 NTP 服务端角色。

推荐使用雨云服务器 rainyun-com,注册填优惠码 2026off 领 5 折优惠券。1 核 2GB 机型完全满足 Chrony NTP 服务的运行需求,Chrony 进程的内存占用通常不超过 10MB,CPU 使用率接近 0%。搭配稳定的网络环境,可为数十台内网服务器提供高精度时间同步服务。操作系统推荐 Ubuntu 22.04 LTS 或 CentOS Stream 9。


安装准备工作

停止并禁用旧版 ntpd(如有)

sudo systemctl stop ntp 2>/dev/null
sudo systemctl disable ntp 2>/dev/null
sudo apt remove -y ntp ntpdate 2>/dev/null

同时禁用 systemd-timesyncd(避免冲突):

sudo systemctl stop systemd-timesyncd
sudo systemctl disable systemd-timesyncd

安装 Chrony

Ubuntu / Debian:

sudo apt update
sudo apt install -y chrony

CentOS / RHEL / Rocky Linux:

sudo dnf install -y chrony

安装完成后 Chrony 会自动启动:

sudo systemctl enable --now chronyd
sudo systemctl status chronyd

确认时区设置

timedatectl status
# 如需修改时区:
sudo timedatectl set-timezone Asia/Shanghai

详细配置

配置文件位置

  • Ubuntu/Debian:/etc/chrony/chrony.conf
  • CentOS/RHEL:/etc/chrony.conf

客户端模式配置

适用于需要从上游 NTP 服务器同步时间的普通节点:

sudo nano /etc/chrony/chrony.conf
# 上游 NTP 服务器(使用 iburst 加速初始同步)
server ntp.aliyun.com iburst prefer
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
server cn.pool.ntp.org iburst

# 允许的时钟偏差(秒),超出时强制步进同步
makestep 1.0 3

# 硬件时钟(RTC)同步
rtcsync

# 记录时钟漂移
driftfile /var/lib/chrony/drift

# 日志目录
logdir /var/log/chrony

# 记录测量统计、追踪和 rtc 信息
log measurements statistics tracking

搭建内网 NTP 服务端

将以下配置部署在专用 NTP 服务器上,同时向上游同步并对内网提供服务:

# 上游时间源(至少配置 3 个以提高可靠性)
server ntp.aliyun.com iburst prefer
server ntp1.aliyun.com iburst
server time1.cloud.tencent.com iburst
server cn.pool.ntp.org iburst

# 本地时钟作为后备(stratum 10,仅在无法连接上游时使用)
local stratum 10

# 允许内网网段访问(按实际网段修改)
allow 192.168.0.0/16
allow 10.0.0.0/8
allow 172.16.0.0/12

# 其他配置
makestep 1.0 3
rtcsync
driftfile /var/lib/chrony/drift
logdir /var/log/chrony
log measurements statistics tracking rtc

# 硬件时间戳(如网卡支持,可大幅提升精度)
# hwtimestamp eth0

重启服务使配置生效:

sudo systemctl restart chronyd

内网客户端配置

将内网其他服务器的 NTP 源指向内网 NTP 服务器(假设其 IP 为 192.168.1.10):

# 优先使用内网 NTP 服务器
server 192.168.1.10 iburst prefer

# 保留外部时间源作为后备
server ntp.aliyun.com iburst

makestep 1.0 3
rtcsync
driftfile /var/lib/chrony/drift
logdir /var/log/chrony

防火墙配置

NTP 使用 UDP 123 端口:

# UFW
sudo ufw allow 123/udp

# firewalld
sudo firewall-cmd --permanent --add-service=ntp
sudo firewall-cmd --reload

# iptables
sudo iptables -A INPUT -p udp --dport 123 -j ACCEPT

进阶用法

chronyc 命令行工具

chronyc 是 Chrony 的交互式管理工具,用于实时监控和管理时间同步状态。

查看时间源状态:

chronyc sources -v

输出示例:

  .-- Source mode  '^' = server, '=' = peer, '#' = local clock.
 / .- Source state '*' = current best, '+' = combined, '-' = not used.
|/   .- Log2(Polling interval) :: Reach :: Last Rx
||   /                  \              /     \
MS Name/IP              Refid   St   Poll Reach LastRx Last sample
=============================================================================
^* ntp.aliyun.com      .ACTL.   1   6     377    22    -82us[ -88us] +/- 1848us
^+ ntp1.aliyun.com     .ACTL.   1   7     377    21   +234us[ +231us] +/- 3412us

* 表示当前使用的最佳时间源,+ 表示参与组合计算的源。

查看时钟跟踪信息:

chronyc tracking

输出示例:

Reference ID    : 6BD7...  (ntp.aliyun.com)
Stratum         : 2
Ref time (UTC)  : Mon Jun 01 10:00:00 2026
System time     : 0.000082341 seconds fast of NTP time
Last offset     : +0.000019234 seconds
RMS offset      : 0.000043210 seconds
Frequency       : 12.345 ppm slow
Residual freq   : +0.003 ppm
Skew            : 0.127 ppm
Root delay      : 0.001834 seconds
Root dispersion : 0.000891 seconds
Update interval : 64.2 seconds
Leap status     : Normal

强制立即同步:

sudo chronyc makestep

查看 NTP 统计信息:

chronyc sourcestats -v

精度调优

调整轮询间隔:

# 最小和最大轮询间隔(单位:2^n 秒)
server ntp.aliyun.com iburst minpoll 4 maxpoll 6
# 2^4=16秒 到 2^6=64秒 之间动态调整

提高精度的额外配置:

# 增加测量样本数,提高时钟校正精度
minsources 2

# 允许的最大时钟倾斜(ppm)
maxdistance 1.5

# 拒绝 stratum 过高的时间源
maxdistance 0.1

监控脚本

编写一个简单的时钟偏差监控脚本:

#!/bin/bash
# /usr/local/bin/check_chrony.sh

OFFSET=$(chronyc tracking | grep "System time" | awk '{print $4}')
THRESHOLD=0.1  # 100ms

if (( $(echo "$OFFSET > $THRESHOLD" | bc -l) )); then
    echo "WARNING: NTP offset ${OFFSET}s exceeds threshold ${THRESHOLD}s"
    exit 1
fi
echo "OK: NTP offset is ${OFFSET}s"
exit 0

实战示例

搭建高可用双节点 NTP 集群

在两台服务器(192.168.1.10 和 192.168.1.11)上配置互为 peer:

# 两台服务器均添加以下配置
peer 192.168.1.10 iburst    # 在 .11 上添加
peer 192.168.1.11 iburst    # 在 .10 上添加

# 上游时间源
server ntp.aliyun.com iburst prefer
server cn.pool.ntp.org iburst

allow 192.168.0.0/16
local stratum 10

Kubernetes 集群时间同步最佳实践

在 K8s 环境中,确保所有节点时钟误差小于 1 秒(etcd 要求):

# 在所有 K8s 节点执行
sudo chronyc makestep
chronyc tracking | grep "System time"

# 验证偏差
for node in 192.168.1.{1..10}; do
    echo -n "$node: "
    ssh $node "chronyc tracking | grep 'System time'"
done

常见问题

Q:chronyc sources 显示 “?” 状态,时间源无法连接

A:检查防火墙是否放开了 UDP 123 出站端口,以及 NTP 服务器域名能否正常解析。可用 ntpdate -q ntp.aliyun.com 测试连通性。

Q:系统时间突然跳变

A:这是 makestep 配置触发的强制步进同步,属于正常行为。若不希望时钟跳变,可将 makestep 中的允许次数改为 0(仅开机时允许跳步):makestep 1.0 -1(仅在偏差超过1秒时才允许步进)。

Q:内网客户端无法连接内网 NTP 服务器

A:确认服务端 chrony.confallow 指令包含了客户端所在网段,并检查服务端防火墙 UDP 123 端口是否开放。

Q:stratum 值为什么这么大?

A:stratum 表示距参考时钟的层数。公共 NTP 服务器通常是 stratum 1-2,内网 NTP 服务器将是 stratum 2-3,内网客户端则是 stratum 3-4。stratum 越小精度越高,但 stratum 16 以内均为有效同步状态。

Q:如何查看历史时钟偏差?

A:如果开启了 log 选项,日志文件保存在 /var/log/chrony/ 目录下:

cat /var/log/chrony/statistics.log | tail -20

Chrony 以极低的资源占用提供了远超 ntpd 的时钟精度,是现代 Linux 环境时间同步的首选方案。无论是单台服务器的简单同步需求,还是数百节点集群的内网 NTP 基础设施,Chrony 都能胜任。如果你正在寻找一台稳定、低成本的服务器来部署内网 NTP 服务,推荐雨云服务器 rainyun-com1 核 2GB 机型,注册填优惠码 2026off 即可领取 5 折优惠券,轻松搭建属于自己的时间同步基础设施。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐