为什么ntpd在这么多端口/地址上监听?

我已经注意到了这一段时间,这对我来说从来没有任何意义:

为什么ntpd需要在这么多地址上进行监听?

例如,Debian机器:

 $ netstat
原始本地地址外地址程序名称
 udp 0.0.0.0:123 0.0.0.0:* ntpd
 udp 127.0.0.1:123 0.0.0.0:* ntpd
 udp [LAN]:123 0.0.0.0:* ntpd
 udp [IPv4]:123 0.0.0.0:* ntpd
 udp6 ::: 123 ::: * ntpd
 udp6 :: 1:123 ::: * ntpd
 udp6 [link-local] ::: * ntpd
 udp6 [IPv6] ::: * ntpd

这个(模糊的) netstat清单显示了nptd监听IPv4和IPv6的广播,本地,局域网和全局地址。

为什么ntpd如此混杂?

从我阅读这个页面看来,ntp并没有部分地使用INADDR_ANY 0.0.0.0地址,部分是出于安全原因,部分是出于身份validation的原因。

第一个端口123,低于1024,所以被认为是一个特权端口,只有root可以绑定到该端口。 Ntp通常在启动后被设置为删除权限。 从我所了解的邮件列表和文章一旦权限被删除,无法打开一个套接字来从123的正确源端口应答,所以ntp为每个分配的地址打开套接字,然后它放弃权限。

从我读过的一些ntp的身份validation机制基本上要求源端口和目的端口是123,而不是别的。

这个问题还不完全清楚。 请参阅关于通配符地址 0.0.0.0的部分,它由ntpd由于某种原因打开,但从注释中不应该实际使用,除非在一些特殊的罕见情况下可能,开发人员不完全确定,他们不想删除套接字,以防万一他们破坏事情。

请注意,通常情况下,ntpd不应该接受通配符地址上的数据包,因为如果这样做会造成一些问题,包括将发送的返回数据包发送到与发送者请求的地址不同的地址。 DannyMayer – 2009年4月27日

我认为你的问题的主要答案是在这里的上述评论。

这根本不是混杂的。 它只是绑定到ipv4和ipv6协议上的接口IP地址和本地主机。 如果您认为它不应该听其中一些,只要按照手册中的说明更改listenconfiguration(这可能与您使用的是不同的版本):

  listen on address Specify a local IP address or a hostname the ntpd(8) daemon should listen on. If it appears multiple times, ntpd(8) will listen on each given address. If the exact string '*' is given as an address, ntpd(8) will listen on all local addresses. Other- wise, address can be followed by an asterisk ('*') and a UDP port number to listen on instead of the default 123. ntpd(8) does not listen on any address by default. For example: listen on * listen on 127.0.0.1 listen on ::1 

在其他一些版本中,你将需要改变ntpd守护进程本身的选项来改变要监听的协议/接口(像-4-6-I这样的选项)