Почему ntpd прослушивает так много портов / адресов?

18

Я заметил это некоторое время, и это никогда не имело никакого смысла для меня:

Почему 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так неразборчиво?

Авраам Вег
источник

Ответы:

15

Из моего прочтения этой страницы видно, что ntp не использует 0.0.0.0адрес INADDR_ANY исключительно частично из соображений безопасности и частично из соображений аутентификации.

Первый порт 123 находится ниже 1024, и поэтому считается привилегированным портом, и только root может связываться с этим портом. Ntp обычно настроен на удаление привилегий после запуска. Из того, что я понимаю из списков рассылки и статьи, когда привилегии отброшены, невозможно открыть сокет для ответа с правильного исходного порта 123, поэтому ntp открывает сокеты для каждого назначенного адреса, прежде чем он отбрасывает привилегии.

Из того, что я прочитал, некоторые механизмы аутентификации для ntp в основном требуют, чтобы порт источника и назначения был 123, и ничего больше.

Дело не совсем понятно. См. Раздел об адресе с подстановочными0.0.0.0 символами, по какой-то причине он открывается ntpd, но из комментариев его никогда не следует использовать, за исключением случаев, когда это возможно в некоторых особых редких случаях, в которых разработчики не совсем уверены, но они этого не делают. Я не хочу вынимать розетку, на случай, если они сломают вещи.

Обратите внимание, что обычно ntpd не должен принимать пакеты с подстановочными адресами, поскольку при этом возникает ряд проблем, включая отправку пакетов возврата по другому адресу, отличному от запрошенного адреса отправителя. DannyMayer - 27 апреля 2009 г.

Я думаю, что основной ответ на ваш вопрос в приведенном выше комментарии здесь.

Zoredache
источник
16

Это совсем не неразборчиво. Это просто привязка к 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)

CoreDump
источник
1
Фелиз Ано Ново!
user9517
1
Я не думаю, что это действительно отвечает на вопрос. Я думаю, что вопрос в основном спрашивает, почему INADDR_ANYне используется, как почти любой другой протокол. Статья, на которую я ссылаюсь в своем ответе, проясняет, что это отчасти функция безопасности, а отчасти то, как протокол предназначен для ожидания ответов на порту 123.
Zoredache
Это очень полезная информация, которую я хотел узнать, и я благодарю вас за это, но ответ @ Zoredache фактически отвечает на вопрос, который я задал, поэтому я отметил его как ответ. Тем не менее, повсюду. ;)
Авраам Вег