在现代 IT 基础设施中,精确一致的系统时间至关重要。无论是分布式数据库的事务排序、日志审计的事件关联、安全证书的有效性校验,还是 Kubernetes 集群的调度,都要求所有节点系统的时间偏差控制在毫秒甚至微秒级。而网络时间协议(Network Time Protocol,NTP)正是解决这一问题的工业标准,它能让网络中的计算机系统与权威时间源同步,并补偿网络延迟。 我根据多年经验以 Linux CentOS 操作系统为基座,完整给大家讲解如何从零搭建一台企业生产级 NTP 服务器,希望能给大家带来帮助。1、服务器环境:
2、客户端环境:
3、基础设置:
1)设定主机名hostnamectl set-hostname ntp-master.XXX.com 2)确认网络连通性,能访问互联网(方便初始同步公网上游时间源)ping 8.8.8.8 3)关闭或正确配置 firewalld / iptables(稍后详细介绍)systemctl status firewalld 4)确认时区timedatectl set-timezone Asia/Shanghaitimedatectl status 5)禁用默认的 chronyd 或 ntpd 冲突服务(如有),确保服务器环境干净。systemctl stop chronyd ntpd 2>/dev/nullsystemctl disable chronyd ntpd 2>/dev/null
二、使用 Chrony 搭建 NTP 服务器
1、安装 Chrony
yum install -y chrony
安装后,对主配置文件/etc/chrony.conf进行配置。
2、 配置 NTP 服务器
编辑 /etc/chrony.conf,构建一台同时作为客户端(向上游同步)和服务端(向下游提供时间)的 NTP 服务器。
1)上游时间源配置
使用国内稳定的 NTP Pool 或权威机构源,提高同步速度和可靠性。
建议配置多条 server 或 pool 指令:
# 使用 NTP 项目池,iburst 加速初始同步pool cn.XXX.ntp.org iburstpool ntp.aliyun.com iburstpool time1.cloud.tencent.com iburst# 可指定国家授时中心server ntp.ntsc.ac.cn iburst
解释:
pool 会从域名解析的多个 IP 中随机选择,实现负载均衡和冗余。
iburst:在初始不可达时,以 2 秒间隔发送 8 个包,这样大幅加快初次同步的速度。
生产环境建议至少配置 3 台NTP上游服务器,保证冗余性。
2)下游内网NTP客户端IP访问配置
添加 allow 指令,指定哪些内网网段或 IP 可以同步本服务器的时间服务:
# 允许内网客户端查询allow 192.168.10.0/24allow 10.10.0.0/16
注意:若不添加 allow,服务器默认仅允许本机访问。
3)本机时间偏移记录
Chrony 会记录系统时钟的漂移率,保存在 driftfile 中,以在离线时仍能保持较好的时间精度。
driftfile /var/lib/chrony/drift
4) 启用实时时钟同步
编辑 /etc/sysconfig/chronyd或在配置文件中添加 rtcsync 指令,确保系统时钟与硬件时钟(RTC)保持同步:
# 在 chrony.conf 中添加rtcsync
5)日志配置
建议开启测量、统计、追踪等日志,便于后期审计和排错:
logdir /var/log/chronylog measurements statistics tracking
6)完整配置示例(/etc/chrony.conf)
# 上游时间源pool cn.XXX.ntp.org iburstpool ntp.aliyun.com iburstpool time1.cloud.tencent.com iburstserver ntp.ntsc.ac.cn iburst# 漂移文件driftfile /var/lib/chrony/drift# 硬件时钟同步rtcsync# 允许内网客户端访问allow 192.168.10.0/24allow 10.10.0.0/16# 日志logdir /var/log/chronylog measurements statistics tracking# 当上游不可用时,仍允许作为时间源向客户端提供服务(即使同步失败)local stratum 10# 不监听除本机和指定接口以外的地址,可按需绑定# bindcmdaddress 0.0.0.0 # 允许远程使用 chronyc 管理
注意:local stratum 10 一行表示:即使与所有上游源失联,本机仍可以 Stratum 10 的层级向客户端提供时间,避免客户端完全失去时间参考,这个在生产环境中十分很重要。
3、防火墙放行 NTP 服务端口
NTP 服务使用 UDP 123 端口,若使用 firewalld:
firewall-cmd --permanent--add-service=ntpfirewall-cmd --reloadfirewall-cmd --list-services# 验证
若使用 iptables:
iptables -A INPUT -p udp --dport123-j ACCEPTservice iptables save
4、启动并验证服务
systemctl enable chronydsystemctl start chronydsystemctl status chronyd
5、检查同步状态
使用 chronyc 命令行工具:
# 查看当前时间源及状态chronyc sources -v
输出中,^* 表示当前正在同步的源,^+ 表示候选源,^? 表示连接异常。
# 查看详细同步统计chronyc sourcestats -v# 查看本机系统时间与 NTP 时间的偏差chronyc tracking
tracking 输出中 System time 的偏移量应在毫秒级,Stratum 应为上游源的 Stratum+1。当 Leap status 为 Normal 表示时间无闰秒调整。
# 查看本机允许的客户端chronyc clients
6、配置 Chrony 作为纯时间服务器(无外网或无需与外部服务器同步)
若本机需要作为孤立的权威时间源(如封闭内网无互联网),可将配置简化如下:
local stratum 10allow 192.168.10.0/24driftfile /var/lib/chrony/driftrtcsynclogdir /var/log/chrony
并将上游 server 行全部注释或删除。这样本机以 Stratum 10作为网络时间基准,所有客户端与其同步。
客户端Linux系统同样推荐使用 Chrony,兼容 CentOS 7/8/9。
1、客户端安装 Chrony
yum install -y chrony
2、 配置 /etc/chrony.conf
# 指向内部 NTP 服务器server ntp-master.XXX.com iburst# 也可写 IPserver 192.168.10.10 iburstdriftfile /var/lib/chrony/driftrtcsynclogdir /var/log/chrony
注意:客户端不需要 allow 指令,也不设置 local stratum。
3、启动并强制同步
systemctl enable --now chronyd# 立即手动同步(大偏差时)chronyc -a makestep
注意:若客户端与服务器时间差异过大(默认 >1000 秒),Chrony 可能不会逐步调整,需要 makestep 强制跳变。
tail -f /var/log/chrony/tracking.logtail -f /var/log/chrony/statistics.logtail -f /var/log/ntp.log
关注频繁的源切换、同步失败信息。
NTP Pool 项目会动态分配服务器,但偶尔会出现某些上游不可靠,故需要定期验证 chronyc sources -v 中的 Reach 和 offset,必要时更换上游server。# 检查系统时间和硬件时间timedatectl# 将系统时间写入硬件时钟hwclock --systohc
注意:配置文件中 rtcsync 已让 chronyd 自动维护硬件时钟,无需手动执行。
通过本文介绍,相信大家可以在 CentOS 环境中构建一套企业级 NTP 时间服务器,具体步骤包括:
选择 Chrony 作为现代 NTP 守护进程,获得快速同步和良好性;
合理配置上游时间源池,保证冗余性与可靠性;
通过 allow 和防火墙精确控制客户端IP范围;
客户端统一指向内部 NTP 服务器,形成全内网一致的时间基线;
建立监控与故障排查机制,确保时间服务持续健康。
精确的时间如同网络的 “心跳”,是保障分布式系统有序运行的基石。
时间服务是基础设施中微小但极重要的一环,希望这篇教程能够帮助您深入理解并成功实施!