CIDR notatie, hoe werkt het (ook alweer)

Ingediend door Dirk Hornstra op 14-dec-2018 19:01

Mensen die me kennen weten dat ik het wel eens heb over mijn "computerhok". Dat is ook letterlijk zo, want ik ben druk met van alles en nog wat (werk, sporten, naar concerten, het theater, maar ook stampen op boeken om mijn certificaten te behalen en wat al niet meer). Veel data heb ik opgeslagen op USB-sticks of externe harde schijven. En vervolgens verdwijnt het ergens in een hoekje/doos en kijk ik er niet meer naar. Dus zou je kunnen zeggen "voer maar een format uit en je hebt weer clean disks to use"? Ja, eigenlijk wel. 

Maar misschien kom je nog wel eens een pareltje tegen. En dat kwam ik vandaag dus tegen op een USB-stick. Het was een opdracht van ons network operations centre, voor het valideren van geblackliste IP-adressen werd een dataset van 7.473.646 ip-adressen gecontroleerd. Aan ons, de programmeurs, de vraag of dit om te zetten was naar een CIDR-notatie zodat de dataset sneller door te spitten was. Die opdracht was van 2008, 10 jaar geleden dus. 

Geen idee hoe ik toen ermee aan de slag ben gegaan, ik ben een man van php en C#, dus dan zit je al gauw in for/next/loopjes maar ik kan me voorstellen dat programmeurs die meer in C werken (of iets vergelijkbaars?) daar vast een betere manier voor hebben. Zo hadden we bij de opleiding Hogere Informatica een opdracht met Java, waarbij je een damspel moet maken. Werkte ik met een matrix , anderen hadden een veel beknoptere (en snellere) versie door op binair niveau (OR/XOR) slimme trucjes te doen. Respect!

Laat ik eerst voor eens en altijd (ook voor mezelf) duidelijk/inzichtelijk krijgen hoe die CIDR notatie nu werkt. Je ziet die /32 of /24, maar wat betekent dat nu? Ik heb het volgens mij ook nog in boeken staan, maar we leven na de 90's, dus eerst wikipedia raadplegen: https://nl.wikipedia.org/wiki/Classless_Inter-Domain_Routing en natuurlijk voor het echte technische verhaal de RFC, de originele versie was 1519, maar is inmiddels opgevolgd door 4632: https://tools.ietf.org/html/rfc4632

Toeval of niet, dit kwam de afgelopen week nog een keer voorbij. Bij onze 2e Zabbix-sessie op het werk waren we aan het testen met het toegang geven van de Zabbix-agent aan de server. Daarvoor moet je in de Zabbix-agent IP-adressen toegang geven, één van mijn collega's vond het vervelend om stuk-voor-stuk die IP-adressen toe te voegen en volgens de specs kun je die ook met een CIDR-notatie toevoegen. Eerst dus toegevoegd met /24 (item "Server" in zabbix_agentd.conf). Toen kon mijn server connectie krijgen, maar die van een andere collega niet. Vervolgens aangepast naar /32. Dat was dus een denkfout. Je denkt dat er dan meer ip-adressen toegang hebben, maar het zijn er juist minder!

Een IP-4 adres bestaat uit de volgende notatie: aaa.bbb.ccc.ddd. Waarbij de blokken van 0 tot 255 kunnen lopen. Dat zijn 256 mogelijkheden, dat is 2 tot de macht 8 (2 x 2 x 2 x 2 x 2 x 2 x 2 x 2), een blok is dus 8 bits. Met de /xx geef je aan welk deel "vast" staat. Dus als je /32 invoert, dan is dus het eerste deel vast (8), het tweede deel (8), het derde deel (8) en het vierde deel (8). Dus bij 192.168.2.1/32 is alleen 192.168.2.1 geautoriseerd. In het eerste scenario hadden we /24, dus alleen de eerste 3 blokken. 192.168.2.0/24 geeft toegang van 192.168.2.0 tot en met 192.168.2.255.

Op de wikipedia-pagina wordt het voorbeeld gegeven van de range 195.229.8.0 tot en met 195.229.11.255. De eerste 2 blokken blijven gelijk, dus dat is 16. Dan begin je met notatie 195.229.8.0/16. Maar dat klopt niet, want je kunt niet van 195.299.8.0 naar 195.299.255.255 gaan. Het getal moet dus hoger worden om je te beperken. Want je hebt  de range
195.229.8.0 t/m 195.229.8.255, 
195.229.9.0 t/m 195.229.9.255, 
195.229.10.0 t/m 195.229.10.255 en 
195.229.11.0 t/m 195.229.11.255.

In de RFC staat het juiste antwoord:

n.n.x.0/22            1024        4194304

Dus hoe komen ze daar nu op? Nou, die n dat zijn 8 bits waardes. Dus van 0 t/m 255, die hebben we zonet voor de /16 gebruikt. Als je echter niet de hele range gebruikt (waar we nu mee bezig zijn), dan plaatsen we daar een x. 

Op de Wikipedia-pagina wordt even snel gezegd dat je er "dus" 6 bij op moet tellen, de 001000 (decimaal 8). Maar waar komt dat vandaan?

Maar eens even een oproep op Facebook gezet of mijn wat meer netwerk-gerelateerde volgers hier een uitspraak over konden doen. En daar reageerde chief network, Dick Postma van Network Operations en voormalig collega bij HSGC/Creative Industries/Coolminds snel op. 


Een IP adres bestaat uit 32 bits. (8bit.8bit.8bit.8bit)=/³²
Een /22 betekent dat de eerste 22 bits gereserveerd zijn voor dat desbetreffende IP blok. 8bit.8bit.6bit.0bit/²²

En bij een wedervraag van mij kwam hij met het antwoord zoals het ook op de wikipedia-pagina staat:


Als je de /22 gebruikt, dan zijn de ranges 195.229.8.0 t/m 195.229.11.255 bruikbaar in je range.

Je kun hem dan 4x onder verdelen in /24 subnets 
195.229.8.0/24
195.229.9.0/24
195.229.10.0/24
195.229.11.0/24

Kijken of we het dan zo kunnen bepalen. Je hebt dus 4 subnetten. 4 staat gelijk aan 2 tot de macht 2. Het hele blok is 8 bit, dus 2 tot de macht 8. We halen die 2 van die 8 af en komen zo op 6 bit uit. En zo kom je dus op 8 + 8 + 6 = / 22.

Dan ga ik nu voor de controle zonder te spieken in de RFC of de wikipedia pagina. Stel, we breiden het uit naar 8 ranges, we gaan van 195.229.8.0 tot en met 195.299.15.255.

Die kun je dan weergeven als:
195.229.8.0/24
195.229.9.0/24
195.229.10.0/24
195.229.11.0/24
195.229.12.0/24
195.229.13.0/24
195.229.14.0/24
195.229.15.0/24

8 staat gelijk aan 2 tot de macht 3 (2 x 2 x 2). Het hele blok is weer 8 bit, dus we doen 8-3=5. Daar tellen we die 2 x 8 van de eerste blokken bij op, dit zou betekenen dat ik bovenstaande lijst kan samenvatten naar een 195.229.8.0 /21

En als je dan in de RFC kijkt zie je dat dit klopt. Per subnet heb je 256 ip-adressen beschikbaar. Dus 8 blokken x 256 = 2.048 ip-adressen.

Nog even voor de mensen die niet (meer) weten hoe je op het aantal mogelijkheden van bits komt. Een bit kan 2 waardes hebben: 0 of 1. Het grondgetal is dus 2, het getal "de macht tot" is het aantal bits wat je hebt. Met 1 bit heb je dus 2 tot de macht 1 = 2 mogelijkheden, die 0 of 1. Heb je 2 bits dan heb je "dus" 2 tot de macht 2 mogelijkheden: 4. Waardes zijn 00, 01, 10, 11. Heb je 3 bits, dan heb je "dus" 2 tot de macht 3 mogelijkheden: 8 (2 x 2 x 2). Waardes zijn dan 000, 001, 010, 011, 100, 101, 110, 111.

Er wordt gesproken over "subnet". Misschien komt het je bekend voor als je zelf je ip-adres moe(s)t instellen. Vroeger, toen ik een computer en een laptop had en een goedkope switch, dan moest je bij de netwerkinstellingen zelf je ip-adres instellen en ook een subnet-masker.  Daarbij nam je eigenlijk automatisch het standaard voorbeeld over van 255.255.255.0. Als het goed is snap je na wat we eerder besproken hebben dat dit een /24 range is, je hebt 256 ip-adressen beschikbaar.

Terugkomend op de originele opdracht, je moet dus die miljoenen ip-adressen zoveel mogelijk groeperen om te kijken welke bits gegroepeerd kunnen worden. Bij mijn 2e test had je dus 8 /24 ranges, maar omdat je zo weinig mogelijk informatie wilt opslaan/doorlopen wil je daar uiteindelijk natuurlijk die ene /21 range van maken.

Voor de volledigheid ook nog even de link die mijn oud UPC-collega Willem van Wijk deelde: https://stackoverflow.com/questions/35248042/what-are-ip-address-blocks-or-ip-ranges