Діапазони IP і CIDR

Вставте будь-який текст. Знайдемо в ньому адреси, зіллємо те, що перетинається чи стикається, і повернемо найменший набір префіксів. Із браузера не виходить нічого.

Блоки, що перетинаються або стикаються, зливаються: 10.0.0.0/25 разом із 10.0.0.128/25 повертаються як один 10.0.0.0/24.

Яку задачу це закриває

Списки адрес приходять у тому вигляді, який здався зручним тому, хто їх видав. Фаєрвол вивантажує префікси, тікет-система вставляє діапазони через дефіс, колега надсилає колонку з таблиці, а лог дає адреси, закопані в рядки тексту. У кінці цього всього треба написати правило, а правило хоче блоки CIDR — і якнайменше, бо кожен зайвий рядок це ще один предмет для перевірки й ще один запис у таблиці, у якої є межа розміру.

Тому сторінка робить три речі по черзі. Знаходить усі адреси, діапазони й префікси в тому, що ви вставили, не звертаючи уваги на текст навколо. Зливає все, що перетинається або стикається. Далі розкладає результат назад у найменший набір блоків CIDR, який покриває рівно ті самі адреси — не більше і, що важливіше, не менше.

Що саме розпізнається

IPv4 та IPv6 обробляються разом, але рахуються окремо: зливати їх між собою безглуздо — це різні адресні простори, які випадково записані на одній сторінці.

Префікс перед усім іншим нормалізується до власної межі. Якщо вставити 192.168.1.50/26 — тобто адресу всередині блока, а не сам блок, — вона читається як 192.168.1.0/26: це та мережа, якій адреса насправді належить, і майже напевно те, що малося на увазі.

Чому «злиття» стосується й блоків, що просто стикаються

Блоки, які перетинаються, очевидно зводяться в один. Менш очевидно, що так само зводяться сусідні: 10.0.0.0/25 і 10.0.0.128/25 — це рівно дві половини 10.0.0.0/24, і повернути їх двома рядками там, де один рядок каже те саме, було б гіршою відповіддю, а не чеснішою. Тому злиття обʼєднує діапазони, коли наступний починається щонайбільше через одну адресу після кінця попереднього.

Саме цей крок робить основну роботу на справжніх даних. Вивантаження фаєрволів і списки зловживань повні блоків, доданих у різний час різними людьми, які разом узяті є просто одним більшим блоком.

Що означає «найменший набір» і чому він точний

Перетворення довільного діапазону в блоки CIDR — не питання смаку. Для заданого діапазону існує рівно один мінімальний набір префіксів, який покриває його точно, і знаходиться він механічно: від поточного початку беремо найбільший блок, який одночасно вирівняний по цьому початку і вміщується в залишок, виводимо його, зсуваємо початок за нього, повторюємо.

Дивує саме вирівнювання. /24 може починатися лише з числа, кратного 256, тож діапазон 10.0.0.5 - 10.0.1.20 не стає одним чи двома круглими блоками — він стає драбинкою дрібних префіксів на початку, великим блоком посередині й ще однією драбинкою в кінці. Це не інструмент шкодить: це і є той діапазон. Якщо драбинка небажана, лікується вона вибором меж діапазону на межах степенів двійки.

Чому воно не гальмує на великих даних

Очевидна реалізація — розгорнути кожен діапазон у список адрес, відсортувати, прибрати дублі, згрупувати назад — чудово працює на двадцяти адресах і намертво вішає вкладку на 10.0.0.0/8, а це шістнадцять мільйонів адрес. Один /16 в IPv6 був би гірший за все, що взагалі здатен порахувати компʼютер.

Тут адреси не перебираються ніколи. Кожен запис стає інтервалом — парою дуже великих цілих чисел, — і злиття та розкладання працюють з інтервалами. Вартість залежить від кількості записів, які ви вставили, а не від кількості адрес, які вони описують: саме тому 0.0.0.0/0 і один вузол коштують однаково.

Дві стелі все ж лишаються, і вони захищають вкладку: обмеження на кількість прочитаних із тексту записів і на кількість надрукованих префіксів. Якщо котрась спрацювала, сторінка каже про це числами, а не мовчки віддає коротшу відповідь. Обрізаний список, який має вигляд повного, — єдиний по-справжньому небезпечний спосіб зламатися для такого інструмента: людина забере його й напише правило з діркою.

Ця сторінка — та, яку найбільше хочеться тримати у вашому браузері

З усього, що є на сайті, саме сюди вставляють найчутливіше: сирі рядки лога, конфігурацію фаєрвола, внутрішні плани адресації. Такий матеріал описує нутрощі мережі, і він не має залишати машину лише тому, що комусь треба було впорядкувати список.

Тому тут немає ані форми, що надсилається, ані запиту у фоні, ані сліду від того, що ви вставили: уся робота — це JavaScript у вашій вкладці. Відкрийте сторінку, відʼєднайте мережу — вона працюватиме далі; це найпростіший спосіб підтвердити сказане, не вірячи на слово.

Часті запитання

Як перетворити діапазон IP на блоки CIDR?

Вставте діапазон у вигляді 10.0.1.0 - 10.0.1.255, і нижче зʼявиться найменший набір префіксів, який його покриває. Для будь-якого діапазону мінімальна відповідь рівно одна: щоразу береться найбільший блок, вирівняний по поточному початку й такий, що вміщується в залишок. Тобто це не питання смаку.

Чому мій діапазон розсипався на стільки префіксів?

Бо префікс мусить починатися на власній межі: /24 може починатися лише з числа, кратного 256, /26 — кратного 64. Тому діапазон на кшталт 10.0.0.5 - 10.0.1.20 потребує драбинки дрібних блоків з обох боків і великого посередині. Нічого не зламалося — це і є форма того діапазону. Якщо потрібні круглі числа, беріть межі на степенях двійки.

Чи можна вставляти сирі рядки лога замість чистого списку?

Так, це основний сценарій. Кожна адреса, діапазон і префікс витягуються з навколишнього тексту, а решта ігнорується, тож вивід iptables, рядки access-лога чи дамп JSON годяться як є. Те, що лише СХОЖЕ на IPv6, — час на кшталт 12:34:56, MAC-адреси — перевіряється й відкидається: кандидат, який не розібрався як адреса, відкидається, а не вгадується.

Чому 10.0.0.0/25 і 10.0.0.128/25 повертаються одним блоком?

Бо разом вони — це рівно 10.0.0.0/24: ті самі адреси, сказані одним рядком замість двох. Злиття обʼєднує діапазони, які перетинаються, і ті, що просто стикаються, бо повернути два рядки там, де один рівнозначний, було б гіршою відповіддю, а не чеснішою. Саме цей крок робить основну роботу на вивантаженнях фаєрвола, які збирали кілька людей у різний час.

Чи не повісить сторінку великий префікс на кшталт 10.0.0.0/8?

Ні, бо адреси не перебираються ніколи. Кожен запис стає інтервалом із двох великих цілих чисел, а злиття й розкладання працюють з інтервалами, тож /8 і один вузол коштують однаково. Наївний підхід із розгортанням діапазону в список потребував би шістнадцяти мільйонів кроків на один цей префікс — саме тієї реалізації тут і немає.

Що буде, якщо вставити більше, ніж інструмент подужає?

Він читає обмежену кількість записів і друкує обмежену кількість префіксів, а якщо котрась стеля спрацювала — каже про це справжніми числами. Це повідомлення важливіше за саме обмеження: обрізаний список, який має вигляд повного, — єдиний по-справжньому небезпечний спосіб зламатися для такого інструмента, бо людина забере його й напише правило з діркою.

Чи можна змішувати IPv4 та IPv6 в одному тексті?

Так. Обидва розпізнаються, рахуються окремо й зливаються окремо, бо обʼєднувати їх безглуздо: це два різні адресні простори, які випадково записані на одній сторінці. У підсумку видно, скільки записів кожного сімейства знайдено, — так одразу помітно, якщо щось прочиталося не так.

Чи потрапляє щось із вставленого на ваш сервер?

Ні, і саме тут це важливо найбільше: сюди вставляють рядки лога, правила фаєрвола і внутрішні плани адресації, тобто опис нутрощів мережі. Уся робота — це JavaScript у вашому браузері: жодна форма не надсилається, жодного запиту не робиться, у наших логах не зʼявляється нічого. Відʼєднайте мережу після завантаження сторінки — вона працюватиме далі.

Пов'язані перевірки