凌峰创科服务平台

Linux NTP服务器如何搭建?

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

Linux NTP服务器如何搭建?-图1
(图片来源网络,侵删)

环境准备与软件安装

在搭建之前,首先需要明确服务器的角色:这台Linux机器将作为“服务端”,负责从互联网获取标准时间,并作为“时钟源”向内网其他客户端提供时间服务。

系统时间校准

在安装NTP服务之前,建议先手动校准一下系统时间,以免时间偏差过大导致同步失败,可以使用 timedatectl 命令查看当前时间状态:

timedatectl status

如果时区不正确(例如不是Asia/Shanghai),可以使用以下命令修改:

timedatectl set-timezone Asia/Shanghai

安装NTP软件

目前主流的Linux发行版中,NTP软件主要有两种选择:传统的 ntp(即ntpdate和ntpd守护进程)和现代的 chrony,虽然 chrony 在频繁启停或虚拟化环境中表现更好,但传统的 ntp 配置文件结构清晰,通用性强,依然是很多运维人员的首选。

Linux NTP服务器如何搭建?-图2
(图片来源网络,侵删)

对于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 ...,则说明同步成功。

常见问题排查

在搭建过程中,如果发现客户端无法同步,常见原因通常有以下几点:

  1. 防火墙拦截:最常见的问题,务必确认服务器端UDP 123端口开放。
  2. 时间跨度太大:如果服务器时间与真实时间相差太大(例如几年),NTP守护进程会拒绝同步,此时需先手动使用 ntpdate 强制同步一次,再启动 ntpd
  3. 配置文件语法错误:修改配置文件后,建议使用 ntpd -d 调试模式查看是否有报错信息。

相关问答FAQs

Q1: NTP服务启动后,查看状态发现 ntpq -p 中的 reach 值一直是 0,无法同步怎么办?

A1: reach 值为 0 表示服务器从未成功与上级时间源通信,请按以下步骤排查:

  1. 检查网络连通性:在服务器上 ping 一下配置文件中的公网NTP服务器(如 ping ntp.aliyun.com),确保DNS解析正常且网络通畅。
  2. 检查防火墙:NTP使用UDP协议,普通的ping(ICMP)通了不代表UDP端口开放,可以使用 nc -vuz ntp.aliyun.com 123 测试UDP端口连通性。
  3. 检查配置文件:确认 /etc/ntp.conf 中没有拼写错误,且没有配置 restrict default ignore 这种拒绝所有的规则。
  4. 查看日志:查看 /var/log/messages 或使用 journalctl -u ntpd 查看具体报错信息,通常会提示“no server suitable for synchronization found”。

Q2: 为什么在客户端执行 ntpdate 命令时提示 "the NTP socket is in use, exiting"?

A2: 这个错误提示意味着 NTP 套接字已被占用,通常是因为你的客户端机器上已经运行了 ntpd 守护进程。ntpdatentpd 不能同时运行,因为它们都需要占用 123 端口。 解决方法如下:

  1. 如果你只是想手动强制同步一次时间,请先停止 NTP 服务:systemctl stop ntpd
  2. 然后再次执行 ntpdate <服务器IP>
  3. 同步完成后,如果需要保持自动同步,再启动服务:systemctl start ntpd
  4. 或者,你可以直接使用 ntpd 服务进行平滑同步,而不需要手动执行 ntpdate,这也是生产环境推荐的做法。
分享:
扫描分享到社交APP
上一篇
下一篇