在内网Ubuntu 24.04.2 LTS上配置NTP时间同步服务的完整解决方案
主机/服务规划:
192.168.100.211/24 作为内网的授时服务器Time Server,其时间来自于外网中国境内的时钟服务器,在首次安装时完成时钟同步。
192.168.100.210/24 作为客户端Time Client,从Time Server处同步时间。
内网中其他主机192.168.100.*/24 也都从Time Server处同步时间,即对应授时服务地址配置为:192.168.100.211:123
一、共同配置 (192.168.100.211和192.168.100.210)
在TimeServer和TimeClient上都执行以下操作
- (可选)检查机器操作系统和内核版本是否一致:
hostnamectl
- (可选)设置内网机器的代理,便于在线安装软件:
sudo export http_proxy="http://192.168.100.222:8118"
上面首先需要在同时能连接外网和内网的机器192.168.100.222上搭建了代理,并开放了8118端口。
搭建代理可以使用轻量级的privoxy,下载链接。
- (可选)替换官方源为清华源,便于网络访问:
# 替换源为清华源
sudo cp /etc/apt/sources.list.d/webmin.list /etc/apt/sources.list.d/webmin.list.bak
sudo cp /etc/apt/sources.list.d/ubuntu.sources /etc/apt/sources.list.d/ubuntu.sources.bak
sudo sed -i 's|http://.*archive.ubuntu.com|https://mirrors.tuna.tsinghua.edu.cn|g' /etc/apt/sources.list.d/ubuntu.sources
sudo sed -i 's|http://.*security.ubuntu.com|https://mirrors.tuna.tsinghua.edu.cn|g' /etc/apt/sources.list.d/ubuntu.sources
sudo tee /etc/apt/sources.list.d/webmin.list <<'EOF'
deb https://mirrors.tuna.tsinghua.edu.cn/webmin/download/repository sarge contrib
EOF
sudo apt update
- 排除所有对时间服务可能的干扰项或残留:
sudo systemctl stop chrony chronyd ntp ntpd systemd-timesyncd # 停掉所有时间相关服务
sudo systemctl disable chrony chronyd ntp ntpd systemd-timesyncd # 禁用所有时间相关服务
# 删除所有可能的残留服务文件
sudo rm -f /etc/systemd/system/ntp.service /etc/systemd/system/chrony.service /etc/systemd/system/multi-usem/multi-user.target.wants/chrony.service
sudo systemctl disable chrony chronyd ntp ntpd systemd-timesyncd
# 重新加载systemd
sudo systemctl daemon-reload
sudo pkill -9 chronyd || true
sudo pkill -9 ntpd || true
# 强制卸载所有相关包(即使报错也继续)
sudo apt purge --allow-remove-essential ntp chrony -y
sudo apt autoremove -y
# 检查dpkg状态
sudo dpkg --configure -a
sudo apt --fix-broken install
# 重建systemd单元数据库
sudo systemctl reset-failed
# 检查服务状态(应该显示"not-found")
systemctl status ntp chrony 2>&1 | grep -i "could not be found"
# 检查进程(应该无输出)
pgrep -l chronyd || pgrep -l ntpd
- 彻底配置系统时区为东八区时区,以防应用程序时区不统一导致问题:
# 1. 设置系统时区(自动更新所有相关文件)
sudo timedatectl set-timezone Asia/Shanghai
# 2. 手动验证关键文件
cat /etc/timezone # 应显示 "Asia/Shanghai"
ls -l /etc/localtime # 应指向 "/usr/share/zoneinfo/Asia/Shanghai"
date # 时间应显示 CST (China Standard Time)
# 3. 如果文件未自动更新,手动修复
echo "Asia/Shanghai" | sudo tee /etc/timezone
sudo ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
上述时区配置完成后,深度验证Java时区来源
# 创建时区检测工具类
cat > TimeZoneDebug.java <<'EOF'
public class TimeZoneDebug {
public static void main(String[] args) {
System.out.println("System Property: " + System.getProperty("user.timezone"));
System.out.println("Default TimeZone: " + java.util.TimeZone.getDefault().getID());
System.out.println("OS TimeZone File: " + new java.io.File("/etc/timezone").exists());
try {
System.out.println("File Content: " + java.nio.file.Files.readString(
java.nio.file.Paths.get("/etc/timezone")).trim());
} catch (Exception e) { e.printStackTrace(); }
}
}
EOF
# 编译运行(观察所有输出必须指向Asia/Shanghai)
javac TimeZoneDebug.java && java TimeZoneDebug
期望输出为:
System Property: Asia/Shanghai 或 null
Default TimeZone: Asia/Shanghai
OS TimeZone File: true
File Content: Asia/Shanghai
二、Time Server配置 (192.168.100.211)
- 安装NTP服务:
sudo apt update
sudo apt install chrony -y
- 配置chrony(使用中国境内的NTP服务器):
sudo nano /etc/chrony/chrony.conf
修改为以下内容(保留原有注释):
pool ntp.ntsc.ac.cn iburst
pool cn.ntp.org.cn iburst
pool time1.cloud.tencent.com iburst
pool time2.cloud.tencent.com iburst
# 允许内网网段访问
allow 192.168.100.0/24
# 启用本地时间源(当外部源不可用时)
local stratum 10
# 其他保持默认
- 重启chrony服务并设置开机自启:
sudo systemctl restart chrony
sudo systemctl enable chrony
- 检查同步状态:
chronyc sources -v
chronyc tracking
三、Time Client配置 (192.168.100.210)
- 同样安装chrony:
sudo apt update
sudo apt install chrony -y
- 配置chrony指向内网服务器:
sudo nano /etc/chrony/chrony.conf
修改为:
# 注释掉默认的pool配置
# pool 2.debian.pool.ntp.org offline iburst
# 添加内网时间服务器
server 192.168.100.211 iburst
# 如果时间服务器不可用,允许使用本地时间
local stratum 10
- 重启服务:
sudo systemctl restart chrony
sudo systemctl enable chrony
- 检查同步状态:
chronyc sources -v
chronyc tracking
三、验证配置
在Time Server上检查客户端连接:
chronyc clients
在Time Client上手动触发同步:
sudo chronyc makestep
四、防火墙配置(如有需要)
在Time Server上允许NTP端口(123/udp):
sudo ufw allow from 192.168.100.0/24 to any port 123 proto udp
sudo ufw enable
五、注意事项
- 确保两台主机间网络畅通,无防火墙阻挡UDP 123端口
- 初始同步可能需要几分钟时间
- 如需更强制同步,可在客户端执行:
sudo chronyc -a 'burst 4/4' sudo chronyc -a makestep
- 中国境内推荐NTP服务器列表:
- 国家授时中心:ntp.ntsc.ac.cn
- 腾讯云:time[1-5].cloud.tencent.com
- 阿里云:time[1-7].aliyun.com
- 如果时间同步不成功,可能是因为时间偏差太大导致(超过8小时),需要先手动设置时间后再同步:
sudo systemctl stop chrony sudo date -s "2025-05-30 11:10:53" # 手动设置正确时间 sudo systemctl start chrony chronyc tracking # 检查是否同步
六、排错命令
- 检查服务状态:
systemctl status chrony
- 查看详细同步信息:
chronyc tracking
chronyc sources -v
- 检查NTP端口是否监听:
ss -unlp | grep chronyd
这种配置方案使用了chrony而非传统的ntpd,因为chrony在现代Linux系统上表现更好,特别是对于不总是联网的系统,且能更快地同步时间。