Някой ви дава първи и последен адрес и иска 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

Последните две команди са тези, които хората пропускат. Първият вътрешен адрес трябва да следва новия маршрут, а адресът непосредствено извън интервала не трябва. Ако и двата тръгнат по един и същ път, интервалът е бил разширен някъде между изискването и конфигурацията.

Запишете първия адрес, последния адрес и префиксите, които ги изразяват. Следващият човек, който преглежда правилото, може да провери изискването срещу конфигурацията, без да преправя аритметиката, и разликата между точен и удобен маршрут остава видима.

Подобни статии