IP-адрес и подсети (CIDR)

Материал из llmdocs — справочник разработчика
IP-адрес и подсети (CIDR)
Длина адреса IPv432 бита (4 октета)
Длина адреса IPv6128 бит
Запись IPv4192.0.2.10
CIDRRFC 1518/1519 (1993), RFC 4632 (2006)
Частные диапазоны IPv410.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 (RFC 1918)
РаспределениеIANA → региональные регистраторы (RIPE NCC, ARIN, APNIC…)
Исчерпание IPv4 у IANAфевраль 2011

IP-адрес — числовой идентификатор сетевого интерфейса в сети, работающей по протоколу IP (см. TCP/IP). По нему маршрутизаторы доставляют пакеты получателю. CIDR (англ. Classless Inter-Domain Routing — «бесклассовая междоменная маршрутизация») — способ описывать и распределять подсети, то есть непрерывные диапазоны адресов, в форме адрес/длина префикса, например 192.168.1.0/24.

Подсети в нотации CIDR встречаются повсюду: в настройках файрволов и облачных сетей, в правилах доступа к базам данных, в конфигурации Docker и Kubernetes, в списках разрешённых адресов API.

Устройство адреса IPv4

Адрес IPv4 — 32-битное число, которое записывают как четыре десятичных октета через точку: 192.168.1.10. Адрес делится на две части: сетевую (префикс, общий для всех узлов подсети) и узловую (номер конкретного узла). Где проходит граница, определяет длина префикса или эквивалентная ей маска подсети:

адрес     192.168.1.10   11000000.10101000.00000001.00001010
маска     255.255.255.0  11111111.11111111.11111111.00000000   (/24)
сеть      192.168.1.0    первые 24 бита — сеть, последние 8 — узел

Два узла находятся в одной подсети, если их адреса совпадают в префиксной части; тогда они общаются напрямую, а иначе отправляют пакеты через маршрутизатор (шлюз по умолчанию). Адреса IPv6 устроены так же, только длиной 128 бит (см. IPv6).

От классов к CIDR

Изначально адреса делились на классы: A (сеть /8, 16,7 млн адресов), B (/16, 65 тыс.) и C (/24, 256). Организации, которой не хватало класса C, приходилось выдавать класс B, и адреса расходовались впустую, а таблицы маршрутизации разрастались. В 1993 году ввели CIDR: префикс может быть любой длины, а несколько соседних сетей можно объявить одним маршрутом — агрегировать.[1]

Таблица префиксов

Префикс Маска Адресов Пригодно для узлов
/8 255.0.0.0 16 777 216 16 777 214
/16 255.255.0.0 65 536 65 534
/24 255.255.255.0 256 254
/28 255.255.255.240 16 14
/30 255.255.255.252 4 2
/31 255.255.255.254 2 2 (точка-точка)
/32 255.255.255.255 1 один узел

В подсети из 2^(32 − n) адресов первый — адрес самой сети, последний — широковещательный, поэтому узлам достаётся на два меньше (кроме /31 и /32). Запись /32 используют, чтобы указать ровно один адрес, например в правиле файрвола.

Особые диапазоны

Диапазон Назначение
10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16 частные сети (RFC 1918)[2]
127.0.0.0/8 петлевой интерфейс (127.0.0.1 — localhost)
169.254.0.0/16 локальные адреса канала, автоматическая настройка без DHCP
100.64.0.0/10 общее адресное пространство провайдеров (CGNAT)[4]
192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24 для документации и примеров
224.0.0.0/4 многоадресная рассылка (multicast)
0.0.0.0/0 «любой адрес» — маршрут по умолчанию

Полный перечень ведёт IANA.[3] Частные адреса не маршрутизируются в интернете: чтобы устройства домашней или офисной сети выходили наружу, роутер подменяет их внешним адресом с помощью NAT.

Распределение адресов

Адресами управляет IANA, раздающая крупные блоки пяти региональным интернет-регистраторам (для Европы, Ближнего Востока и России — RIPE NCC), а те выдают их провайдерам и организациям. Свободный пул IPv4 у IANA закончился в феврале 2011 года, у RIPE NCC — в 2019-м. С тех пор адреса IPv4 продают и сдают в аренду, а облачные провайдеры берут плату за публичные адреса. Долгосрочное решение — переход на IPv6.

Практика

ip -4 addr show                  # адреса и префиксы интерфейсов
ip route                         # маршруты; default via ... — шлюз
ipcalc 10.20.0.0/20              # границы подсети (утилита ipcalc)

В Python с адресами удобно работать через модуль ipaddress:[6]

import ipaddress

net = ipaddress.ip_network("10.20.0.0/20")
print(net.num_addresses, net[1], net[-2])            # 4096 10.20.0.1 10.20.15.254
print(ipaddress.ip_address("10.20.7.9") in net)      # True
print(list(net.subnets(new_prefix=22)))              # четыре подсети /22

Типичные ошибки

  • Пересечение диапазонов: внутренняя сеть Docker (по умолчанию из 172.17.0.0/16) или облачная VPC совпадает с офисной сетью или сетью VPN, и часть адресов становится недоступна.
  • Правило «открыть для 0.0.0.0/0» в группе безопасности облака открывает сервис всему интернету.
  • Путаница между адресом подсети и адресом узла: в правиле 192.168.1.10/24 имеется в виду вся сеть 192.168.1.0/24.

См. также

Источники

  1. RFC 4632 — Classless Inter-domain Routing (CIDR)
  2. RFC 1918 — Address Allocation for Private Internets
  3. IANA — IPv4 Special-Purpose Address Registry
  4. RFC 6598 — IANA-Reserved IPv4 Prefix for Shared Address Space
  5. RFC 791 — Internet Protocol
  6. Python documentation — ipaddress