bitlvl
RU

Агрегатор и разделитель CIDR

По одному диапазону в строке, в любой форме. Результат — самый короткий список блоков CIDR, покрывающий ровно те же адреса, готовый для межсетевого экрана, ACL или таблицы маршрутизации.

Результаты и сообщения этого инструмента выводятся на английском языке.

Агрегация

Два блока можно объединить в один, когда они одинакового размера, соседние, и объединённый блок выровнен по своему новому размеру: 10.0.0.0/25 и 10.0.0.128/25 становятся 10.0.0.0/24, а 10.0.0.128/25 и 10.0.1.0/25 — нет. Инструмент сортирует ввод, объединяет всё, что пересекается или соприкасается, а затем записывает каждый получившийся интервал как минимальное число выровненных блоков. Именно это делают маршрутизаторы при суммаризации маршрутов, и именно это нужно перед вставкой списка в межсетевой экран: меньше правил, быстрее сопоставление, нет дубликатов.

Диапазоны в CIDR

Произвольный диапазон вроде 192.168.1.6 – 192.168.1.9 редко является одним блоком. Алгоритм берёт самый большой выровненный блок, который начинается с первого адреса диапазона и помещается в него, затем повторяет с того места, где этот блок заканчивается: здесь 192.168.1.6/31 и 192.168.1.8/31. Диапазону из 255 адресов, начинающемуся с .1, нужны восемь блоков.

Исключения

«Всё из 10.0.0.0/8, кроме 10.1.0.0/16» — частая задача для раздельного туннелирования и списков разрешений. Вычитание /16 из /8 оставляет 8 блоков (/9, /10 … /16), потому что каждый шаг двоичного деления отщепляет одну половину. Вывод растёт примерно на один блок на каждый бит разницы.

Форматы вывода

Форма nftables создаёт set, который можно вставить в nft add element; iptables выдаёт по одному правилу на блок; форма Cisco использует инверсные маски (wildcard); форма HAProxy — это файл для acl src -f. Форма с диапазонами полезна для документации и для систем, принимающих пары начало–конец.

Вопросы

Почему мои два /24 не объединились в /23?

/23 должен начинаться с чётного третьего октета: 10.0.2.0/24 и 10.0.3.0/24 объединяются в 10.0.2.0/23, а 10.0.1.0/24 и 10.0.2.0/24 — нет, потому что 10.0.1.0/23 начинался бы с 10.0.0.0.

Сколько адресов в результате?

Строка итогов под инструментом считает их отдельно для IPv4 и IPv6. Для IPv6 количества являются степенями двойки и показываются как таковые.

Обрабатывает ли он пересекающийся ввод?

Да. Пересечения и дубликаты объединяются, поэтому можно вставить списки из нескольких источников и получить чистое объединение.

Можно ли перевести блок CIDR в диапазон начало–конец?

Переключите формат вывода на «Диапазоны». Для каждого блока показываются первый и последний адрес; для одного входного блока это и есть весь ответ.