我注意到这一点已经有一段时间了,但我始终不明白:
为什么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 [局域网]:123 0.0.0.0:* ntpd udp [IPv4]:123 0.0.0.0:* ntpd udp6 :::123 :::* ntpd udp6 ::1:123 :::* ntpd udp6 [本地链接] :::* ntpd udp6 [IPv6] :::* ntpd
此(已删除)netstat
列表显示了nptd
对 IPv4 和 IPv6 的广播、本地、LAN 和全局地址的监听。
为何ntpd
这么滥交?
答案1
从我的阅读此页面,看来 ntp 不0.0.0.0
专门使用 INADDR_ANY 地址,部分是出于安全原因,部分是出于身份验证原因。
第一个端口 123 低于 1024,因此被视为特权端口,只有 root 才能绑定到该端口。ntp 通常设置为在启动后放弃特权。根据我从邮件列表和文章中了解到的情况,一旦放弃特权,就无法打开套接字以从正确的源端口 123 回复,因此 ntp 在放弃特权之前会为每个分配的地址打开套接字。
据我所知,ntp 的一些身份验证机制基本上要求源端口和目标端口为 123,而不需要其他任何内容。
事情还不完全清楚。请参阅关于通配符地址 0.0.0.0
,它由于某种原因被 ntpd 打开,但从评论来看它实际上不应该被使用,除非在某些特殊的罕见情况下,开发人员并不完全确定,但是,他们不想移除套接字,以防他们破坏东西。
请注意,通常 ntpd 不应接受通配符地址上的数据包,因为这样做会产生许多问题,包括将返回数据包发送到与发送者请求的地址不同的地址。DannyMayer - 2009 年 4 月 27 日
我认为您问题的主要答案就在上面的评论中。
答案2
它根本不是混杂的。它只是绑定到接口 IP 地址和本地主机,两者都在 ipv4 和 ipv6 协议上。如果您认为它不应该监听其中的一些,只需按照listen
手册中的说明更改配置(这可能适用于您正在使用的不同版本):
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