Пераўтварэнне дыяпазону 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
Апошнія дзве каманды — тыя, якія людзі прапускаюць. Першы ўнутраны адрас павінен ісці па новым маршруце, а адрас адразу за інтэрвалам — не. Калі абодва ідуць адным шляхам, інтэрвал быў пашыраны недзе паміж патрабаваннем і канфігурацыяй.
Запішыце першы адрас, апошні адрас і прэфіксы, якія іх выражаюць. Наступны чалавек, які будзе правяраць правіла, зможа супаставіць патрабаванне з канфігурацыяй, не перарабляючы арыфметыку, і розніца паміж дакладным маршрутам і зручным застанецца бачнай.