IP-адрес и подсети (CIDR)
| Длина адреса IPv4 | 32 бита (4 октета) |
|---|---|
| Длина адреса IPv6 | 128 бит |
| Запись IPv4 | 192.0.2.10 |
| CIDR | RFC 1518/1519 (1993), RFC 4632 (2006) |
| Частные диапазоны IPv4 | 10.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.