Jaka jest różnica między adresem IP 0.0.0.0 a 127.0.0.1?

220

Wiem, że 127.0.0.1 ~ 127.255.255.254 to adresy IP sprzężenia zwrotnego dla większości współczesnych systemów operacyjnych i te adresy IP mogą być używane w odniesieniu do naszego własnego komputera.

Ale co to jest 0.0.0.0? Wygląda na to, że odnosi się to również do lokalnego komputera, więc jaka jest różnica ?

Czy mógłbyś mi wyjaśnić następujące połączenia IP:

zrzut ekranu wyjścia netstat -an

Jichao
źródło
6
Spójrz także na to pytanie, ponieważ zawiera ono szczegółowe informacje na temat tego, czym jest (i nie jest) 0.0.0.0: serverfault.com/questions/228629/…
Ellie Kesselman
Nowoczesny system operacyjny byłby używany ::1jako adres sprzężenia zwrotnego.
kasperd

Odpowiedzi:

157

Jedyną rzeczą jest to, że nie mówisz, że „wszystkie adresy powinny mieć dostęp” - dzieje się to w zaporze (firewallach) i / lub oprogramowaniu serwera i / lub innych warstwach bezpieczeństwa, takich jak tcpwrappers.

W tym kontekście 0.0.0.0 oznacza „wszystkie adresy IP na komputerze lokalnym” (w rzeczywistości prawdopodobnie „wszystkie adresy IPv4 na komputerze lokalnym”). Tak więc, jeśli twój serwer WWW ma dwa adresy IP, 192.168.1.1 i 10.1.2.1, i pozwolisz demonowi serwera WWW, jak apache, nasłuchiwać w wersji 0.0.0.0, będzie on dostępny na obu tych adresach IP. Ale tylko do tego, co może skontaktować się z tymi adresami IP i portami internetowymi.

Zauważ, że w innym kontekście (routing) 0.0.0.0 zwykle oznacza trasę domyślną (trasę do „reszty” Internetu, oprócz tras w sieci lokalnej itp.).

Lee B.
źródło
więc masz na myśli, że gniazdo serwera WWW jest powiązane z dowolnymi dostępnymi adresami, gdy nasłuchuje na 0.0.0.0?
onmyway133
0.0.0.0oznacza domyślną trasę tylko wtedy, gdy towarzyszy jej prefiks /0(lub maska ​​sieci 0.0.0.0)
minmaxavg
Należy zauważyć: jeśli jakiś proces nasłuchuje w wersji 0.0.0.0, będzie on dostępny pod adresami IP wszystkich interfejsów sieciowych maszyny, które obejmują aktualnie skonfigurowany adres interfejsu pętli zwrotnej. Ale jeśli proces nasłuchuje tylko na porcie <numer_portu> adresu sprzężenia zwrotnego, np. 127.0.0.1, a następnie proces jest osiągalny tylko z tego samego komputera poprzez celowanie dokładnie w 127.0.0.1: <numer_portu> . Wypróbuj to narzędzie Python, aby zagrać!
Gab 是 好人
77

Gdy usługa nasłuchuje na 0.0.0.0, oznacza to, że usługa nasłuchuje na wszystkich skonfigurowanych interfejsach sieciowych, podczas nasłuchiwania na 127.0.0.1 usługa jest powiązana tylko z interfejsem pętli zwrotnej (dostępny tylko na komputerze lokalnym)

slubman
źródło
38

Adres IP 0.0.0.0może mieć bardzo różne znaczenie, w zależności od tego, gdzie jest używany.

  • Nie jest to poprawny adres, który należy podać faktycznemu interfejsowi sieciowemu, a także jakiemukolwiek innemu adresowi w podsieci 0.0.0.0/8 (tj. Dowolny adres zaczynający się od 0.).
  • Nie można go użyć jako adresu źródłowego w żadnym pakiecie IP, chyba że dzieje się tak, gdy komputer nadal nie zna własnego adresu IP i próbuje go uzyskać (klasyczny przykład: DHCP).
  • Jeśli jest używany w tabeli routingu, identyfikuje bramę domyślną; trasa do 0.0.0.0 jest domyślna, tzn. ta używana, gdy nie ma dostępnej bardziej określonej trasy do adresu docelowego.
  • Wreszcie, gdy netstatzobaczysz w wynikach polecenia (o co prosiłeś), oznacza to, że dane gniazdo nasłuchuje na wszystkich dostępnych adresach IP komputera; gdy komputer ma więcej niż jeden adres IP, gniazdo można powiązać tylko z określonym adresem i parą portów lub z portem i wszystkimi adresami; jeśli widzisz tam adres IP, oznacza to, że gniazdo nasłuchuje tylko na tym porcie i pod tym konkretnym adresem; jeśli widzisz 0.0.0.0, oznacza to, że nasłuchuje na tym porcie na wszystkich adresach komputera, w tym na sprzężeniu zwrotnym jeden ( 127.0.0.1).
Massimo
źródło
3
Co to znaczy, że skręcasz 0.0.0.0? Czy curl faktycznie kontaktuje się i wysyła zapytanie za pośrednictwem dostępnych interfejsów? Skąd ma wiedzieć, który interfejs jest właściwy? Rozumiem, w jaki sposób serwer może nasłuchiwać na wszystkich interfejsach, ale jaki jest mechanizm, w którym klient może żądać wszystkich interfejsów, na przykład kiedy zawijam 0.0.0.0 lub curl [::].
CMCDragonkai
1
System operacyjny najprawdopodobniej zablokuje ci to, ponieważ nie ma to sensu z perspektywy sieci. Próba ping 0.0.0.0użycia w systemie Windows powoduje wyświetlenie komunikatu o błędzie.
Massimo,
curl 0.0.0.0daje connection refusedna Arch Linux. ping 0.0.0.0z drugiej strony wydaje się być aliasem, dla ping 127.0.0.1którego działa dobrze.
Matthias Braun,
@MatthiasBraun connection refusedmoże być, ponieważ domyślnie curl próbuje połączyć się z portem 80 / tcp. Spróbuj znaleźć otwarte porty z nmap -sV localhostczym na przykład gdy 631 / TCP: curl 0.0.0.0:631.
Pablo A
27

Odpowiedź Lee B. jest słuszna, ale oto kilka istotnych RFC na wypadek, gdybyś był zainteresowany.

0.0.0.0:

Z RFC1122 , sekcja 3.1.2.3:

Podsumowujemy teraz ważne przypadki specjalne dla adresów IP klasy A, B i C, używając następującej notacji dla adresu IP:

            { <Network-number>, <Host-number> }

        or
            { <Network-number>, <Subnet-number>, <Host-number> }

...

          (a)  { 0, 0 }

             This host on this network.  MUST NOT be sent, except as
             a source address as part of an initialization procedure
             by which the host learns its own IP address.

Po prostu „ten host w tej sieci” ... jak stwierdza odpowiedź Lee B, przekłada się to na wszystkie dostępne adresy IP na twoim hoście. Hostowanie usługi w wersji 0.0.0.0 spowoduje automatyczne hostowanie tej usługi na każdym interfejsie adresowalnym.

127.0.0.1:

Z RFC5735 :

127.0.0.0/8 - Blok ten jest przeznaczony do użycia jako adres zwrotny hosta internetowego. Datagram wysłany przez protokół wyższego poziomu na adres w dowolnym miejscu w tym bloku zapętla się z powrotem w hoście. Jest to zwykle realizowane przy użyciu tylko 127.0.0.1/32 dla sprzężenia zwrotnego. Jak opisano w [RFC1122], sekcja 3.2.1.3, adresy w całym bloku 127.0.0.0/8 nie pojawiają się legalnie w żadnej sieci.

Różnica między 0.0.0.0 a adresem sprzężenia zwrotnego 127.0.0.1 polega na tym, że adres sprzężenia zwrotnego został zaprojektowany w celu umożliwienia w pełni funkcjonalnego interfejsu IP w samym hoście, niezależnie od tego, jak wygląda reszta konfiguracji sieci, jeśli taka istnieje. Każdy ruch wysyłany do urządzenia sprzężenia zwrotnego jest natychmiast odbierany na nim. Nie jest tak bardzo, że sieć sprzężenia zwrotnego „odnosi się” do twojego hosta ... bardziej przypomina to, że masz w swoim hoście mini segment sieci, który urządzenia, procesy i gniazda mogą otwierać i łączyć się z nimi.


źródło
4

W prostych słowach: Słuchanie na 0.0.0.0 oznacza słuchanie z dowolnego miejsca, które ma dostęp sieciowy do tego komputera, na przykład z tego samego komputera, sieci lokalnej lub Internetu, podczas gdy słuchanie na 127.0.0.1 oznacza słuchanie tylko z tego samego komputera

Hải Phong
źródło