在现代网络环境中,时间同步对于服务器集群、分布式系统、日志审计以及金融交易等场景至关重要,网络时间协议(NTP,Network Time Protocol)是用于在计算机网络中同步时钟的标准协议,在Linux环境下搭建一台专属的NTP服务器,不仅能确保内网设备时间的精准统一,还能有效减少对外部公网NTP服务的依赖,提升网络安全性,以下将详细介绍如何在Linux系统(以CentOS 7/8及Ubuntu为例)上从零开始搭建、配置并优化NTP服务器。

环境准备与软件安装
在搭建之前,首先需要明确服务器的角色:这台Linux机器将作为“服务端”,负责从互联网获取标准时间,并作为“时钟源”向内网其他客户端提供时间服务。
系统时间校准
在安装NTP服务之前,建议先手动校准一下系统时间,以免时间偏差过大导致同步失败,可以使用 timedatectl 命令查看当前时间状态:
timedatectl status
如果时区不正确(例如不是Asia/Shanghai),可以使用以下命令修改:
timedatectl set-timezone Asia/Shanghai
安装NTP软件
目前主流的Linux发行版中,NTP软件主要有两种选择:传统的 ntp(即ntpdate和ntpd守护进程)和现代的 chrony,虽然 chrony 在频繁启停或虚拟化环境中表现更好,但传统的 ntp 配置文件结构清晰,通用性强,依然是很多运维人员的首选。

对于CentOS/RHEL系统:
# 检查是否已安装 rpm -qa | grep ntp # 若未安装,执行安装 yum install ntp ntpdate -y
对于Ubuntu/Debian系统:
sudo apt-get update sudo apt-get install ntp ntpdate -y
安装完成后,系统通常会自动创建好 /etc/ntp.conf 配置文件。
核心配置文件详解
NTP服务的核心在于 /etc/ntp.conf 文件的配置,我们需要配置上游时间服务器(即NTP服务器从哪里获取时间)以及访问控制策略(允许哪些客户端来同步时间)。
使用文本编辑器(如vim)打开配置文件:
vim /etc/ntp.conf
配置上游时间服务器
在配置文件中,server 指令用于指定上级时间源,为了保证高可用性,通常建议配置3-5个外部时间源,可以使用中国国家授时中心的公网服务器,或者阿里云、腾讯云等公共NTP服务器。
配置示例:
# 使用阿里云公共NTP服务器 server ntp.aliyun.com iburst server ntp1.aliyun.com iburst # 使用腾讯云公共NTP服务器 server time.cloud.tencent.com iburst # 使用国家授时中心 server cn.ntp.org.cn iburst
注:iburst 参数的作用是,当NTP服务启动时,如果无法立即联系到服务器,它会发送一连串的数据包进行快速同步,而不是等待常规的轮询间隔,这能显著加快初始同步速度。
权限控制与内网广播
默认情况下,NTP服务可能只允许本机访问,为了让内网其他机器能同步时间,必须修改 restrict 参数。
假设NTP服务器的内网IP段是 168.1.0/24,我们需要添加如下规则:
# 允许192.168.1.0网段的所有主机进行时间查询和同步,但不允许修改服务器时间 restrict 192.168.1.0 mask 255.255.255.0 nomodify notrap
如果不加 nomodify notrap,客户端可能会拥有修改服务器时间的权限,这在生产环境中是不安全的。
确保保留默认的本地回环权限:
restrict 127.0.0.1 restrict ::1
本地时钟层级配置
如果NTP服务器暂时无法连接互联网(例如断网),为了保证它依然能作为时钟源为内网服务(虽然此时时间可能不准,但能保证内网一致性),通常会启用本地时钟作为备用源,这需要配置 fudge 指令将本地时钟定义为层级10(Stratum 10)。
在配置文件中添加或取消注释以下内容:
server 127.127.1.0 fudge 127.127.1.0 stratum 10
这表示:当外部服务器不可用时,使用本地硬件时间作为时间源,且优先级较低(Stratum 10)。
服务启动与防火墙设置
配置修改完成后,需要重启服务并开放防火墙端口。
启动NTP服务
CentOS 7/8 / Ubuntu:
# 启动服务 systemctl start ntpd # 设置开机自启 systemctl enable ntpd
防火墙配置
NTP服务使用的是UDP协议的123端口,如果Linux防火墙开启,外部客户端将无法连接,必须放行该端口。
使用Firewalld(CentOS默认):
firewall-cmd --permanent --add-service=ntp # 或者直接指定端口 firewall-cmd --permanent --add-port=123/udp # 重载防火墙 firewall-cmd --reload
使用UFW(Ubuntu默认):
sudo ufw allow ntp # 或者 sudo ufw allow 123/udp
验证与客户端测试
服务器端验证
在服务器端,可以使用 ntpq -p 命令查看同步状态。
ntpq -p
输出结果如下表所示(示例):
| remote | refid | st | t | when | poll | reach | delay | offset | jitter |
|---|---|---|---|---|---|---|---|---|---|
| *time.cloudflare | 85.9.21 | 3 | u | 45 | 64 | 377 | 234 | -0.456 | 123 |
| +ntp.aliyun.com | 137.55.2 | 2 | u | 12 | 64 | 377 | 987 | 123 | 045 |
-
remote: 远程时间服务器名称。
-
refid: 远程服务器的时间源ID。
-
st (Stratum): 层级,数字越小越精准(1通常代表原子钟,2代表一级服务器)。
-
when: 上次同步距今的时间(秒)。
-
reach: 这是一个八进制数,377表示最近8次同步都成功。
-
delay: 网络延迟。
-
offset: 时间偏移量,越接近0越好。
-
jitter: 抖动值,越小越好。
-
符号说明:
- 表示当前选中的主同步源。
- 表示合格的备用源。
- 表示被算法排除的源。
客户端测试
在内网另一台Linux机器上,修改 /etc/ntp.conf,将server指向刚才搭建的服务器IP(假设为192.168.1.100):
server 192.168.1.100 iburst
然后重启客户端的NTP服务,并使用 ntpdate 命令手动强制同步一次以测试连通性:
ntpdate -u 192.168.1.100
如果输出显示 adjust time server 192.168.1.100 offset ...,则说明同步成功。
常见问题排查
在搭建过程中,如果发现客户端无法同步,常见原因通常有以下几点:
- 防火墙拦截:最常见的问题,务必确认服务器端UDP 123端口开放。
- 时间跨度太大:如果服务器时间与真实时间相差太大(例如几年),NTP守护进程会拒绝同步,此时需先手动使用
ntpdate强制同步一次,再启动ntpd。 - 配置文件语法错误:修改配置文件后,建议使用
ntpd -d调试模式查看是否有报错信息。
相关问答FAQs
Q1: NTP服务启动后,查看状态发现 ntpq -p 中的 reach 值一直是 0,无法同步怎么办?
A1: reach 值为 0 表示服务器从未成功与上级时间源通信,请按以下步骤排查:
- 检查网络连通性:在服务器上
ping一下配置文件中的公网NTP服务器(如 ping ntp.aliyun.com),确保DNS解析正常且网络通畅。 - 检查防火墙:NTP使用UDP协议,普通的ping(ICMP)通了不代表UDP端口开放,可以使用
nc -vuz ntp.aliyun.com 123测试UDP端口连通性。 - 检查配置文件:确认
/etc/ntp.conf中没有拼写错误,且没有配置restrict default ignore这种拒绝所有的规则。 - 查看日志:查看
/var/log/messages或使用journalctl -u ntpd查看具体报错信息,通常会提示“no server suitable for synchronization found”。
Q2: 为什么在客户端执行 ntpdate 命令时提示 "the NTP socket is in use, exiting"?
A2: 这个错误提示意味着 NTP 套接字已被占用,通常是因为你的客户端机器上已经运行了 ntpd 守护进程。ntpdate 和 ntpd 不能同时运行,因为它们都需要占用 123 端口。
解决方法如下:
- 如果你只是想手动强制同步一次时间,请先停止 NTP 服务:
systemctl stop ntpd。 - 然后再次执行
ntpdate <服务器IP>。 - 同步完成后,如果需要保持自动同步,再启动服务:
systemctl start ntpd。 - 或者,你可以直接使用
ntpd服务进行平滑同步,而不需要手动执行ntpdate,这也是生产环境推荐的做法。
