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

Почніть з інтервалу, а не з префікса

Запишіть першу адресу та останню адресу, перш ніж писати щось інше. Пара — це вимога; префікс лише один із можливих її виразів, а іноді неправильний. Два числа також значно легше перевірити, ніж маску.

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

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

Перший випадок: інтервал випадково вирівняний

Візьміть 198.51.100.64 по 198.51.100.127. Перша адреса вирівняна за межею 64 адрес, і інтервал становить рівно 64 адреси, тож один /26 описує його без залишку.

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

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

Другий випадок: він не вирівняний, тому поділіть його

Тепер візьміть 198.51.100.100 по 198.51.100.107. Це вісім адрес, тобто степінь двійки, але 100 не кратне восьми. Один блок такого розміру не може починатися там, тому інтервал має покривати більше ніж один.

Точне покриття — два блоки /30: 198.51.100.100/30 покриває 100 по 103, а 198.51.100.104/30 покриває 104 по 107. Усього вісім адрес, нічого поза інтервалом, і розклад єдиний для заданого інтервалу.

python3 -c "from ipaddress import ip_address, summarize_address_range as s; print(*s(ip_address('198.51.100.100'), ip_address('198.51.100.107')), sep='\n')"

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

Виміряйте, що захопив би ширший префікс

Перш ніж прийняти скорочення, порахуйте, скільки воно коштує. /28, що починається з 198.51.100.96, покриває 96 по 111, тобто шістнадцять адрес замість восьми. Зайві вісім — це 96 по 99 і 108 по 111, і кожна з них успадкувала б маршрут.

python3 -c "from ipaddress import ip_network as n; w=set(n('198.51.100.96/28')); t=set(n('198.51.100.100/30'))|set(n('198.51.100.104/30')); print(len(w), len(t), sorted(w-t))"

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

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

Встановіть точний набір і перевірте краї

Передайте кожен отриманий префікс тому, хто володіє конфігурацією VPN, і дозвольте встановити його підтримуваним механізмом. Якщо вимога потребує двох записів, збережіть два записи, а не розширюйте один, щоб скоротити форму.

sudo ip route add 198.51.100.100/30 via 10.90.0.1 dev tun0
sudo ip route add 198.51.100.104/30 via 10.90.0.1 dev tun0
ip route get 198.51.100.101
ip route get 198.51.100.97

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

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

Схожі статті