CIDR в диапазон адресов

Превратите блок CIDR в диапазон адресов — или диапазон в минимальный набор блоков, точно его покрывающих.

Префикс — это сколько битов закреплено. Все биты после него меняются.

Охватывает

10.0.0.0 10.0.3.255

Всего адресов: 1 024.

Первый адрес

10.0.0.0

Последний адрес

10.0.3.255

Всего адресов

1 024

Маска подсети

255.255.252.0

Пригодно для узлов

1 022

Первый и последний — это адрес сети и широковещательный адрес.

Следующий блок начинается с

10.0.4.0

Пригодится, когда большой блок нарезают на идущие подряд выделения.

Правило выравнивания, из которого следует всё остальное

CIDR подчиняется одному ограничению: блок из 2ⁿ адресов обязан начинаться с числа, кратного 2ⁿ. /24 покрывает 256 адресов, поэтому может начинаться только там, где последний октет равен 0. /26 покрывает 64 и потому начинается лишь с .0, .64, .128 или .192.

Это не бюрократия. Именно это делает маршрутизацию быстрой: маршрутизатор решает, куда отправить пакет, наложив маску на адрес назначения и сравнив — пара инструкций. Произвольные диапазоны потребовали бы сравнивать каждый адрес с нижней и верхней границей, и так на каждом пакете.

Практическое следствие — как раз то, ради чего существует этот инструмент. Человеческие диапазоны не считаются с границами степеней двойки, поэтому перевод одного из них в CIDR обычно даёт несколько блоков: маленькие по неровным краям и крупные в выровненной середине.

Разобранный пример

От 192.168.1.10 до 192.168.1.20 — одиннадцать адресов. Одиннадцать не степень двойки, значит одним блоком не обойтись. Жадное покрытие идёт вперёд от .10:

БлокПокрываетПочему такой размер
192.168.1.10/31.10 – .11.10 чётный, поэтому блок из 2 адресов начинается здесь; из 4 — уже нет.
192.168.1.12/30.12 – .15.12 кратно 4.
192.168.1.16/30.16 – .19.16 кратно 16, но осталось всего 5 адресов, так что 4 — наибольшее, что помещается.
192.168.1.20/32.20Остался один адрес.

Четыре блока на одиннадцать адресов. Каждый блок целиком внутри диапазона, и ничего снаружи в него не попало.

Где это встречается

  • Правила межсетевых экранов и группы безопасности. AWS, Azure и GCP выражают диапазоны источников в CIDR, поэтому список доступа, переданный вам как «с 10.20.30.40 по 10.20.31.200», приходится преобразовать, прежде чем вводить.
  • Записи маршрутизации. Статическому маршруту нужен префикс, а не диапазон.
  • Чтение блока, который вам назвали. Хостер сообщает, что ваше выделение — 203.0.113.64/29; первое направление этого инструмента скажет, что это .64 – .71, из которых назначить можно .65 – .70.
  • Проверка, пересекаются ли два блока. Переведите оба в диапазоны и сравните числа — куда проще, чем рассуждать о префиксах.

Запись, в которой стоит быть точным

10.0.0.5/24 и 10.0.0.0/24 оба корректны и означают разное. Второе называет сеть. Первое называет узел внутри этой сети и является тем, как пишут конфигурацию интерфейса: одна строка несёт и адрес, и блок, которому он принадлежит. Если вставить первое туда, где ждут сеть, большинство инструментов молча замаскируют его до 10.0.0.0/24 — обычно это и требовалось, но не всегда.

0.0.0.0/0 — это весь интернет. Так правильно записывать маршрут по умолчанию, и это очень серьёзная вещь, чтобы оставлять её во входящем правиле межсетевого экрана.

Смежное

За полным разбором одного блока — сеть, широковещательный адрес, диапазон узлов, двоичный вид — обращайтесь к калькулятору подсетей. А для перевода между /24 и 255.255.255.0 есть отдельный конвертер с полной таблицей.

Вопросы про CIDR

Почему мой диапазон требует нескольких блоков CIDR вместо одного?

Потому что блоки CIDR должны быть выровнены: блок из 2ⁿ адресов обязан начинаться с числа, кратного 2ⁿ. Диапазон от 192.168.1.10 до 192.168.4.200 — это 959 адресов, но он начинается с .10, а не на границе степени двойки, и заканчивается в середине блока, поэтому его приходится покрывать всё более крупными блоками, двигаясь внутрь с обоих концов. Наименьший одиночный блок, вмещающий весь диапазон, — это /21 на 2 048 адресов, из которых 1 089 вы не запрашивали.

А нельзя просто округлить до одного блока побольше?

Так аккуратнее, и обычно это неверно. Диапазон переводят в CIDR почти всегда затем, чтобы написать правило межсетевого экрана, группу безопасности или маршрут, — а округление вверх молча открывает доступ к адресам, которых никто не имел в виду. Этот инструмент даёт точное покрытие: каждый адрес в результате лежит внутри вашего диапазона, и каждый адрес диапазона попадает в результат.

Что означает число после косой черты?

Сколько битов слева зафиксировано. /24 фиксирует двадцать четыре бита из тридцати двух и оставляет свободными восемь, то есть 256 адресов. Каждая следующая единица вдвое уменьшает блок: /25 — это 128 адресов, /26 — 64. В обратную сторону: вычтите префикс из 32 и возведите 2 в полученную степень.

Является ли 10.0.0.5/24 корректным блоком CIDR?

Запись корректна и встречается постоянно, но описывает она не блок, начинающийся с .5, — она описывает узел 10.0.0.5 внутри блока 10.0.0.0/24. Конфигурации интерфейсов пишут именно так намеренно: одна строка сразу несёт и адрес, и сеть, которой он принадлежит. Если вы имели в виду блок, адресной частью должен быть адрес сети.

Насколько велик /0?

Это всё адресное пространство IPv4, все 4 294 967 296 адресов. Он не фиксирует ни одного бита. Вы встретите его как маршрут по умолчанию: 0.0.0.0/0 означает «всё», и именно поэтому он стоит последней записью в таблице маршрутизации и поэтому же его случайный ввод в правило межсетевого экрана так опасен.

Последняя проверка . Заметили, что что-то устарело? Напишите нам.