127.0.0.1 — это не только localhost

Если вы админ со стажем, то ввод 127.0.0.1 в терминал давно скорее рефлекс, чем осознанное действие.

Но стоит помнить: 127.0.0.1 - лишь один адрес из целого зарезервированного диапазона 127.0.0.0/8. Миллионы loopback-адресов терпеливо ждут своего часа, и иногда полезно о них вспомнить.

Эта статья - скорее напоминание, чем откровение: чем ещё, кроме привычного 127.0.0.1, можно воспользоваться и зачем.

Большинство воспринимает 127.0.0.1 как магический адрес, который значит «мой компьютер». Но вообще говоря, это всего один адрес в огромном зарезервированном блоке: 127.0.0.0/8

Это 16 777 216 возможных IP-адресов - от 127.0.0.0 до 127.255.255.255 - и все они выделены под loopback. То есть любой IP из этого диапазона технически можно использовать как loopback-адрес.

Так почему же все по умолчанию берут именно 127.0.1? Так исторически сложилось. Но абсолютной необходимости в этом никогда не было.

А что вообще такое loopback-интерфейс?

Давайте разберём:

В Linux он обычно называется lo и всегда включён по умолчанию.

Пример из ifconfig или ip a:

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
    inet 127.0.0.1  netmask 255.0.0.0

А вот эта маска 255.0.0.0? Она как раз и говорит, что интерфейс покрывает весь диапазон 127.0.0.0/8, а не только один адрес.

Сценарии использования других адресов 127.x.x.x

Ну окей, 127.0.0.1 - не единственный игрок в этой песочнице. Но есть ли смысл использовать остальные?

На самом деле да.

1. Параллельное тестирование на localhost

Когда-нибудь пытались запустить несколько сервисов, которые все как назло хотят забиндиться на 127.0.0.1:8000? Увы - конфликт портов.

Решение: привязать каждый сервис к разному loopback-адресу.

127.0.0.2:8000
127.0.0.3:8000

И вуаля: никаких конфликтов, никаких особых сетевых прав, не нужен ни Docker, ни виртуалки. Всё локально и всё безопасно.

2. Изоляция приложений

Можно сегментировать сервисы, назначая им разные loopback-адреса. Например:

А потом настроить приложение так, чтобы оно подключалось только к этим адресам. В итоге отладка и песочница становятся куда чище.

3. Тестирование DNS или логики маршрутизации

Можно подделывать таблицы маршрутизации или эмулировать ответы DNS, направляя их на фейковые loopback-адреса вроде 127.100.100.100 - для локальных экспериментов, не задевая внешние сервера.

Отлично подходит для:

Можно ли реально использовать любой адрес из 127.x.x.x?

Короткий ответ: в основном да.

Длинный ответ: есть нюансы.

Некоторые программы - особенно старые или с жёстко прописанной логикой - считают loopback-ом только 127.0.0.1. Такие могут игнорировать или даже отклонять подключения с других адресов из диапазона 127.x.x.x.

Аналогично, некоторые файрволы или средства безопасности могут разрешать только 127.0.0.1, оставляя остальной диапазон заблокированным или недоверенным.

Если вы делаете что-то критичное, убедитесь, что вы:

«localhost» vs «127.0.0.1»

Многие думают, что localhost - это просто синоним 127.0.0.1. Но они не всегда взаимозаменяемы.

Что на самом деле такое localhost:

Забавный факт: на некоторых системах localhost может резолвиться в IPv6-адрес ::1, если приложение предпочитает IPv6.

Поэтому в коде localhost и 127.0.0.1 могут вести себя по-разному, в зависимости от:

Используйте IP-адреса, когда важна точность. Используйте hostnames, когда нужна гибкость в настройке.

Любопытный факт: loopback-адреса иногда становятся неожиданным вектором атак

Поскольку многие инструменты считают loopback-интерфейс «безопасным», использование диапазона 127.0.0.0/8 в злонамеренных целях может приводить к уязвимостям.

Знаковый случай: уязвимость в Java HttpURLConnection, где атакующий смог заставить софт подключиться к 127.0.0.2, думая, что это внешний адрес.

Чтобы этого избежать:

Пример из реального мира: Docker, микросервисы и немного loopback-магии

Допустим, вы разрабатываете микросервисы локально.

Вместо того чтобы возиться с сетями в docker-compose, можно просто замапить:

Каждый сервис думает, что он на отдельном хосте. Вы избегаете конфликтов, упрощаете тестирование и полностью остаетесь офлайн. А если ещё добавить записи в /etc/hosts, можно дать им удобные имена:

127.10.0.1    service-a.local
127.20.0.1    service-b.local
127.30.0.1    service-c.local

Теперь можно делать запросы вроде:

curl http://service-a.local:3000

Практично и быстро.