我无法在 Windows 10 中同步时钟。
当在控制面板中请求同步时,或者通过w32tm /resync
我的计算机发送一些 NTPv3 数据包到pool.ntp.org
(我手动设置该服务器,但我使用哪个服务器并不重要)并且没有得到响应。
但是,如果我w32tm /monitor /computers:pool.ntp.org
这样做,它会起作用,并且我可以在 Wireshark 中看到我的计算机发送 NTPv1 数据包并获得响应。
但是,如果我将计算机连接到手机的移动热点,则可以通过 NTPv3 进行时间同步。此外,与我的 Windows 10 位于同一网络上的另一台 Linux 计算机可以毫无问题地同步(并且我看到它使用 NTPv4)。
我努力了:
- 重新启动 Windows 时间服务
- 重置 Windows 时间服务
- 在路由器防火墙中打开端口 123
- 更改 DNS 设置(我使用 DNS-over-TLS)
并且还没有让它发挥作用。
我的路由器采用双 NAT 配置(即互联网 - 另一个我无法控制的路由器 - 我的路由器 - 我的电脑),这可能会导致 NTP 问题,但我不明白我的 Linux 笔记本电脑如何同步。
正如评论中所讨论的,不同之处在于 Windows 中的 W32time 服务以“对称”模式使用 NTP 端口号,其中目标端口号和源端口号均为 123,即使它纯粹作为客户端运行且未设置为作为对称对等体工作(它具有该功能)。
这意味着无状态防火墙无法区分入站回复和入站查询,因为它们都到达“到”端口 123,并且如果 ISP 有阻止您托管 NTP 服务器的过滤器,它也会阻止您使用 NTP在此模式下工作的客户端。
Linux NTP 软件通常遵循协议规范,并在客户端/服务器模式下使用临时源端口,就像大多数其他 UDP 软件一样(123→123 纯粹用于对称模式)。同样,该
w32tm
工具可以工作,因为它的监视器/条形图选项导致它使用绑定到临时端口的常规套接字生成自己的 NTP 查询。如果您有一个始终在线的 Linux 或 BSD 系统,那么您可以使用该系统作为您的内部 NTP 服务器(只需很少的设置即可使 Chrony 或 ntpd 作为中等质量的服务器工作)。
这也适用于 WSL2,因为它的内核时钟并不严格与主机时钟相关(据我所知)——应该可以在 WSL2 中运行 Chrony 作为 NTP 服务器,并告诉它不要尝试更新实时时钟。
如果您有任何可以通过 VPN 的地方,您也许可以使用 VPN 连接进行 NTP。
第三方 Windows NTP 客户端也应该可以工作 - 特别是如果本地端口 123 已被 W32time 占用,那么它们别无选择,只能使用另一个本地端口。例如,NetTime看起来似乎可以工作。
非 NTP 协议的第三方客户端也可以工作,因为它们不使用相同的 UDP 端口。准确性不如 NTP,但对于 PC 来说可能已经足够了。例如,NIST 发布了其nistime客户端,该客户端可以使用 NTP 以及较旧的 RFC-868 协议。