Gör ett IP-intervall från första till sista adressen till exakta VPN-rutter
Ett intervall från första till sista adressen passar sällan på ett enda prefix. Gör om det till exakta CIDR-block så att en rutt inte fångar destinationer utanför intervallet.
Någon ger dig en första och en sista adress och ber om en VPN-rutt. Det frestande draget är att välja det kortaste prefixet som innehåller båda ändarna, och det draget lägger tyst till destinationer som ingen har bett om. Ett CIDR-block har alltid en storlek som är en tvåpotens och en startadress justerad till den, så ett godtyckligt intervall behöver oftast mer än ett. Gå igenom intervallet, dela det exakt och kontrollera sedan adresserna precis utanför.
Börja med intervallet, inte prefixet
Skriv ner den första adressen och den sista adressen innan du skriver något annat. Paret är kravet; ett prefix är bara ett möjligt uttryck för det, och ibland ett felaktigt. Två tal är också mycket lättare att kontrollera än en mask.
Ett justerat intervall faller samman till ett enda block. Ett ojusterat delas upp i flera, och uppdelningen är exakt och inte ungefärlig. Det du inte får göra är att runda utåt och kalla det nära nog, eftersom de extra adresserna får den policy som rutten bär.
Båda felriktningarna spelar roll. För en rutt in i tunneln dras extra adresser in i VPN. För ett undantag för förbikoppling hoppar extra adresser över det. Ingen av utgångarna syns i en rutttabell som bara visar det prefix du installerade.
Första fallet: intervallet är av en slump justerat
Ta 198.51.100.64 till 198.51.100.127. Den första adressen är justerad på en gräns på 64 adresser och intervallet är exakt 64 adresser, så ett enda /26 beskriver det utan något över.
Det är det enkla fallet och det är värt att känna igen, eftersom det betyder att kravet förmodligen skrevs av någon som redan tänkte i prefix. Det betyder också att kontrollen är kort: bekräfta att storleken är en tvåpotens och att starten är en multipel av den storleken.
Dokumentationsintervall är bra exempel just för att ingen äger dem. Installera inte dessa adresser på en riktig tunnel och utgå inte från att ett intervall du fått är dokumentationsutrymme bara för att det ser ovanligt ut.
Andra fallet: det är det inte, så dela upp det
Ta nu 198.51.100.100 till 198.51.100.107. Det är åtta adresser, vilket är en tvåpotens, men 100 är inte en multipel av åtta. Ett enda block av den storleken kan inte börja där, så intervallet måste täckas av mer än ett.
Den exakta täckningen är två /30-block: 198.51.100.100/30 täcker 100 till 103, och 198.51.100.104/30 täcker 104 till 107. Åtta adresser totalt, ingenting utanför intervallet, och uppdelningen är entydig för ett givet intervall.
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')"
Standardbiblioteksfunktionen gör aritmetiken åt dig, och ipaddress-dokumentationen definierar vad den returnerar. Det den inte gör är att välja en gateway, avgöra vem som äger adresserna eller ge åtkomst till någon tjänst bakom dem.
Mät vad det bredare prefixet skulle ha fångat
Innan du accepterar en genväg, beräkna vad den kostar. Ett /28 som börjar på 198.51.100.96 täcker 96 till 111, vilket är sexton adresser i stället för åtta. De extra åtta är 96 till 99 och 108 till 111, och var och en av dem skulle ärva rutten.
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))"
Åtta extra destinationer är ett konkret tal som du kan sätta i en ändringsbegäran. Det är också talet som avgör om genvägen är acceptabel, och det är en fråga om policy, inte om aritmetik.
Håll aritmetik och upptäckt åtskilda. Ett intervall som nätverksoperatören levererar konverteras exakt. Ett enda DNS-svar från en tjänst som ändras fastställer inte tjänstens fullständiga eller permanenta intervall, och orelaterade namn kan dela en adress.
Installera den exakta mängden och verifiera kanterna
Ge varje resulterande prefix till den som äger VPN-konfigurationen och låt dem installera det via den stödda mekanismen. Om kravet behöver två poster, behåll två poster i stället för att bredda en för att göra ett formulär kortare.
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
De två sista kommandona är de som folk hoppar över. Den första inre adressen bör följa den nya rutten, och adressen precis utanför intervallet bör inte. Om båda går samma väg har intervallet breddats någonstans mellan kravet och konfigurationen.
Anteckna den första adressen, den sista adressen och de prefix som uttrycker dem. Nästa person som granskar regeln kan då kontrollera kravet mot konfigurationen utan att göra om aritmetiken, och skillnaden mellan en exakt och en bekväm rutt förblir synlig.