系统时间与NTP服务器不同步,直接修改系统时间只是治标不治本,正确的做法是检查NTP服务状态、网络连通性和时间源配置,这几步能解决绝大多数场景下的同步失败问题。下面我把从原因定位到具体修复的完整过程拆开讲,你可以直接照着操作。
为什么你的系统时间总是不听话
系统时间出现偏差,表象是时间不对,本质上是你和NTP服务器之间的沟通链条断了,这个链条由三部分构成:时间源是否可达、NTP服务是否在运行、系统配置是否指向了正确的服务器。
排查链路的第一步:确认NTP服务器到底能不能连上
很多时候时间不同步,起因就是你的服务器压根访问不到NTP服务器,国内用户尤其容易遇到这个问题不少海外公共NTP服务器(比如操作系统默认的那些)在国内的访问速度很慢,甚至直接被防火墙拦在外面,你可以先做一次最简单的基础测试:
- Windows系统:打开命令提示符,输入
ping ntp.aliyun.com,如果能收到回复,说明网络层面是通的。 - Linux系统:执行
ping ntp.aliyun.com -c 4,同样看丢包率和延迟。
还有一种情况是DNS解析出了问题,导致你的机器找不到NTP服务器地址,可以在命令行里执行nslookup ntp.aliyun.com,如果提示找不到主机,说明你的DNS配置有问题,需要先修正DNS地址。
端口的坑:UDP 123被堵是重灾区
NTP走的是UDP 123端口,这个端口在云服务器和公司内网防火墙里被禁用的概率相当高,如何验证端口通不通?直接在服务器上执行telnet ntp.aliyun.com 123大概率会失败因为telnet是基于TCP的,NTP用的是UDP,所以更靠谱的验证方式是:如果ping得通、DNS解析正常、配置也没错,但时间就是同步不上,基本可以断定是UDP 123被防火墙拦截了,这时候你需要去云平台的安全组或者公司防火墙里放行该端口的出方向规则。
Windows系统时间未与ntp服务器同步的修复实操
Windows系统占了企业桌面端的大头,时间同步失败也是用户反馈最多的问题之一,如果你用的是Windows 10或Windows Server 2019及以上版本,直接按下面的顺序操作。
第一步:强制重置时间同步状态
很多情况下,W32Time服务卡在了某个异常状态,以管理员身份打开命令提示符,逐条执行下面命令:
net stop w32time(停止时间服务)w32tm /unregister(从注册表移除现有配置)w32tm /register(重新注册时间服务)-
net start w32time(重新启动服务) w32tm /resync(手动触发一次同步)
执行完最后一条命令后,用w32tm /query /status查看输出结果,如果显示Source: ntp.aliyun.com且Last Successful Sync Time是刚刚的时间,说明同步成功。
第二步:修改Windows默认的时间服务器地址
Windows系统默认的time.windows.com在国内的同步成功率并不理想,右键点击任务栏右下角时间,依次进入日期和时间设置 → 附加时钟 → Internet 时间 → 更改设置,把服务器地址改成下面任意一个:
ntp.aliyun.com(简米云公共NTP,国内访问速度很快)ntp.tencent.com(腾讯公共NTP)cn.pool.ntp.org(NTP官方中国区池子)
修改完成后点击“立即更新”,如果提示同步成功,问题到此解决。
第三步:解决Hyper-V虚拟机的时间跳变问题
如果你的Windows跑在Hyper-V虚拟机上,时间同步失败还有个特殊原因Hyper-V的时间同步服务会覆盖NTP的校准结果,即使你设置了NTP服务器,宿主机一旦漂移,虚拟机也跟着漂移,这种情况下,你需要在虚拟机设置里关闭“时间同步”这个集成服务,然后重新走一遍NTP同步流程。
Linux服务器NTP同步失败的排查思路更考察功底
Linux运维的老手都知道,解决时间同步问题需要先分清楚你的系统用的是哪个时间同步组件,不同组件有不同脾气。
老牌的ntpd服务还在跑吗
在CentOS 6、7时代,大家都是用ntpd,检查方式非常简单:
- 执行
systemctl status ntpd,看运行状态是不是active (running)。 - 执行
ntpq -p,看远程服务器列表里有没有号开头的一行,代表当前正在同步的服务器。
如果ntpq -p输出为空或者全是,说明配置有问题,打开/etc/ntp.conf文件,把server那几行的地址改为国内时间源,修改后执行systemctl restart ntpd重启服务,再等几分钟看效果。
新一代chrony更适应现代机房环境
CentOS 8、Rocky Linux、Ubuntu 20.04以上系统默认使用chrony来做时间同步,相比老旧的ntpd,粉末带宽更小、同步速度更快,命令也有所不同:
- 查看同步源状态:
chronyc sources -v - 查看详细同步信息:
chronyc tracking
如果chronyc sources显示的时间源状态是^?而不是^,说明同步失败,修改/etc/chrony.conf配置文件里的
server行,改成server ntp.aliyun.com iburst,然后执行systemctl restart chronyd,一两分钟后,chronyc sources应该能看到^标记。
Ubuntu系统上systemd-timesyncd是个小透明
很多Ubuntu桌面用户根本不知道自己系统里跑的是什么时间同步工具,Ubuntu 18.04及以后的版本默认用的是systemd-timesyncd,它不含ntpq等查询命令,导致不少误判,检查方法如下:
- 执行
timedatectl status,看Network time on: yes这一行是否是yes。 - 如果显示no,执行
sudo timedatectl set-ntp true开启。 - 修改时间源配置文件
/etc/systemd/timesyncd.conf,在[Time]段下加一行NTP=ntp.aliyun.com。 - 执行
sudo systemctl restart systemd-timesyncd生效。
值得注意的是,systemd-timesyncd轻量但功能弱,如果你后续接上了精密设备需要亚毫秒级同步,还是得手动换成chrony。
内网环境里搭建企业内部NTP服务器才是根治方案
如果你所在的企业有上百台服务器或网络设备需要时间同步,每台机器都去公网找时间源不是一个好办法,反复的公网请求既增加延迟,又容易被防火墙误判为异常流量,行业共识是拉一台内网机器做时间源,其余设备统一指向它。
Windows Server作为内网NTP时间源的设置路径
很多传统企业的机房都是Windows Server环境,把它变成一台内网时间服务器很简单:
- 在Windows Server上先同步公网时间源。
- 打开注册表编辑器,进入
HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesW32TimeParameters,把Type的值从NTP改为NT5DS。 - 进入
Config子键,把AnnounceFlags的值改成5,允许对外广播。 - 在防火墙里放行UDP 123端口的入站规则。
- 重启W32Time服务。
做完这些操作,同一局域网里的其他机器只需要把时间服务器地址改成这台内网机器IP,就能完成同步,这种方式的同步精度虽然不如专业时间源,但应付日常办公和业务系统足够了。
Linux服务器做内网时间源要考虑的额外细节
用chrony做内网时间源时,/etc/chrony.conf里有几个关键参数和公网同步场景下的配置不同:
local stratum 10:允许本机在无法连接公网时仍对外提供时间服务。allow all:允许局域网内所有客户端来同步。
如果不加local stratum这一行,内网客户端会一直处于“未同步”状态,因为你这台服务器自己都没有同步上公网时间源,这一行配置虽然看起来不起眼,但很多运维新人都会在这一步卡住。
系统时间不同步带来的连锁反应比你想的更严重
时间同步不只是“显示准不准”那么表面化,它可能引发一连串的实际故障:
- 证书校验失败:HTTPS证书有有效期范围,如果本机时间比真实时间快或者慢了好几个小时,访问很多加密网站时会突然报出证书错误,但你在同一台机器上打开浏览器却发现一切都正常。
- 域登录失败:加入Windows域环境的机器,如果时间偏差超过5分钟,和域控的Kerberos认证就会失败,用户会收到密码正确但登录不上的诡异提示。
- 日志无法串联分析:多台服务器的日志时间戳相差太大,排查安全问题的时候,根本没法把同一时间的日志对齐来看,这给故障定位增加了非常大的工作量。
关于时间同步还有几个值得知道的小问题
服务器时间快了8小时,调整后业务数据会不会出问题
如果只是单纯的时间显示错误,直接同步回来即可,但如果业务系统里有大量记录带有时间戳,比如订单表、操作日志表,同步完成后这些数据会表现出时间差,建议同步前先做好数据库备份。对于使用了数据库主从复制的架构,时间跳变可能导致复制中断,保险起见先在维护窗口操作。
为什么笔记本每次开机时间都不对,甚至进不去系统
这多半是主板上的CMOS纽扣电池没电了,导致系统断电后无法保存时间,Windows开机时对于时间偏差过大的情况会拒绝加载某些系统服务,误以为是系统文件损坏,解决办法很简单:换一块主板上型号为CR2032的纽扣电池,几块钱就能解决问题。
同步时钟就会让系统时间变化,测试环境里会有影响吗
在测试环境或演练环境里,有时候故意把时间往后调几天来模拟某些业务场景,如果你手动改了时间,但没停掉NTP服务,过不了几分钟时间就会被强拉回真实时间,这种情况下的处理方式是,用systemctl stop chronyd(或net stop w32time)先停掉服务再去改时间,测完记得手动启动。
最后把核心结论再归纳一遍:系统时间未与ntp服务器同步时,先用ping和防火墙规则排除网络问题,接着确认本机的NTP服务在运行且配置指向了稳定的国内时间源,如果设备数量众多,就在内网搭一台时间服务器统一校准。整个过程不需要高深的专业知识,按顺序排查下来,绝大多数情况下都能找回一个准确的时间。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/745826.html





