Learning Platform
Глоссарий Troubleshooting
Урок 06.03 · 17 мин
Начальный
Private IPRFC 1918LoopbackLink-localSpecial Addresses

Специальные IP — приватные, loopback, link-local и broadcast

Не все IP-адреса одинаковы. У 192.168.1.5 и 8.8.8.8 совершенно разная судьба: первый никогда не появится в интернете, второй — публичный DNS-сервер Google. Эти различия закреплены в RFC и поддерживаются всеми роутерами в мире.

В этом уроке разберём специальные диапазоны IPv4-адресов: приватные (10.0/8, 172.16/12, 192.168/16), loopback (127.0.0.1), link-local (169.254/16), broadcast и multicast. Знание этих диапазонов даёт DE возможность быстро ориентироваться — увидев 100.64.X.X в логах, вы сразу поймёте, что это CGNAT провайдер, а не атака.


Приватные адреса — RFC 1918

В 1996 году IANA выделила три диапазона как «приватные» — их можно использовать в локальной сети без регистрации, но они никогда не маршрутизируются в публичном интернете. Все провайдеры обязаны дропать пакеты с такими адресами на границе.

Три приватных диапазона RFC 1918
10.0.0.0/8Самый большой. От 10.0.0.0 до 10.255.255.255. 16.7 миллионов адресов. Используется в крупных корпоративных сетях, AWS VPC по умолчанию
172.16.0.0/12Средний. От 172.16.0.0 до 172.31.255.255. 1 миллион адресов. Используется Docker (172.17.0.0/16) по умолчанию
192.168.0.0/16Самый маленький. От 192.168.0.0 до 192.168.255.255. 65,536 адресов. Домашние роутеры по умолчанию используют 192.168.0.0/24 или 192.168.1.0/24

Эти диапазоны можно использовать сколько угодно раз в разных сетях. У вас дома 192.168.1.X, у соседа тоже 192.168.1.X, и это нормально — они изолированы NAT-ами провайдеров.

# Где обычно встречаете приватные:
# - Дома (192.168.X.X)
# - В офисе (10.X.X.X или 172.16-31.X.X)
# - В Docker (172.17-31.X.X)
# - В Kubernetes (10.X.X.X для pod CIDR, 172.20.X.X для services)
# - В AWS VPC (10.X.X.X по дефолту)
# - В VPN-сетях (любой из трёх)

Что бывает, если приватный IP «утечёт» в публичный интернет:

  • Провайдер дропает на границе (ingress filtering, RFC 2827 / BCP 38).
  • Если как-то прошёл — маршрут до него отсутствует в публичной BGP-таблице, пакет дропается на первом роутере.
  • TTL истечёт за несколько хопов.

Поэтому приватные IP никогда не доходят до публичных сервисов. Логи на github.com никогда не покажут IP 192.168.X.X — они покажут публичный IP вашего NAT.


Loopback — 127.0.0.0/8

Loopback — адреса, ссылающиеся на саму машину. Стандартное обозначение — localhost -> 127.0.0.1.

Особенности:

  • Любой адрес 127.X.X.X — loopback. Можно использовать 127.0.0.5, 127.10.20.30 — всё это та же машина.
  • Пакеты на loopback никогда не идут в сетевую карту. Они обрабатываются в ядре прямо в TCP/IP-стеке.
  • Loopback-интерфейс lo есть всегда. Он не привязан к физической сети.
  • MTU на lo — 65,535 (а не 1500). Можно гонять огромные пакеты без фрагментации.
# Посмотреть loopback:
ip addr show lo
# 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536
#     inet 127.0.0.1/8 scope host lo
#     inet6 ::1/128 scope host

# IPv6 эквивалент:
ping -c 1 ::1

Зачем 16 миллионов адресов на loopback? Историческая щедрость стандарта. Реально используется только 127.0.0.1. Иногда крупные сервисы биндят разные модули на разные loopback-адреса (127.0.0.1 для одного процесса, 127.0.0.2 для другого — чтобы они не мешали друг другу на одном порту).

Loopback используется для:

  • Локальные сервисы. БД, кэш, message broker, локальные API. psql -h localhost подключается к 127.0.0.1:5432.
  • Health checks. curl localhost:8080/health без интернета и DNS.
  • Тестирование. Запустили тестовый сервер на 127.0.0.1:PORT, гоните по нему интеграционные тесты.
  • IPC. Если процессы на одной машине говорят по TCP — loopback быстрее любого ethernet’а (нет железа).
TIP

Когда биндите сервис только на 127.0.0.1, он недоступен снаружи — даже с другой машины в той же сети. Это безопасный default для локальных сервисов вроде Redis или Postgres. Чтобы открыть на сеть — bind на 0.0.0.0 (все интерфейсы) или на конкретный IP (192.168.1.5).


Этот диапазон называется link-local. Когда хост не смог получить IP по DHCP — он сам присваивает себе адрес из 169.254.X.X. Это сделано для того, чтобы устройства могли хотя бы общаться внутри одной L2-сети, даже без DHCP-сервера.

Алгоритм (RFC 3927, IPv4 Link-Local):

  1. DHCP-запрос failed (5-30 секунд таймаут).
  2. Хост выбирает случайный IP из 169.254.0.0/16 (кроме .0, .255, 169.254.0.0/16 reserved).
  3. Шлёт ARP probe: «у кого этот IP?»
  4. Если никто не ответил — занимает его.
  5. Если кто-то ответил — выбирает другой случайный.

Что бывает с этим IP:

  • Можно общаться только внутри сегмента. Никакого роутинга.
  • Никакого интернета.
  • Если потом DHCP заработает — хост перейдёт на DHCP-адрес и сбросит link-local.

Когда видите 169.254.X.X в конфиге — что-то не так с DHCP. Скорее всего сервер не отвечает, или вы вообще не подключены к сети.

# Симптом:
ip addr show
# inet 169.254.X.X/16 scope link

# Это значит: DHCP не сработал, я сам себе назначил адрес для общения в сегменте

Особый случай — метаданные облаков. AWS, GCP, Azure все используют адрес 169.254.169.254 для metadata service:

# В AWS EC2-инстансе:
curl http://169.254.169.254/latest/meta-data/instance-id
# i-0abc1234def567890

# Вернёт информацию о текущей виртуалке -- её IAM роль, регион, AMI-id и т.д.
# IMPORTANT: на новых инстансах нужна авторизация (IMDSv2 token).

Этот адрес работает только внутри виртуалки. Снаружи он недоступен. Чрезвычайно полезен для скриптов, которые должны узнать «а где я работаю?».


Broadcast — 255.255.255.255 и внутри подсети

В IPv4 есть два вида broadcast:

1. Limited broadcast255.255.255.255. Кадр уходит на MAC-broadcast ff:ff:ff:ff:ff:ff. Доходит до всех в текущем L2-сегменте. Не проходит через роутер.

2. Directed broadcast — адрес X.X.X.255 (для /24) или Y.Y.255.255 (для /16). Это broadcast подсети. Например 192.168.1.255 — все хосты в 192.168.1.0/24. Раньше шёл через роутеры (smurf attack использовала это), сейчас обычно дропается.

Broadcast в IPv4 -- две формы
255.255.255.255Limited broadcast. Все хосты текущего сегмента. Используется DHCP DISCOVER при отсутствии IP
Все в сегментеВКЛЮЧАЯ те, кто ещё не имеет IP. DHCP-клиент именно так и работает: 0.0.0.0 -> 255.255.255.255
192.168.1.255Directed broadcast подсети 192.168.1.0/24. Адрес = network + 0xFF. Обычно дропается на современных роутерах ради безопасности
Хосты подсетиВсе хосты ЗА конкретной подсетью. Если бы роутер пропускал -- было бы Smurf attack: отправляешь ICMP echo с подделанным src на directed broadcast чужой сети, все отвечают жертве

Broadcast используется:

  • DHCP DISCOVER. Клиент без IP шлёт broadcast (255.255.255.255), все DHCP-серверы в сегменте получают.
  • ARP requests. Шлются на MAC-broadcast (но IP-уровня broadcast тут нет, см. урок про ARP).
  • WoL (Wake-on-LAN). Magic packet шлётся broadcast’ом, спящая машина просыпается.
  • NetBIOS / SMB discovery. Старый Windows-протокол.

Хосты могут принимать или дропать broadcast. По умолчанию принимают. Если на интерфейсе много шума — может быть проблема.


Multicast — 224.0.0.0/4

Multicast — адреса для «один отправитель — много получателей», но в отличие от broadcast, получатели явно подписываются. Диапазон: 224.0.0.0 - 239.255.255.255.

Несколько важных multicast-адресов:

АдресЧто это
224.0.0.1All hosts на link
224.0.0.2All routers на link
224.0.0.5OSPF (все OSPF-роутеры)
224.0.0.6OSPF DR (designated router)
224.0.0.13PIM
224.0.0.18VRRP
224.0.0.22IGMPv3
224.0.0.251mDNS (Bonjour / Avahi — discovery в локалке)
224.0.0.252LLMNR (Link-Local Multicast Name Resolution)
239.X.X.XЛокальный scope — ваши собственные multicast группы

Multicast активно используется в:

  • Локальная discovery (mDNS на 224.0.0.251 для AirPlay, Chromecast, sharing).
  • IGMP (как маршрутизаторы знают, кто подписан на какую группу).
  • Маршрутизация (OSPF протокол обновлений идёт по multicast).
  • Stock market data (биржи раздают котировки multicast’ом подписчикам — эффективно).
  • VRRP / HSRP (active-passive HA для роутеров).

В большинстве end-user задач multicast не виден. Но если запустить tcpdump, вы увидите немало multicast’а.

# Захватить multicast-трафик:
sudo tcpdump -i any -n 'ip multicast'

# Что увидите:
# - mDNS-запросы от ваших устройств (поиск принтеров, AppleTV)
# - LLDP (если есть managed switches)
# - SSDP (UPnP discovery)

Зарезервированные диапазоны (must-know)

Кратко — что ещё «занято» в IPv4 и не годится для обычного использования:

ДиапазонЧто
0.0.0.0/8«Текущая сеть». 0.0.0.0 — wildcard «любой адрес». Не используется для хостов
10.0.0.0/8Приватный
100.64.0.0/10CGNAT (RFC 6598). Провайдеры используют для NAT’а абонентов
127.0.0.0/8Loopback
169.254.0.0/16Link-local
172.16.0.0/12Приватный
192.0.0.0/24IETF assignments (всякие техн. диапазоны)
192.0.2.0/24TEST-NET-1 (документация)
192.88.99.0/246to4 relay (исторически)
192.168.0.0/16Приватный
198.18.0.0/15Benchmarking (RFC 2544)
198.51.100.0/24TEST-NET-2 (документация)
203.0.113.0/24TEST-NET-3 (документация)
224.0.0.0/4Multicast
240.0.0.0/4«Зарезервировано» (Class E). Не используется
255.255.255.255/32Broadcast

Особенно полезно знать 100.64.0.0/10 — это CGNAT. Если видите такой IP в логах своего домашнего интернета — значит провайдер ставит вас за CGNAT (часто у мобильных операторов и кабельных провайдеров).

Также полезно знать 192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24 — это TEST-NET, они гарантированно не используются в продакшене. В документации и примерах — используйте их, а не реальные. Например, в книгах часто 203.0.113.5 как «пример удалённого сервера».


Узнать тип адреса в Python

import ipaddress

def describe(addr):
    ip = ipaddress.ip_address(addr)
    print(f'{addr}:')
    print(f'  is_private: {ip.is_private}')
    print(f'  is_loopback: {ip.is_loopback}')
    print(f'  is_link_local: {ip.is_link_local}')
    print(f'  is_multicast: {ip.is_multicast}')
    print(f'  is_global: {ip.is_global}')

describe('192.168.1.5')
# is_private: True, is_global: False
describe('127.0.0.1')
# is_loopback: True, is_private: True
describe('169.254.5.5')
# is_link_local: True, is_private: True
describe('8.8.8.8')
# is_global: True, is_private: False
describe('100.64.5.5')
# is_private: True (хотя на CGNAT он не маршрутизируется глобально)
describe('239.255.0.1')
# is_multicast: True, is_private: True

Это полезно при валидации входных данных. Например, в Allowlist-проверке отказываем приватным IP («только публичные допускаются») или наоборот.


Попробуй сам

# 1. Посмотреть свои адреса и определить их тип:
ip addr show
# inet 127.0.0.1/8 -- loopback
# inet 192.168.1.42/24 -- приватный (в локалке)
# inet6 fe80::... -- IPv6 link-local

# 2. Узнать публичный IP:
curl ifconfig.me

# 3. Проверить, что приватный IP не маршрутизируется:
# Это вернёт No route to host (после нескольких секунд):
ping -c 1 -W 2 10.123.45.67  # случайный 10/8 -- скорее всего не в вашей сети
# Тут больше зависит от вашего конкретного окружения

# 4. Запустить локальный сервис на разных IP:
python3 -m http.server 8000 --bind 127.0.0.1
# Откроете в браузере http://127.0.0.1:8000 -- работает
# С другой машины в локалке -- НЕ работает (bind только на loopback)

# vs:
python3 -m http.server 8000 --bind 0.0.0.0
# Теперь доступен с любого интерфейса -- из локалки тоже

# 5. Тест IMDS (если на AWS EC2):
curl http://169.254.169.254/latest/meta-data/

# 6. Посмотреть на multicast-трафик в локалке:
sudo tcpdump -i any -n 'ip multicast' -c 10
# Увидите mDNS-запросы (224.0.0.251) от смартфонов, ChromeCast и т.д.

# 7. Найти приватные хосты в локалке (ARP scan):
sudo arp-scan -l  # Linux
# Покажет всех соседей в локалке с их MAC и IP

Kubernetes pod CIDR и адреса сервисов: приватные диапазоны на кластерном уровне
Проверка знанийKnowledge check
Вы дома видите в 'ip addr' что у вашего ноутбука IP 10.45.230.18/22, default gateway 10.45.228.1. Провайдер кабельного интернета. Спрашиваете 'почему такой странный IP, разве он не должен быть из 192.168'? Что происходит?
ОтветAnswer
Тут несколько слоёв NAT, и ваш ноутбук получает приватный IP из провайдерского пула. 10.45.230.18/22 -- это адрес из 10.0.0.0/8 (приватный диапазон RFC 1918). Провайдер использует этот блок для своих абонентов вместо классических домашних 192.168.X.X. На самом деле он действует как CGNAT (Carrier-Grade NAT): у вас IP 10.45.230.18 (приватный, в подсети провайдера), у домашнего роутера/модема публичный IP тоже не выдан -- он внутри провайдерской сети получает приватный 10.45.228.1, и провайдер уже на своих border-роутерах NATит весь этот пул на маленький набор публичных IP. Когда вы делаете 'curl ifconfig.me', вы увидите публичный IP -- но это shared IP провайдера, и одновременно с вами через него выходит ещё пара сотен абонентов. Это типично для российских кабельных и мобильных провайдеров. Минусы: вы не можете хостить серверы дома (никто извне не достучится -- ваш IP внутри провайдерского NAT), плохо работают P2P-приложения, нет своего IP для VPN-сервера дома, и провайдер видит весь ваш трафик (точнее, любой кто видит логи их NAT-таблиц). Можно купить выделенный IP за дополнительную плату.

Проверьте понимание

Результат: 0 из 0
Концептуальный
Вопрос 1 из 5. Какие три диапазона определены RFC 1918 как приватные для IPv4?

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 5