Вопрос или проблема
Я запускаю пример в hiredis, который использует 127.0.0.2
в качестве IP-адреса сервера Redis, и он работает нормально. На самом деле, сервер Redis работает на той же машине. Я знаю, что 127.0.0.1
— это IP-адрес lo
, но как насчет 127.0.0.2
? Он такой же, как 127.0.0.1
?
Да:
Стандарты сети IPv4 резервируют весь блок адресов 127.0.0.0/8 для целей петлеобратной связи. Это означает, что любой пакет, отправленный на один из 16 777 214 адресов (от 127.0.0.1 до 127.255.255.254), будет возвращен обратно. IPv6 имеет только один адрес, ::1.
Различные стандарты Internet Engineering Task Force (IETF) резервируют блок адресов IPv4 127.0.0.0/8 в записи CIDR и адрес IPv6 ::1 для этой цели. Наиболее распространенным адресом IPv4 является 127.0.0.1. Обычно эти адреса петлеобратной связи сопоставляются с именами хостов, localhost или loopback.
или из самого RFC:
127.0.0.0/8 – Этот блок назначен для использования в качестве адреса петлеобратной связи интернет-хоста. Датаграмма, отправленная более высокоуровневым протоколом на адрес в этом блоке, должна возвращаться внутрь хоста. Обычно это реализуется с использованием только 127.0.0.1/32 для петлеобратной связи, но никакие адреса в этом блоке не должны появляться в сети [RFC1700, страница 5].
Для развлечения попробуйте пинговать:
$ ping 127.127.127.127
PING 127.127.127.127 (127.127.127.127) 56(84) байт данных.
64 байта от 127.127.127.127: icmp_req=1 ttl=64 время=0.110 мс
64 байта от 127.127.127.127: icmp_req=2 ttl=64 время=0.065 мс
^C
--- Статистика пинга 127.127.127.127 ---
2 пакета передано, 2 получено, потеря пакетов 0%, время 999 мс
rtt min/avg/max/mdev = 0.065/0.087/0.110/0.024 мс
Я отвечу на каждый из ваших вопросов ниже, с ссылками и примерами. Это не так просто, как Да или Нет.
- “Все ли
127.x.x.x
адреса ограничены локальной машиной?” Да - “Все ли
127.x.x.x
адреса привязаны к интерфейсуlo
” Да - “Являются ли
127.x.x.x
адреса маршрутизируемыми по сети?” Нет - “Являются ли все адреса 127.x.x.x одинаковыми?” Нет (в зависимости от операционной системы)
127.0.0.0/8 – Этот блок назначен для использования в качестве адреса петлеобратной связи интернет-хоста. Датаграмма, отправленная более высокоуровневым протоколом на адрес в этом блоке, возвращается внутрь хоста. Это обычно реализуется с использованием только 127.0.0.1/32 для петлеобратной связи. Как описано в [RFC1122], Раздел 3.2.1.3, адреса внутри всего блока 127.0.0.0/8 легитимно не появляются в какой-либо сети.
— RFC5735 Подчеркнуто мной.
- “Является ли
127.0.0.2
тем же самым, что127.0.0.1
?” НЕТ Согласно rfc5735 это может быть так, но не обязательно. Это поведение, определяемое реализацией. См. руководство вашей операционной системы. В любом случае весь диапазон зарезервирован и не должен маршрутизироваться по сети.
Хотя 127.0.0.1
до 127.255.255.254
— это все локальные адреса, привязанные к интерфейсу lo
. Они не одинаковы. Вы можете использовать каждый адрес для привязки к различной службе на одном и том же порту. Например, 16 миллионов веб-серверов на порту 80, доступных только с локальной машины (если вы не исчерпаете память или другой ресурс в первую очередь)
Я только что настроил службу docker, чтобы привязаться к 127.0.0.2:80
. Затем я добавил псевдоним в /etc/hosts
. Теперь я могу подключиться к ней через http://myserver
, но не через http://127.0.0.1
или http://localhost
. Однако она доступна только для этой машины, так как находится только на интерфейсе lo
.
Затем я настроил еще одну службу docker, чтобы привязаться к 127.0.0.3:80
, и службу python на localhost:80
и еще одну на 127.0.0.4:80
.
Это может не работать на всех операционных системах.
Я использую Debian(9) Gnu/Linux, ядро Linux 4.9.0-3-amd64. Некоторые ОС могут обрабатывать все адреса 127.0.0.1
→ 127.255.255.254
одинаково. Некоторые могут работать только с 127.0.0.1
.
Обратите внимание, что такие службы, как ping, будут слушать на 0.0.0.0 (ipv4), так что ping 127.127.127.127
будет принят слушателем, потому что 127.127.127.127
является одним из ваших адресов. Однако, если служба слушает на конкретном адресе, тогда вам нужно использовать этот конкретный адрес для подключения к ней (в зависимости от используемой операционной системы).
см. также
Это не исчерпывающий общий ответ (он уже есть). Этот мой ответ показывает пример, когда 127.0.0.2
был использован для решения проблемы.
Извлечение:
ОП пытался протестировать какое-то программное обеспечение в случае, когда его соединение с сервером было отклонено. Это было сделано на сервере с помощью временного правила iptables
, которое отклоняет весь трафик от IP-клиента. Клиент сразу смог “увидеть”, что соединение было отклонено.
Проблема возникла, когда этот человек переместил серверное программное обеспечение на ту же машину, что и клиент, и попытался использовать интерфейс петлеобратной связи. Правило было установлено, чтобы блокировать связь с 127.0.0.1
, но информация о том, что соединение было отклонено, проходила через то же правило и никогда не доходила до клиентского программного обеспечения, которое зависало (предположительно до истечения времени ожидания).
Решением было использовать 127.0.0.2
в качестве адреса сервера и установить правило, которое отклоняет соединения к нему. Информация об отказе дошла до 127.0.0.1
и была передана клиентскому программному обеспечению.
Ответ или решение
IP-адрес 127.0.0.2 относится к диапазону адресов, зарезервированных для внутреннего локального соединения на уровне IPv4. Эти адреса относятся к блоку 127.0.0.0/8, который, согласно стандартам Интернета и рекомендациям IETF, специально отведён для использования в качестве адресов обратной связи (loopback). Это означает, что любой пакет, отправленный на адрес в этом диапазоне, возвращается обратно внутрь устройства.
Почему 127.0.0.2 и 127.0.0.1 не одинаковы?
Хотя 127.0.0.1 является наиболее распространённым адресом для обращения к локальному хосту, другие адреса в этом диапазоне (например, 127.0.0.2, 127.0.0.3 и т.д.) также могут использоваться для этой цели. Тем не менее, важно подчеркнуть, что 127.0.0.2 и 127.0.0.1 не являются полностью идентичными. Это связано с тем, что поведение этих адресов может зависеть от операционной системы и конфигурации сервера:
-
Изоляция сервисов: Использование различных адресов в диапазоне 127.x.x.x позволяет привязывать отдельные службы к одному и тому же порту на одной машине. Например, вы можете запустить веб-сервер на 127.0.0.1:80 и дополнительный сервис на 127.0.0.2:80. Это позволяет управлять доступом к каждому сервису независимо, даже если они обслуживают один и тот же порт.
-
Тестирование и разработка: Разработчики могут использовать разные адреса, чтобы избежать конфликтов при тестировании приложений, которые требуют соединений с локальными хостами. Например, если одно приложение ожидает подключения по адресу 127.0.0.1, использование 127.0.0.2 позволяет проверить функциональность другого приложения без нарушения работы первого.
Практическое применение
В контексте использования Redis и hiredis
, указание на 127.0.0.2 может оказаться полезным, если сетевые правила (например, в iptables
на системах Linux) применены для фильтрации трафика. Сохраняя основное приложение на одном из адресов, возможно избежать проблем с подключением при активных правилах, ограничивающих трафик к 127.0.0.1.
Заключение
Таким образом, 127.0.0.2 является частью более широкого диапазона IP-адресов, отведённых для внутреннего соединения, которое возвращает все пакеты, но его использование может иметь свои особенности, зависящие от конкретной конфигурации системы. Несмотря на связь между всеми адресами в диапазоне 127.x.x.x, такие как 127.0.0.1 и 127.0.0.2, важно понимать их различия и возможности, которые они предоставляют при разработке и тестировании программного обеспечения.