Połączenie z IP 0.0.0.0 powiodło się. W jaki sposób? Dlaczego?

41

Obsługujemy port na localhost i chcemy sprawdzić w innym procesie, jeśli port jest dostępny. Z powodu błędu w naszym kodzie próbuje on połączyć się z adresem IP 0.0.0.0:<port>iz jakiegoś powodu udaje się - jak pokazuje strace:

[...]
connect(3, {sa_family=AF_INET, sin_port=htons(10002), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
[...]

Co to znaczy? Dlaczego to działa?

erikbwork
źródło

Odpowiedzi:

68

0.0.0.0 jako adres docelowy w różny sposób odnosi się do hosta bez routingu lub do „tego hosta” . W praktyce połączenie z 0.0.0.0 jest równoznaczne z połączeniem z localhost. (Ściśle mówiąc, nie jest poprawny jako adres docelowy, tylko jako adres źródłowy, ale praktyka nie pasuje do teorii.)

Podczas wiązania „ten host” rozwija się do „dowolnego adresu na tym hoście” - więc aplikacje zazwyczaj akceptują połączenia przez powiązanie z 0.0.0.0, co oznacza, że ​​będą otrzymywać pakiety adresowane na dowolny adres IPv4 w systemie.

Stephen Kitt
źródło
7
Aby nieco rozszerzyć tę odpowiedź - oznacza to „dowolny adres IP w tym systemie, w tym adresy IP dodane po rozpoczęciu procesu nasłuchiwania”
Criggie
5
localhost to pojedynczy adres, głównie 127.0.0.1, podczas gdy 0.0.0.0 oznacza wszystkie adresy na tym hoście.
rexkogitans
@rexkogitans localhost nie jest pojedynczym adresem, ale dowolnym adresem z zakresu 127.0.0.0/8 - tzn. dowolnym adresem od 127.0.0.0 do 127.255.255.255
Dezza
6
@Dezza Nie, localhost to 127.0.0.1. 127.0.0.0/8 (jak mówisz, aka od 127.0.0.0 do 127.255.255.255) to sprzężenie zwrotne z większością urządzeń, np. Udokumentowane przez RFC 5735 strona 4 . (Co ciekawe, niektóre urządzenia Cisco mogą przypisać sprzężenie zwrotne do dowolnego adresu, ale domyślnie w ogóle nie obsługuje sprzężenia zwrotnego. Nie oznacza to, że może to wpłynąć na inne urządzenia w sieci.) Jednak localhost to nazwa, zazwyczaj wskazująca tylko na jeden adres, który jest 127.0.0.1 i zwykle jest implementowany za pomocą pliku „hosts”. Więc nie zgadzam się z twoją próbą korekty.
TOOGAM
Czy możesz wyjaśnić, co rozumiesz przez „nie jest ważny jako adres docelowy, tylko jako adres źródłowy”? Kiedy serwer mysql nasłuchuje na 0.0.0.0, czy adres docelowy lub źródłowy? Czy to nie jest miejsce docelowe żądania wysłanego z klienta mysql?
Tim