为什么 ntpq -pn 报告“连接被拒绝”?

为什么 ntpq -pn 报告“连接被拒绝”?

我最近设置了运行 NTPD 的 CentOS 6.x 系统,并且在运行时遇到此错误ntpq -pn

$ ntpq -pn
ntpq: read: Connection refused

我知道它ntpd已启动并通过命令运行ntpstat

$ ntpstat
synchronised to NTP server (204.11.201.12) at stratum 3
   time correct to within 71 ms
   polling server every 256 s

为什么ntpq -pn不工作?

答案1

strace您可以通过如下方式查看输出来对此进行分类:

$ strace ntpq -pn ::1|& grep -i conn
connect(3, {sa_family=AF_LOCAL, sun_path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
connect(3, {sa_family=AF_LOCAL, sun_path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
connect(3, {sa_family=AF_INET6, sin6_port=htons(123), inet_pton(AF_INET6, "::1", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = 0
recvfrom(3, 0x7fffc3365a10, 516, 0, 0, 0) = -1 ECONNREFUSED (Connection refused)
write(2, "Connection refused\n", 19Connection refused

请注意,它使用 ipv6 进行连接。基本上这一行:

connect(3, {sa_family=AF_INET6, sin6_port=htons(123), inet_pton(AF_INET6, "::1", &sin6_addr), sin6_flowinfo=0, sin6_scope_id=0}, 28) = 0

NTPD 是否正在侦听 ipv6 端口?

$ netstat -taupn|grep udp|grep ntp
udp        0      0 10.22.7.237:123             0.0.0.0:*                               24213/ntpd
udp        0      0 127.0.0.1:123               0.0.0.0:*                               24213/ntpd
udp        0      0 0.0.0.0:123                 0.0.0.0:*                               24213/ntpd

所以它似乎没有在侦听 ipv6,因此出现错误。我们可以通过告诉ntpq -pn显式连接 ipv4 来解决这个问题,如下所示:

$ ntpq -pn 127.0.0.1
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
+69.89.207.199   212.215.1.157    2 u  209  256  377   43.582    2.768   0.076
-72.5.72.15      10.3.255.0       3 u  217  256  377   68.627   -1.833   4.388
*204.11.201.12   66.220.9.122     2 u  244  256  377   61.928   -0.712   0.234
+108.59.2.24     130.133.1.10     2 u  178  256  377    1.824    3.256   0.111

好多了。您可以strace再次使用以下命令来确认我们的逻辑:

$ strace ntpq -pn 127.0.0.1|& grep -i conn
connect(3, {sa_family=AF_LOCAL, sun_path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
connect(3, {sa_family=AF_LOCAL, sun_path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
connect(3, {sa_family=AF_INET, sin_port=htons(123), sin_addr=inet_addr("127.0.0.1")}, 16) = 0
connect(4, {sa_family=AF_LOCAL, sun_path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)
connect(4, {sa_family=AF_LOCAL, sun_path="/var/run/nscd/socket"}, 110) = -1 ENOENT (No such file or directory)

请注意,当客户端尝试通过端口 123 上的 UDP连接到您的服务器时,会使用 ipv4 sa_family=AF_INET,而会使用 ipv6 。sa_family=AF_INET6ntpqntpd

我们还可以使用-4-6开关来ntpq -pn

$ ntpq -pn -4
     remote           refid      st t when poll reach   delay   offset  jitter
==============================================================================
+69.89.207.199   212.215.1.157    2 u  235  256  377   43.582    2.768   0.047
-72.5.72.15      10.3.255.0       3 u  248  256  377   68.627   -1.833   4.417
*204.11.201.12   66.220.9.122     2 u  265  256  377   61.802   -0.765   0.198
+108.59.2.24     130.133.1.10     2 u  212  256  377    1.824    3.256   0.097

参考

答案2

我最近在使用 CentOS7 时遇到了同样的问题。 ntpq -p 将显示“读取:连接被拒绝”,以及 ntp 调试中的许多其他命令,例如“clocklist”和其他一些命令。我在 ntp.conf 中设置的 NTP 服务器被忽略。以下是其他一些值得注意的输出:

[root@server ~]# ntpstat
synchronised to NTP server (69.164.198.192) at stratum 3
   time correct to within 56 ms
   polling server every 1024 s

[root@server ~]# ntpdate
14 Oct 00:02:14 ntpdate[21443]: no servers can be used, exiting

[root@server ~]# systemctl status ntp
Unit ntp.service could not be found.

[root@server ~]# systemctl status ntpd
 ntpd.service - Network Time Service
   Loaded: loaded (/usr/lib/systemd/system/ntpd.service; enabled; vendor preset: disabled)
   Active: inactive (dead)

ntpq> version
ntpq [email protected] Thu Aug  8 11:48:03 UTC 2019 (1)

ntpq> clocklist
ntpq: read: Connection refused

ntpq> cooked
Output set to cooked

ntpq> readlist
ntpq: read: Connection refused

当我检查它所使用的 NTP 服务器的 IP 时,它总是来自 ARIN(?) 或像 Level3 这样的大提供商。我无法选择服务器,但它使用的服务器看起来不错。但无论我做什么,它仍然不允许我选择自己的服务器/etc/ntp.conf

我开始怀疑我的程序不知何故有问题,我开始怀疑我加载的 epel 存储库,因为我需要从那里加载一些其他程序。

果然,我执行了以下操作并解决了问题:

yum remove ntp
yum install ntp --disablerepo=epel

它重新安装,现在ntpq -p可以工作,并systemctl status ntpd显示为:

[root@server ntpstats]# systemctl status ntpd
● ntpd.service - Network Time Service
   Loaded: loaded (/usr/lib/systemd/system/ntpd.service; disabled; vendor preset: disabled)
   Active: active (running) since Mon 2019-10-14 22:14:44 CDT; 3s ago

最后我设置的服务器/etc/ntp.conf被使用了。

我不知道如何让 epel 知道他们的 CentOS7 ntp 被某种方式破坏了,也许有人会看到这个并报告。

请注意,epel 和 CentOS 存储库都显示相同的版本:ntp-4.2.6p5-29.el7.centos.x86_64

答案3

接受的答案对我不起作用。以下解决了连接问题:

编辑 /etc/ntp.conf 文件:

sudo nano /etc/ntp.conf

找到列出服务器的行并更改为以下内容:

# Use servers from the NTP Pool Project. Approved by Ubuntu Technical Board
# on 2011-02-08 (LP: #104525). See http://www.pool.ntp.org/join.html for
# more information.
pool 0.debian.pool.ntp.org iburst
pool 1.debian.pool.ntp.org iburst
pool 2.debian.pool.ntp.org iburst
pool 3.debian.pool.ntp.org iburst

重新启动并重新加载 ntp 服务。

#force-reload the service
sudo systemctl force-reload ntp.service

相关内容