Windows 自带Windows Time(w32time) 服务就能当 NTP Server 用,不用装第三方软件。下面给你一套工作组/局域网环境可用的标准做法(Win10/11、Windows Server 通用)。
一、核心原理
NTP 走UDP 123
w32time 默认只做客户端,要对外提供服务需改注册表:
NtpServer\Enabled = 1开启服务端Config\AnnounceFlags = 5声明自己是“可靠时间源”
如果是域控,NTP Server 默认已开,只需调上游时间源
二、服务端配置(管理员 CMD / PowerShell)
1. 开启 NTP Server 功能
reg add HKLM\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer /v Enabled /t REG_DWORD /d 1 /f2. 声明为可靠时间源
reg add HKLM\SYSTEM\CurrentControlSet\Services\W32Time\Config /v AnnounceFlags /t REG_DWORD /d 5 /f若这台机器本身连不上外网上游、又希望强行对外授时,可改成
0xA(不依赖上游也可宣告自己可靠)。
3.(可选)指定自己先跟谁同步
如果本机时间不准,先让它跟公网 NTP 对齐:
reg add HKLM\SYSTEM\CurrentControlSet\Services\W32Time\Parameters /v Type /t REG_SZ /d NTP /f reg add HKLM\SYSTEM\CurrentControlSet\Services\W32Time\Parameters /v NtpServer /t REG_SZ /d "ntp.aliyun.com,0x1 time.windows.com,0x1" /f每个 NTP 地址后面必须带
,0x1,否则 SpecialPoll 模式不生效。
4. 重启时间服务
net stop w32time net start w32time(建议把 Windows Time 服务启动类型设为“自动”)
5. 放行防火墙 UDP 123 入站
netsh advfirewall firewall add rule name="NTP Server" protocol=udp dir=in localport=123 action=allow或用 PowerShell:
New-NetFirewallRule -DisplayName "NTP Server" -Direction Inbound -Protocol UDP -LocalPort 123 -Action Allow三、验证服务端是否正常
在本机:
w32tm /query /status netstat -an | findstr :123看到UDP 0.0.0.0:123监听即成功。
从局域网另一台机器测:
w32tm /stripchart /computer:192.168.1.100 /samples:5能出 offset 曲线就通了。
四、客户端怎么连
Windows 客户端(管理员):
w32tm /config /manualpeerlist:"192.168.1.100,0x8" /syncfromflags:manual /reliable:no /update net stop w32time && net start w32time w32tm /resyncLinux 客户端:
ntpdate -q 192.168.1.100 # 或写进 /etc/ntp.conf -> server 192.168.1.100 iburst五、常见坑
改完注册表没重启 w32time → 不生效
防火墙只开 TCP 123 → NTP 是 UDP,必须 UDP
AnnounceFlags 没改 → 客户端认为“这不是可靠源”不去同步
本机时间差太大(>MaxPos/NegPhaseCorrection) → 拒绝跳变,需先手动近似对时
虚拟机 → 优先用 Hyper-V/VMware 自带时钟同步,再叠加 NTP,避免漂移打架