我有三台 Windows 计算机,我正尝试将它们同步到 NTP 服务器。但所有计算机都无法同步。我已确认通过从 WSL 连接,NTP 服务器运行正常。
这是我尝试过的:
我已windows time
在 Windows 服务中启用。
我试过了Control panel -> date and time -> internet clocks -> input server -> sync
。失败了
我已经在提升的提示中尝试过了:
w32tm /resync /rediscover
此错误:The computer did not resync because no time data was available
我已尝试手动配置:
w32tm /config /manualpeerlist:<ip> /syncfromflags:manual
这报告成功但实际上并没有设定时间......
我尝试将其关闭然后再次打开:
net stop w32time
net start w32time
w32tm /config /update
w32tm /resync /rediscover
我也尝试过重新启动以及在网上找到的上述所有其他组合,但得到的结果相同。
我尝试使用pool.ntp.org
并得到了相同的结果。
然后我尝试了telnet <ip> 123
,它报告说服务器无法访问。
ping <ip>
工作正常。
在 WSL(ubuntu)中,sudo ntpdate -q <ip>
可以正常工作。
我已禁用所有机器上的防火墙。
答案1
您的网络之外很可能还有另一个防火墙,它试图无状态地阻止所有入站NTP 请求(可能作为某种 DDoS 预防),但也会导致阻止某些类型的 NTP 响应。
然后我尝试了
telnet <ip> 123
,它报告说服务器无法访问。
NTP 完全通过 UDP 运行;它不使用 TCP。
在 WSL(ubuntu)中,
sudo ntpdate -q <ip>
可以正常工作。
NTP 有两种模式:客户端-服务器模式和对称模式。它们以 UDP 端口来区分,这有点不寻常:客户端-服务器使用典型的模型,其中源端口号是随机选择的,而对称模式则使用 123 作为目标和源端口(在其他协议中很少甚至从未见过该端口)。
如果您查看 Wireshark 中的实际数据包,您会看到:
ntpdate
使用客户端-服务器模式,因此它从随机端口发送数据包;响应通过该随机端口到达您的系统。Windows 使用对称模式,因此它从端口 123 发送数据包;这意味着来自服务器的响应被发送到你这边的端口 123,使它们看起来就像一个要求在无状态防火墙眼中。
众所周知,有几家 ISP 会阻止后者,例如,我发现论坛帖子称 AT&T 因阻止后者而臭名昭著。
我认为您无法改变 Windows 时间服务在这方面的工作方式;您唯一的选择可能是 a) 为您的 LAN 运行一个小型本地 NTP 服务器,然后使用未被阻止的模式同步到某些上游 NTP;或 b) 运行可通过 IPsec 或某种 VPN 访问的外部 NTP 服务器。
(有时这也取决于你的路由器——许多路由器以这样的方式实现 NAT,它强行改变 UDP 数据包的源端口,因此即使 Windows 确实从端口 123 发送数据包,执行阻止的 ISP 也可能永远不会看到它,这要归功于路由器的 NAT 隐藏了它,并且一切似乎都运行正常。
最重要的是,即使通常不重写 UDP 源端口的路由器,当两台计算机尝试与同一台服务器通信时,仍会出于必要而这样做,在这种情况下它似乎只对第二台计算机有效。)