Превратите диапазон IP от первого до последнего адреса в точные маршруты VPN
Диапазон от первого до последнего адреса редко укладывается в один префикс. Преобразуйте его в точные блоки CIDR, чтобы маршрут не захватывал адреса за пределами интервала.
Кто-то даёт вам первый и последний адрес и просит маршрут 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
Последние две команды — те, которые люди пропускают. Первый внутренний адрес должен идти по новому маршруту, а адрес сразу за интервалом — нет. Если оба идут одним путём, интервал был расширен где-то между требованием и конфигурацией.
Запишите первый адрес, последний адрес и префиксы, которые их выражают. Следующий человек, проверяющий правило, сможет сопоставить требование с конфигурацией, не повторяя арифметику, и разница между точным и удобным маршрутом останется видимой.