ntpdate:找不到合适的服务器进行同步。

我的时钟不准,所以我想用ntpdate来进行同步。我尝试了几个不同的NTP服务器,但是不知何故,我总是收到以下错误信息:
$ sudo ntpdate ntp.ubuntu.com
4 Mar 12:27:35 ntpdate[1258]: no server suitable for synchronization found
$ sudo ntpdate pool.ntp.org
4 Mar 12:27:50 ntpdate[1267]: no server suitable for synchronization found
$ sudo ntpdate de.pool.ntp.org
4 Mar 12:28:01 ntpdate[1273]: no server suitable for synchronization found
$ sudo ntpdate us.pool.ntp.org
4 Mar 12:28:12 ntpdate[1276]: no server suitable for synchronization found

相关问题

我已经浏览了相关问题,但没有一个能解决我的问题:

我尝试过的事情

我安装了ntp软件包

...并尝试使用ntpd守护进程而不是ntpdate实用程序。它也无法同步我的时间;守护进程启动正常,但我的时钟仍然不准确。我甚至尝试使用后一篇帖子中被接受答案中的确切/etc/ntp.conf文件,并重新启动守护进程。但没有效果。无论如何,我不想使用守护进程。我完全意识到ntpdate被认为是“已弃用”的,并建议使用ntpd -q代替。还请参阅这里:

但由于ntpd对我也不起作用,问题出在其他地方。而且我发现我宁愿不安装任何额外的软件包来同步时钟。ntpdate已经预装在Ubuntu上,并且应该可以正常工作。所以我又卸载了ntp软件包。

也许端口123被阻止了?
从这篇文章中: 我得到的想法是,在我的工作场所,我的电脑/网络可能被阻止了端口123。确实如此,
$ sudo nmap -p123 -sU -P0 localhost
...
PORT    STATE  SERVICE
123/udp closed ntp 
...
$ sudo ufw allow 123/udp
Rules updated
Rules updated (v6)
$ sudo nmap -p123 -sU -P0 localhost
...
PORT    STATE SERVICE
123/udp open  ntp
...

但是仍然:

$ sudo ntpdate ntp.ubuntu.com
4 Mar 13:06:16 ntpdate[4361]: no server suitable for synchronization found

即使使用了-u选项,该选项告诉ntpdate在同步时使用一个非特权端口(而不是端口123),这个端口在我的工作地点肯定没有被阻止:
$ sudo ntpdate -u ntp.ubuntu.com
4 Mar 13:06:28 ntpdate[4427]: no server suitable for synchronization found

也许层级太高了?
最后,从serverfault上的这篇帖子中: ...我想也许是NTP服务器的层级太高了。然而事实并非如此。让我们看一些更多的调试信息:
$ sudo ntpdate -dv ntp.ubuntu.com
 4 Mar 13:12:24 ntpdate[4523]: ntpdate 4.2.6p5@1.2349-o Wed Oct  9 19:08:07 UTC 2013 (1)
Looking for host ntp.ubuntu.com and service ntp
host found : golem.canonical.com
transmit(91.189.89.199)
transmit(91.189.94.4)
transmit(91.189.89.199)
transmit(91.189.94.4)
transmit(91.189.89.199)
transmit(91.189.94.4)
transmit(91.189.89.199)
transmit(91.189.94.4)
transmit(91.189.89.199)
transmit(91.189.94.4)
91.189.89.199: Server dropped: no data
91.189.94.4: Server dropped: no data
server 91.189.89.199, port 123
stratum 0, precision 0, leap 00, trust 000
refid [91.189.89.199], delay 0.00000, dispersion 64.00000
transmitted 4, in filter 4
reference time:    00000000.00000000  Mon, Jan  1 1900  1:00:00.000
originate timestamp: 00000000.00000000  Mon, Jan  1 1900  1:00:00.000
transmit timestamp:  d6c041ae.e6166441  Tue, Mar  4 2014 13:12:30.898
filter delay:  0.00000  0.00000  0.00000  0.00000 
         0.00000  0.00000  0.00000  0.00000 
filter offset: 0.000000 0.000000 0.000000 0.000000
         0.000000 0.000000 0.000000 0.000000
delay 0.00000, dispersion 64.00000
offset 0.000000

server 91.189.94.4, port 123
stratum 0, precision 0, leap 00, trust 000
refid [91.189.94.4], delay 0.00000, dispersion 64.00000
transmitted 4, in filter 4
reference time:    00000000.00000000  Mon, Jan  1 1900  1:00:00.000
originate timestamp: 00000000.00000000  Mon, Jan  1 1900  1:00:00.000
transmit timestamp:  d6c041af.1948fc50  Tue, Mar  4 2014 13:12:31.098
filter delay:  0.00000  0.00000  0.00000  0.00000 
         0.00000  0.00000  0.00000  0.00000 
filter offset: 0.000000 0.000000 0.000000 0.000000
         0.000000 0.000000 0.000000 0.000000
delay 0.00000, dispersion 64.00000
offset 0.000000

 4 Mar 13:12:33 ntpdate[4523]: no server suitable for synchronization found

嘘...这个有点长,抱歉。我被难住了。有什么线索吗?

更新:额外信息

无论在/etc/ntp.conf中是否包含NTP服务器HOSTNAME,以及ntpd服务是否正在运行,每当我运行sudo ntpdate -u HOSTNAME时,都会出现没有适合同步的服务器的提示。当ntpd服务运行且我省略-u选项时,情况也是一样。当ntpd服务正在运行且我省略-u选项时,我会得到NTP套接字正在使用,退出的提示。

另外:

$ timedatectl status
      Local time: Wed 2014-03-05 13:11:54 CET
  Universal time: Wed 2014-03-05 12:11:54 UTC
        Timezone: Europe/Berlin (CET, +0100)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: no
 Last DST change: DST ended at
                  Sun 2013-10-27 02:59:59 CEST
                  Sun 2013-10-27 02:00:00 CET
 Next DST change: DST begins (the clock jumps one hour forward) at
                  Sun 2014-03-30 01:59:59 CET
                  Sun 2014-03-30 03:00:00 CEST

但是这里的UTC时间不正确。现在的UTC时间是11:11,而不是12:11

还有:

$ sudo hwclock --show
Wed 05 Mar 2014 01:11:56 PM CET  -0.625627 seconds

你说你运行了 sudo ntpdate ntp.ubuntu.com,但是在将 ntp.ubuntu.com 添加到 /etc/ntp.conf 的服务器字段之后,你是否执行了这个操作?如果没有,请参考以下答案。 - Stormvirux
尝试使用sudo ntpdate 0.ubuntu.pool.ntp.org命令。 - Stormvirux
1嗨,看到我的回复。 我尝试将 server pool.ntp.org 添加到 /etc/ntp.conf 中,但是 ntpdate -u pool.ntp.org 抛出相同的错误。 我还尝试了在 /etc/ntp.conf 中添加 ntp.ubuntu.com(重新启动 ntp 服务,在刚才添加到 /etc/ntp.conf 的确切服务器上重新运行 ntpdate -u)。 总而言之,无论我要同步的服务器是否在 /etc/ntp.conf 中提到都没有关系。 在所有情况下(除非运行 ntp 服务*并且省略 -u 选项,然后我会得到“NTP套接字正在使用”错误),我都会收到“无可用服务器...”的错误消息。 - Malte Skoruppa
好的,我也尝试了sudo ntpdate 0.ubuntu.pool.ntp.org,这个命令已经在/etc/ntp.conf文件中了。可惜没有成功,还是出现同样的错误。 - Malte Skoruppa
5个回答

你的托管提供商正在阻塞 NTP 数据包。这种大刀阔斧的做法是一些互联网服务提供商为了应对分布式拒绝服务攻击而采取的措施。你可以从 ntpdate -vd 命令中看到 ntpdate 正在发送这些数据包。
transmit(91.189.94.4)
transmit(91.189.89.199)
transmit(91.189.94.4)
transmit(91.189.89.199)

我会联系你的ISP,询问他们是否阻止外部ntp请求,并且是否有一个本地服务器可以用于时间同步。
还有一些更隐晦的可能性,但由于你没有发布任何来自syslog的日志,很难排除它们。

9你说得完全正确。看起来我们的大学正在阻止外部NTP请求。它还提供了一些本地NTP服务器作为替代方案。这些工作得非常好。我现在明白ntpdate -dv的输出也应该包括一些receive(...)而不仅仅是transmit(...)的信息了。;) 非常感谢! - Malte Skoruppa
有一个问题,就是当我使用 ntpdate-u 选项时,大学如何阻止 NTP 数据包呢?因为这会使用非特权端口而不是端口123,这意味着他们的防火墙规则必须比简单的“阻止端口123上的传入数据包”更复杂。那么他们是否进行了某种深度数据包检查呢? - Malte Skoruppa
1他们将有一个防火墙规则,规定“阻止所有目标端口为123的流量”,然后为他们的ntp主机设置一些例外情况。 - dfc
我曾遇到同样的问题。通过进行出站跟踪,我成功解决了这个问题,并发现了一台在路由上的本地服务器,它运行着ntp服务,我可以同步到它上面。其中有一个服务器却对此进行了阻止。谢谢你的建议! - jonespm
1对我来说,ntpdate -vd 显示“无法使用服务器,退出”。 - highBandWidth
@highbandwidth,您能否将NTP服务器名称解析为IP地址?如果可以,您知道它们是否正在提供时间并且可达吗? - dfc
@dfc,我弄清楚了。我安装并加载了ntpd。这就是为什么ntpdate -vd不起作用的原因。 - highBandWidth
这是我的问题:AT&T Uverse在双向上阻塞了端口123:https://www.att.com/gen/public-affairs?pid=20879(截至2016年2月1日)。我的解决方法是使用`ntpdate -u`,它使用了一个非特权(且未被阻塞)的端口。 - Alex
太准了,我断开了当前的网络连接,连接到4G网络,然后就好了。谢谢你,dfc。 - Rich
似乎这可能是大学网络中的常见情况。你可以尝试使用 ntp.example-university.com。(在芬兰阿尔托大学,我在这里使用它成功了。) - Czechnology
我为此苦苦挣扎了好几天。非常感谢你。 - Seu Madruga

这不是一个ntp的答案,然而...
sudo date -s "$(wget -qSO- --max-redirect=0 google.com 2>&1 | grep Date: | cut -d' ' -f5-8)Z"

这是和curl版本这里

21这很糟糕,但它有效。 - Alan Plum
9给以root权限运行的bash命令提供未经消毒的数据?太棒了,感谢参与。这个回答应该被极度偏见地投下负评。 - dfc
1比起与ISP技术支持打交道,这要轻松得多。而且,如果只是在本地虚拟机上进行测试,根本不会有任何重大问题。 - Yalok Iy
你能解释一下它在做什么吗? - Suraj Jain
1@SurajJain 许多网络服务器会返回Date头信息。在该命令中,date -s用于设置日期,wget -S用于存储所有头信息,2>&1用于将错误日志记录到标准输出,grep用于提取带有Date头信息的行,cut用于去除星期和GMT,末尾的Z表示将日期视为UTC时间。准确性将取决于网络速度。 - user1516873
这对于快速修复很有效。为了解决测试虚拟机无法访问NTP的问题,我为一个PHP脚本创建了一个cron任务,使用get_headers()获取网站(比如谷歌)的头信息,通过strtotime和date进行日期的清理和重新格式化,然后使用exec()设置日期。 - Robert Dundon

使用 htpdate 如果您的网络阻止了 NTP 传输,请安装 htpdate。它通过 HTTP 协议同步时间。根据手册,精确度将在 0.5 秒以内。
sudo apt-get install htpdate
sudo htpdate -a google.com

htpdate服务将在您安装软件包时启动。如果有网络连接,时间将立即更新。

1请不要只是复制粘贴相同的答案到你找到的每个关于NTP的话题中。 - sempaiscuba
5无论是复制粘贴还是其他方式,这个解决方案在我遇到“ntpdate[22109]: no server suitable for synchronization found”错误时起到了作用。 - kneeki
22021年2月在希腊雅典,只有Vodafone的htpdate能用!谢谢!!!我无法确定它有多安全,但其他方法对我都不起作用。似乎ISP(Vodafone)封锁了ntp服务,因为一切都正常,但是我只收到"ntp服务正在使用中"和"没有适合同步的服务器"的提示。这至少省去了我与ISP自动回答等待30分钟的时间。 - Apostolos55
1非常棒的解决方案-感谢您的发布!在网络阻止NTP更新时对我有用($ ntpdate -u <IP>)。 - leenremm

我遇到了同样的问题,这是我如何解决的。 我从头到尾给出了详细的答案。你可能想跳过我的回答的中间部分,或者只需参考下面的截图就能一目了然地理解。 首先安装ntpdate(显然你已经做过这个)
sudo apt-get install ntpdate

下一步,您需要使用以下服务器配置ntp:
您至少应在/etc/ntp.conf配置文件中设置以下参数: 服务器
例如,使用nano文本编辑器打开/etc/ntp.conf文件:
sudo nano /etc/ntp.conf

找到服务器参数,如果为空,请将其设置如下:

server pool.ntp.org

通常在Ubuntu中已经预先编写了一些服务器,可能是这样的。
server 0.ubuntu.pool.ntp.org
server 1.ubuntu.pool.ntp.org
server 2.ubuntu.pool.ntp.org
server 3.ubuntu.pool.ntp.org

enter image description here

然后保存文件并重新启动ntpd服务。
sudo /etc/init.d/ntpd start

您可以立即使用以下命令将系统时钟同步到NTP服务器:

sudo ntpdate pool.ntp.org

或者只需运行已定义的服务器。
sudo ntpdate 0.ubuntu.pool.ntp.org

或使用server定义的其他服务器

一般情况下

sudo ntpdate <one of the servername in /etc/ntp.conf>

但是在那之后,有可能会出现以下错误:NTP套接字正在使用

enter image description here

在这种情况下,只需运行。
ntpdate -u pool.ntp.org 

当ntp守护程序正在运行时进行更新

或者只需停止守护程序,按以下步骤更新并重新启动:

sudo ntpdate pool.ntp.org
sudo service ntp stop
sudo ntpdate pool.ntp.org
sudo service ntp start

你会得到。

enter image description here


1嗨,感谢你详细的回答!不幸的是,对我来说没有起作用。我有一个随Ubuntu一起提供的/etc/ntp.conf文件,从未对其进行任何更改。我在这里粘贴了它:http://pastebin.com/bB0sskzv。我还尝试在服务器列表顶部添加`server pool.ntp.org,就像你的截图中显示的那样。在这里可以找到:http://pastebin.com/YH372Jdi。**使用这两个设置**,我运行了你提出的命令序列:我在原始帖子中添加了一张截图。结果对于未修改和修改后的/etc/ntp.conf`都完全相同。还有其他的想法吗?谢谢! - Malte Skoruppa
timedatectl status 返回什么内容? - Stormvirux
请查看我原帖中 timedatectl status 命令的输出。 - Malte Skoruppa
我现在已经尝试了所有4个预定义的服务器(即{0..3}.ubuntu.pool.ntp.org),无论是带有还是不带有-u选项,都始终出现相同的错误。 - Malte Skoruppa
请告诉我这个:sudo hwclock --show 的输出结果。 - Stormvirux
我为了完整性添加了 sudo hwclock --show 的输出,但实际上,dfc的答案解决了我的问题。无论如何,我也感谢你。 :) - Malte Skoruppa
这个命令对我来说很有用:sudo ntpdate pool.ntp.org - tread

与Alex的回答类似,这对我来说也起作用,可以绕过ntp端口被防火墙封锁的问题。
sudo date -s "$(curl http://s3.amazonaws.com -v 2>&1 | \
  grep "Date: " | awk '{ print $3 " " $5 " " $4 " " $7 " " $6 " GMT"}')"