Агрегация
Два блока можно объединить в один, когда они одинакового размера, соседние, и объединённый блок выровнен по своему новому размеру: 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 в диапазон начало–конец?
Переключите формат вывода на «Диапазоны». Для каждого блока показываются первый и последний адрес; для одного входного блока это и есть весь ответ.