Dlaczego ntpd nasłuchuje na tak wielu portach / adresach?

18

Zauważyłem to przez jakiś czas i nigdy nie miało to dla mnie sensu:

Dlaczego ntpdtrzeba słuchać na tak wielu adresach?

Na przykład maszyna Debian:

$ netstat
Proto Adres lokalny Adres obcy Nazwa programu
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

Ta (zredagowana) netstatlista pokazuje nptdnasłuchiwanie na adresach rozgłoszeniowych, lokalnych, LAN i globalnych dla IPv4 i IPv6.

Dlaczego jest ntpdtak rozwiązła?

Abraham Vegh
źródło

Odpowiedzi:

15

Z lektury tej strony wynika, że ​​ntp nie używa 0.0.0.0adresu INADDR_ANY wyłącznie częściowo ze względów bezpieczeństwa, a częściowo ze względów uwierzytelnienia.

Pierwszy port 123 ma mniej niż 1024, a zatem jest uważany za uprzywilejowany port i tylko root może się z nim połączyć. Ntp jest zwykle ustawiony tak, aby upuszczał uprawnienia po uruchomieniu. Z tego, co rozumiem z list mailowych i artykułu po zniesieniu uprawnień, nie mogę otworzyć gniazda, aby odpowiedzieć z poprawnego portu źródłowego 123, więc ntp otwiera gniazda dla każdego przypisanego adresu, zanim upuści uprawnienia.

Z tego, co przeczytałem, niektóre mechanizmy uwierzytelniania dla NTTP w zasadzie wymagają, aby port źródłowy i docelowy wynosił 123 i nic więcej.

Sprawa nie jest do końca jasna. Zobacz sekcję o adresie wieloznacznym 0.0.0.0 , z jakiegoś powodu jest on otwierany przez ntpd, ale z komentarzy nigdy tak naprawdę nie należy go używać, z wyjątkiem możliwych w niektórych wyjątkowych rzadkich przypadkach, że deweloperzy nie są całkowicie pewni, ale nie chcę usunąć gniazdo, na wypadek, gdyby coś zepsuły.

Zauważ, że normalnie ntpd nie powinien akceptować pakietów na adresy wieloznaczne, ponieważ istnieje wiele problemów, jeśli to robisz, w tym wysyłanie pakietów zwrotnych na inny adres niż adres żądany przez nadawcę. DannyMayer - 27 kwietnia 2009 r

Myślę, że główna odpowiedź na twoje pytanie znajduje się w powyższym komentarzu tutaj.

Zoredache
źródło
16

To wcale nie jest rozwiązłe. Jest to tylko powiązanie z adresami IP interfejsu i hostem lokalnym, zarówno na protokołach ipv4, jak i ipv6. Jeśli uważasz, że niektóre z nich nie powinny słuchać, po prostu zmień listenkonfigurację zgodnie z objaśnieniem w instrukcji (może to być inna wersja, której używasz):

 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

W niektórych innych wersjach trzeba będzie zmienić opcje do ntpddemon się do zmian na co protokoły / interfejsy do słuchania (opcje podoba -4, -6, -I)

rdzeń rdzeniowy
źródło
1
Feliz Ano Novo!
user9517
1
Nie sądzę, że to naprawdę odpowiada na pytanie. Sądzę, że pytanie w zasadzie nasuwa pytanie, dlaczego INADDR_ANYnie jest używane jak prawie każdy inny protokół. Artykuł, do którego odsyłam w mojej odpowiedzi, wydaje się wyjaśniać, że jest to po części funkcja bezpieczeństwa, a po części sposób, w jaki projekt protokołu oczekuje odpowiedzi na porcie 123.
Zoredache
To bardzo przydatna informacja, którą chciałem poznać i dziękuję za nią, ale odpowiedź @ Zoredache faktycznie odpowiada na pytanie, które zadałem, więc oznaczyłem ją jako odpowiedź. Wszędzie jednak przychylne głosy. ;)
Abraham Vegh