В чем разница между IP-адресом 0.0.0.0 и 127.0.0.1?

220

Я знаю, что 127.0.0.1 ~ 127.255.255.254 - это петлевые IP-адреса для большинства современных операционных систем, и эти IP-адреса можно использовать для обозначения нашего собственного компьютера.

Но что такое 0.0.0.0? Кажется, это также относится к локальному компьютеру, так в чем же разница ?

И не могли бы вы объяснить следующие IP-соединения для меня:

снимок экрана с выводом netstat -an

Jichao
источник
6
Также взгляните на этот вопрос, так как он дает подробную информацию о том, что такое 0.0.0.0 (а что нет): serverfault.com/questions/228629/…
Элли Кессельман,
Современная операционная система будет использовать в ::1качестве петлевого адреса.
Касперд

Ответы:

157

Единственное, что вы не говорите «все адреса должны иметь доступ» - это делается в вашем брандмауэре (ах) и / или на серверном программном обеспечении и / или других уровнях безопасности, таких как tcpwrappers.

0.0.0.0 в этом контексте означает «все IP-адреса на локальном компьютере» (фактически, вероятно, «все IPv4-адреса на локальном компьютере»). Таким образом, если ваш компьютер веб-сервера имеет два IP-адреса, 192.168.1.1 и 10.1.2.1, и вы разрешаете демону веб-сервера, например apache, прослушивать 0.0.0.0, он будет доступен на обоих этих IP-адресах. Но только к тому, что можно связать эти IP-адреса и веб-порт (ы).

Обратите внимание, что в другом контексте (маршрутизация) 0.0.0.0 обычно означает маршрут по умолчанию (маршрут к «остальной части» Интернета, кроме маршрутов в вашей локальной сети и т. Д.).

Ли Б
источник
То есть вы имеете в виду, что сокет веб-сервера связан с любыми доступными адресами, когда он слушает 0.0.0.0?
onmyway133
0.0.0.0означает маршрут по умолчанию, только если он сопровождается префиксом /0(или 0.0.0.0
маской сети
Следует отметить: если какой-либо процесс прослушивает 0.0.0.0, он будет доступен по IP-адресам всех сетевых интерфейсов машины, которые включают в себя текущий настроенный адрес интерфейса обратной связи. Но если процесс прослушивает только порт <portNumber> с адресом обратной связи, например, 127.0.0.1, и тогда процесс доступен только с той же машины , нацелившись точно на 127.0.0.1: <portNumber> . Попробуйте этот инструмент Python, чтобы играть!
Габ 是 好人
77

Когда служба прослушивает 0.0.0.0, это означает, что служба прослушивает все настроенные сетевые интерфейсы, при прослушивании 127.0.0.1 служба привязана только к интерфейсу обратной связи (доступно только на локальном компьютере).

slubman
источник
38

IP-адрес 0.0.0.0может иметь очень разные значения, в зависимости от того, где он используется.

  • Это недопустимый адрес, который должен быть передан действительному сетевому интерфейсу вместе с любым другим адресом в подсети 0.0.0.0/8 (т. Е. Любой адрес, начинающийся с 0.).
  • Его нельзя использовать в качестве адреса источника для любого IP-пакета, если только это не происходит, когда компьютер все еще не знает свой собственный IP-адрес и пытается получить его (классический пример: DHCP).
  • Если используется в таблице маршрутизации, она идентифицирует шлюз по умолчанию; маршрут к 0.0.0.0 является маршрутом по умолчанию, т.е. тот, который используется, когда нет более конкретного маршрута, доступного для адреса назначения.
  • Наконец, когда netstatвы видите в выводе команды (что вы и просили), это означает, что данный сокет прослушивает все доступные IP-адреса, которые есть у компьютера; когда компьютер имеет более одного IP-адреса, сокет может быть связан только с конкретным адресом и парой портов или с портом и всеми адресами; если вы видите там IP-адрес, это означает, что сокет прослушивает только этот порт и этот конкретный адрес; если вы видите 0.0.0.0, это означает, что он прослушивает этот порт на всех адресах машины, включая loopback one ( 127.0.0.1).
Massimo
источник
3
Что это значит, если вы скручиваете 0.0.0.0? Действительно ли curl связывается и отправляет запрос через доступные интерфейсы? Как он узнает, какой интерфейс правильный? Я понимаю, как сервер может прослушивать все интерфейсы, но каков механизм запроса клиентом всех интерфейсов, например, когда я делаю curl 0.0.0.0 или curl [::].
CMCDragonkai
1
Скорее всего, ОС не позволит вам сделать это, так как это не просто имеет смысл с точки зрения сети. Попытка в ping 0.0.0.0системе Windows приводит к сообщению об ошибке.
Массимо,
curl 0.0.0.0уступает connection refusedпо Arch Linux. ping 0.0.0.0с другой стороны, кажется, псевдоним, для ping 127.0.0.1которого работает нормально.
Матиас Браун
@MatthiasBraun connection refusedможет быть потому, что по умолчанию curl пытается подключиться к порту 80 / tcp. Попробуйте найти открытые порты с , nmap -sV localhostа затем в течение , например , если 631 / TCP: curl 0.0.0.0:631.
Пабло А
27

Ответ Lee B правильный, но вот некоторые соответствующие RFC на тот случай, если вам интересно.

0.0.0.0:

Из RFC1122 , раздел 3.1.2.3:

Теперь мы суммируем важные частные случаи для IP-адресов классов A, B и C, используя следующие обозначения для 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.

Просто, «этот хост в этой сети» ... как говорится в ответе Ли Б., это преобразуется во все доступные IP-адреса на вашем хосте. Размещение службы на 0.0.0.0 будет автоматически размещать эту службу на каждом адресуемом интерфейсе.

127.0.0.1:

Из RFC5735 :

127.0.0.0/8 - этот блок назначен для использования в качестве петлевого адреса узла Интернета. Датаграмма, отправленная протоколом более высокого уровня на адрес в любом месте этого блока, возвращается обратно в хост. Обычно это реализуется с использованием только 127.0.0.1/32 для обратной петли. Как описано в [RFC1122], раздел 3.2.1.3, адреса внутри всего блока 127.0.0.0/8 нигде законно не появляются ни в одной сети.

Разница между 0.0.0.0 и адресом обратной связи 127.0.0.1 заключается в том, что адрес обратной связи предназначен для обеспечения полностью функционирующего IP-интерфейса внутри самого хоста, независимо от того, как выглядят остальные настройки сети, если таковые имеются. Любой трафик, отправленный на устройство обратной связи, сразу же принимается на нем. Это не так, что петлевая сеть «ссылается» на ваш собственный хост… это скорее похоже на мини-сегмент сети на вашем хосте, который устройства, процессы и сокеты могут открывать и подключать.


источник
4

Проще говоря: прослушивание 0.0.0.0 означает прослушивание из любого места, которое имеет сетевой доступ к этому компьютеру, например, с этого компьютера, из локальной сети или из Интернета, в то время как прослушивание по 127.0.0.1 означает прослушивание только с этого самого компьютера.

Хи Фонг
источник