Podela IPv6 adresa na manje mreze (IPv6 subnetting)
(po uzoru na Markov vodic za IPv4 subnetting)
Da bi se fundamentalno razumeo IPv6 subnetting, potrebno je poznavati osnove IPv6 adresiranja. Mada je za puno razumevanje teksta krajne pozeljno procitati punu specifikaciju IPv6 protokola --
RFC2460, ali ako nemate vremena dovoljno je procitati:
- IPv6 Addressing Architecture --
RFC3513
- IPv6 Global Unicast Address Format --
RFC3587
Format adressa
IPv4 adrese su 32-bitne i pisali smo ih u 4-bajtnoj formi - 192.0.2.3 == 11000000 00000000 00000010 00000011
IPv6 adrese su 128-bitne i njihovo pisanje u 16-bajtnoj formi nije bas mnogo prakticno - to bi izgledalo poput 32.1.13.8.0.19.0.4.2.0.0.3.0.0.0.1. Prilicno necitljivo, zar ne? Upravo zato, inzenjeri su posegli za heksadecimalnim brojevima, jer su em kraci, em laksi za prevodjenje iz binarne notacije. 128 bita IPv6 adrese najpre se razbije na 8 grupa od po 16 bita - tzv. "reci" (word == 2 bytes), a potom se svaka "rec" prevede u hex broj, direktnim prevodjenjem grupica po 4 binarne cifre (nibbles) - npr.:
0010 0000 0000 0001 : 0000 1101 1011 1000 : 0000 0000 0001 0010 : 0000 0000 0001 0011 : 0000 0000 0000 0000 : 0000 0000 0000 0000 : 0000 0000 0000 0000 : 0000 0000 0000 0001
Prevod:
2001:0db8:0012:0013:0000:0000:0000:0001
Citljivije? Mozda, ali ne bas previse. Srecom, vodece nule hex brojeva ionako nisu mnogo korisne - 0001 == 1, zar ne? Prema tome:
2001:db8:12:13:0:0:0:1
Ovo je vec mnogo bolje. Ali opet, moze i bolje. S obzirom da IPv6 adrese sadrze duge nizove nula, ako bismo ih izostavili ne bi bilo tesko rekonstruisati celu adresu, zar ne? AKo napisemo:
2001:db8:12:13::1
pa uzmemo deo adrese levo i desno od '::', lako cemo ukapirati da izmedju treba zamisliti tri niza nula (0:0:0). Bas kao sto kada napisesmo:
2001::1
lako mozemo da zakljucimo da se izmedju 2001: i :1 nalazi 6 blokova nula (0:0:0:0:0:0), jer adresa ima ukupno 8 reci. Na slican nacin, ako napisemo:
::
taj niz mozemo da zamenimo nizom od 8 nula-blkova, bas kao i
::1 == 0:0:0:0:0:0:0:1
ili:
2001:db8:: = 2001:db8:0:0:0:0:0:0
Izgleda mocno? Mozda, ali ne i svemocno. Sledeca adresa je totalno BESMISLENA:
2001:db8::1::2
jer moze da se protumaci viseznacno:
2001:db8:0:1:0:0:0:2
2001:db8:0:0:1:0:0:2
2001:db8:0:0:0:1:0:2
Upravo zato, zamena niza nula dvostrukom dvotackom (::) moze da se uradi samo JEDNOM unutar adrese - npr:
2001:db8:0:0:1:0:0:2 == 2001:db8::1:0:0:2 == 2001:db8:0:0:1::2
Sva tri gore navedena nacina zapisa su ispravna i legalna.
Podela IPv6 adresnog prostora
Kompletan IPv6 adresni prostor (:: - ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff) je podeljen ovako - vidi link:
IPv6 adresni prostor.
Slicno kao i kod IPv4, adrese koje su na raspolaganju za globalno unicast adresiranje su podskup celog ovog prostora - one pocinju od 2000::, a zavrsavaju se sa efff:ffff:ffff:ffff:ffff:ffff:ffff:ffff i prica koja sledi odnosi se na njih. U tom opsegu neke adrese su rezervisane za posebne namene, bas slicno kao i npr. IPv4 adrese 127.0.0.1 ili 169.254.0.0, pa te adrese treba izbegavati. Pogledajte link gore za vise informacija, kao i
pregled dodeljenih IPv6 unicast adresa po regionima.
Duzina mreznog prefiksa
IPv6 adrese ne poznaju kategoriju klasa. Adresiranje je totalno besklasno, adresa se sastoji iz mreznog prefiksa (subnet ID) i adrese hosta (interface ID). Duzina mreznog prefiksa se, slicno besklasnom IPv4 adresiranju, oznacava uz adresu - npr. 2001:db8::/32 oznacava da je duzina mreznog prefiksa 32 bita, a da se ostalih 96 bita moze koristiti proizvoljno - najcesce za pravljenje vise podmreza. Kombinacija ima zaista puno - npr. ako se biti 33-48 koriste za oznaku podmreze, a biti 49-128 za adresiranje hostova tada mozemo da napravimo podmreze tipa:
2001:db8::/48
2001:db8:1::/48
2001:db8:2::/48
...
2001:db8:ffff::/48
Znaci, ukupno 65536 subnetova, a u svaki subnet "staje" 2^96-2 = 1208925819614629174706174 racunara ...
Slicno tome, ako bite 33-64 iskoristimo za oznaku podmreze, a 65-127 za hostove dobijamo:
2001:db8:0:0/64
2001:db8:0:1/64
...
2001:db8:ffff:ffff/64
Ovde znaci bite 33-64 bita koristimo za oznaku podmreze, a bite 65-128 za adresiranje hostove, sto daje 4.2 milijarde podmreza sa po 18446744073709551614 racunara.
Kao sto vidite, ovde vise nema glavobolje kao kod IPv4 adresiranja - da li ce velicina subneta biti dovoljna da se u njega "spakuje" 50, 100 ili 1000 masina. To postaje irelevantno. Medjutim, IPv6 ima i neka skrivena pravila. Srecom, ta pravila nam samo olaksavaju posao!
Fiksni IPv6 subnetting -RFC3177
IPv6 protokol i vecina njegovih implementacija ce sasvim lepo raditi sa svim duzinama prefiksa - pocev od /128 do /1 i zaista nije nikakva greska da recimo koristite mrezu 2001:db8:a:b:c:d::/96 ili 2001:db8:a:b:c:d:e:ff00::/120. U ovom prvom slucaju dobijate ekvivalent IPv4 prefiksa /16 ("B klase"), jer poslednjih 16 bita menjate od 0x0000 do 0xffff; a u drugom slucaju dobijate ekvivalent IPv4 mreze /24 ("C klase") - poslednjih 8 bita menjate od 0x00 do 0xff (0-255). I kao sto rekoh, to
nije nepravilno i svaka IPv6 implementacija bi morala sasvim lepo da se nosi s tim. Jedino pravilo je da se prva i poslednja adresa u tom nizu (gde "Interface ID" ima sve nule ili sve jedinice) ne moze da koristi za adresiranje hostova. Bas kao i kod IPv4.
Medjutim, iz razlicitih razloga ljudi su odlucili da IPv6 adresama raspolazu malcice lezernije. Jedan od razloga je cinjenica da IPv6 podrzava mehanizam automatskog racunanja adrese interfejsa - za svaki interfejs racunara kernel sam moze da izracuna IPv6 adresu zavisno od MAC adrese interfejsa. Automatsko jednoznacno mapiranje IPv6 <=> MAC zahteva 64 bita (tzv. EUI-64 postupak), pa je usvojeno da je
minimalni praktican IPv6 subnet = /64. Jedini izuzetak od tog pravila su /128 adrese koje mogu da se koriste za loopback interfejse. Mada mnogi operateri u praksi koriste /126 za point-to-point linkove (analogno /30 u IPv4 svetu); takav nacin nije bas preporucljiv, mada ne skodi i uglavnom radi bez problema. Ponegde sam vidjao i /125 - zatreba im 6 adresa, pa kao IPv4 /29 ... ruzno! Koriscenje /127 prefiksa (ekvivalent IPv4 /31) nije preporucljivo iz vise razloga (vidi:
RFC6164), mada i to lepo funkcionise i vidjao sam i takve stvari.
Ukratko, trenutno vazeca preporuka je:
/64 po svakom logickom segmentu (brodcast domain), cak i na point-to-point linkovima !!!.
Posto svaku slozenu mrezu cini vise logickih segmenata (broadcast domena, VLAN-ova itd.), pitanje koje se postavlja jeste: koliko nam adresa treba?
Starija preporuka -
RFC3177 - je bila:
- /16 - /23 - Opseg koji IANA dodeljuje regionalnim registrima (RIPE, ARIN, APNIC, AFRINIC, LACNIC ...)
- /32 - Opseg koji regionalni registri dodeljuju Internet provajderima (ISP Allocations)
- /48 - Opseg koji provajderi dodeljuju krajnjim korisnicima
- /64 - Opseg koji se koristi na jednom logickom segmentu mreze, bez obzira na broj uredjaja na tom segmentu.
To je omogucavalo da svaki krajnji korisnik dobije 64-48=16 bita za adresiranje svojih subnetova, dok je provajderu posao bio lak - svakom korisniku daje po jedan /48, a korisnicima koji imaju vise od 65,536 mreza daje vise /48 blokova:
+-----------------------------------------+----------------------+---------------------+---------------------------------------------------------------------------------+
| Global Anycast IPv6 ISP Allocation | Customer Assignment | End User Subnet ID | IPv6 Interface ID |
| (24-32 bits) | (16 bits) | (16 bits) | (64 bits) |
+-----------------------------------------+----------------------+---------------------+---------------------------------------------------------------------------------+
| 0010 0000 0000 0001 0000 1101 1011 1000 | 1111 0000 0000 1101 | xxxx xxxx xxxx xxxx | hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh hhhh |
+-----------------------------------------+----------------------+---------------------+---------------------------------------------------------------------------------+
| 2001:0DB8:::/32 | 0000 - FFFF | 0000 - FFFF | 0:0:0:0 - FFFF:FFFF:FFFF:FFFF |
+-----------------------------------------+----------------------+---------------------+---------------------------------------------------------------------------------+
|<------------------ /32 ---------------->| | |
|<------------------ /48 --------------------------------------->| |
|<------------------ /64 ------------------------------------------------------------->|
Znaci, provajder dobija blok (tzv. ISP Allocation) velicine /24 - /32 od regionalnih Internet registara (RIR - RIPE/APNIC/ARIN itd.) - npr. 2001:db8::/32, koji deli na svoje korisnike (do ukupno 65536 njih), svakom po /48:
2001:db8:0::/48
2001:db8:1::/48
...
2001:db8:fffff::/48
A svaki korisnik moze da adresira po 65536 mreznih segmenata:
2001:db8:f00d:0::/64
2001:db8:f00d:1::/64
...
2001:db8:f00d:ffff::/64
sto daje:
Custoemr IPv6 prefix First /64 subnet Last /64 subnet
-----------------------------------------------------------------------------------------------
Alpha 2001:db8:0::/48 2001:db0:0:0000::/64 2001:db8:0:ffff::/64
Beta 2001:db8:1::/48 2001:db0:1:0000::/64 2001:db8:1:ffff::/64
Gamma 2001:db8:2::/48 2001:db0:2:0000::/64 2001:db8:2:ffff::/64
Delta 2001:db8:3::/48 2001:db0:3:0000::/64 2001:db8:3:ffff::/64
Epsilon 2001:db8:4::/48 2001:db0:4:0000::/64 2001:db8:4:ffff::/64
Medjutim, novija preporuka -
RFC6177 je fleksibilnija, jer provajderu daje mogucnost da svojim korisnicima dodeljuje blokove izmedju /48 i /63. Samim tim prica o subnetovanju postaje nesto teza, jer se postavlja pitanje koliko adresa dodeliti za mrezu. A preporuka je dosta fleksibilnija:
- /16 - /23 - Opseg koji IANA dodeljuje regionalnim registrima (RIPE, ARIN, APNIC, AFRINIC, LACNIC ...)
- /32 - /47 - Opseg koji regionalni registri dodeljuju Internet provajderima (ISP Allocations)
- /48 - /63 - Opseg koji provajderi dodeljuju krajnjim korisnicima
- /64 - Opseg koji se koristi na jednom logickom segmentu mreze, bez obzira na broj uredjaja na tom segmentu.
Varijabilni IPv6 subnetting - RFC6177
Kao sto smo to vec rekli, za razliku od IPv4 sveta u IPv6 adresiranju nema smisla govoriti o broju hostova na mrezi, vec broju logickih segmenata mreze, odnosno nezavisnih broadcast domena na mrezi. Za razliku od IPv4 sveta gde smo brojali hostove, pa smo, na primer, za 50 hostova morali da izdvojimo 64 adrese (odnosno jedan /26) - ovde broj hostova ne igra nikakvu ulogu, vec iskljucivo broj segmenata. Ako posmatramo klasicni IPv4 plan adresiranja:
Segment Name VLAN ID Hosts IPv4 Subnet
----------------------------------------------------------
Operations 100 700 198.18.20.0/22
Engineering 101 150 198.18.24.0/24
Finance 200 100 198.18.25.0/25
Management 500 80 198.18.25.128/25
Public WiFi 2000 500 198.18.26.0/23
gde smo svakom segmentu morali da dodelimo IPv4 subnet zavisno od velicine, kod IPv6 to ne igra nikakvu ulogu - jednostavno svaki segment dobija po jedan /64:
Segment Name VLAN ID Hosts IPv4 Subnet IPv6 Subnet
-----------------------------------------------------------------------------------
Operations 100 700 198.18.20.0/22 2001:db8:f00d:0::/64
Engineering 101 150 198.18.24.0/24 2001:db8:f00d:1::/64
Finance 200 100 198.18.25.0/25 2001:db8:f00d:2::/64
Management 500 80 198.18.25.128/25 2001:db8:f00d:3::/64
Public WiFi 2000 500 198.18.26.0/23 2001:db8:f00d:4::/64
Jedino pitanje koje se postavlja jeste: koliko /64 blokova dodeliti mrezi, odnosno koja minimalna velicina IPv6 prefiksa pokriva potrebe mreze?
Prefix Ukupno segmenata
------ ----------------
/64 1
/63 2
/62 4
/61 8
/60 16
/59 32
/58 64
/57 128
/56 256
/55 512
/54 1024
/53 2048
/52 4096
/51 8192
/50 16384
/49 32768
/48 65536
Pri tome vodite racuna da
svaki segment, cak i onaj gde ste kod IPv4 koristili /30 ili /31, ovde
dobija po jedan /64.
U gornjem primeru, korisnik ima 5 segmenata, najmanji stepen broja 2 veci od 5 je 8, sto znaci da bi provajder tom korisniku trebalo da dodeli jedan /61 prefiks.
Pretpostavimo da provajder ima mnogo korisnika, svakome treba izmedju 1 i 65536 mreznih segmenata. Pretpostavimo da prvih 5 korisnika ima potrebu za: 1000, 500, 200, 100 i 50 subnetova. Provajder mora da mu dodeli:
Custoemr Segments IPv6 prefix First Segment Last Segment
-----------------------------------------------------------------------------------------------
Alpha 1000 2001:db8:0::/54 2001:db0:0:0::/64 2001:db8:0:3ff::/64
Beta 500 2001:db8:400::/54 2001:db0:0:400::/64 2001:db8:0:7ff::/64
Gamma 200 2001:db8:800::/56 2001:db0:0:800::/64 2001:db8:0:8ff::/64
Delta 100 2001:db8:900::/57 2001:db0:0:900::/64 2001:db8:0:97f::/64
Epsilon 50 2001:db8:980::/58 2001:db0:0:980::/64 2001:db8:0:9bf::/64
Prva dva reda ne izgledaju tako tesko. Ali poslednji je prava nocna mora:
2001:db8:0:0980::/64
2001:db8:0:0981::/64
... (izbrojimo do 64) ...
2001:db8:0:09bf::/64
Da barem imamo 16 prstiju bilo bi lakse, ali nemamo. Imamo 10, a to bas i ne ide tako lako. Srecom, tu su razni alati koji nam mogu pomoci u tome.
Ali mnogi ISP to rade definitivno prostije! Kako?
Hibridni fiksno-varijabilni model
Svaka hex cifra u IPv6 adresi oznacava tacno 4 bita. 4 bita omogucavaju adresiranje 16 mreznih segmenata, 2*4=8 bita omogucavaju 256 mreznih segmenata itd. To daje nesto prostiju tabelu - tako sto cemo izbaciti sve prefikse cije duzine nisu deljive sa 4 i uvesti nove, jednostavnije kriterijume za raspodelu adresa:
Prefix Ukupno segmenata Namena
------ ---------------- -------------------------------------------------------------
/64 1 - point-to-point linkovi, male mreze, ne preporucuje se za krajnje korisnike
/60 16 - kucni (rezidencijalni) korisnici, multi-play
/56 256 - kucni (rezidencijalni) korisnici, male kancelarije (SOHO) - vecina ISP ovo daje kucnim korisnicima umesto /60
/52 4096 - mala i srednja preduzeca (SME)
/48 65536 - mali ISP, velika preduzeca
Sada dobijamo nesto laksi posao - korisnicima dodeljujemo /48, /52, /56, /60 ili /64:
Custoemr Segments IPv6 prefix First Segment Last Segment
-----------------------------------------------------------------------------------------------
Alpha 1000 2001:db8:0::/52 2001:db0:0:0::/64 2001:db8:0:0fff::/64
Beta 500 2001:db8:0:1000::/52 2001:db0:0:1000::/64 2001:db8:0:1fff::/64
Gamma 200 2001:db8:0:2000::/56 2001:db0:0:2000::/64 2001:db8:0:20ff::/64
Delta 100 2001:db8:0:2100::/56 2001:db0:0:2100::/64 2001:db8:0:21ff::/64
Epsilon 50 2001:db8:0:2200::/56 2001:db0:0:2200::/64 2001:db8:0:22ff::/64
Ovo se vec mnogo lakse racuna, a algoritam je krajnje jednostavan:
1. Napisemo punu IPv6 adresu prvog /64 bloka koji dodeljujemo korisniku - npr:
2001:0db8:0000:0000::/64
2. Posmatramo potrebnu velicinu bloka za korisnika - to moze biti /48, /52, /56, /60 ili /64:
/48 - Fiksiramo prvih 12 hex cifara, ostatak je promenljiv -
2001:0db8:0000:xxxx::/64,
xxxx = 0000-FFFF
/52 - Fiksiramo prvih 13 hex cifara, ostatak je promenljiv -
2001:0db8:0000:0xxx::/64,
xxx = 000-FFF
/56 - Fiksiramo prvih 14 hex cifara, ostatak je promenljiv -
2001:0db8:0000:00xx::/64,
xx = 00-FF
/60 - Fiksiramo prvih 15 hex cifara, ostatak je promenljiv -
2001:0db8:0000:000x::/64,
x = 0-F
/64 - Fiksiramo prvih 16 hex cifara, nema promenljivih -
2001:0db8:0000:0000::/64,
x = 0-F
Sada pogledajmo p rimer. Prvom korisniku treba jedan /52 blok.
Prefiks provajdera je 2001:0db8::/32, prvi segment raspoloziv za korisnika je: 2001:0db8:0000:0000::/64
Fiksiramo prvih 13 cifara u adresi i to daje pocetnu adresu:
2001:0db8:0000:0000::/64
Krajnju adresu dobijamo tako sto crvene cifre zamenimo sa 'f':
2001:0db8:0000:0fff::/64
Sledecem korisniku trakodje treba /52 blok.
Prva raspoloziva adresa nam je: 2001:0db8:0000:1000::/64
Fiksiramo prvih 13 cifara u adresi i to daje pocetnu adresu:
2001:0db8:0000:1000::/64
Krajnju adresu dobijamo tako sto crvene cifre zamenimo sa 'f':
2001:0db8:0000:1fff::/64
Sledecem korisniku trakodje treba /56 blok.
Prva raspoloziva adresa nam je: 2001:0db8:0000:2000::/64
Fiksiramo prvih 14 cifara u adresi i to daje pocetnu adresu:
2001:0db8:0000:2000::/64
Krajnju adresu dobijamo tako sto crvene cifre zamenimo sa 'f':
2001:0db8:0000:20ff::/64
Slicno i za naredna tri korisnika.
Ali sta biva kada dobijemo novog korisnika kome treba 2000x /64 blokova:
Custoemr Segments IPv6 prefix First Segment Last Segment
-----------------------------------------------------------------------------------------------
Eta 2000
Prva raspoloziva adresa nam je: 2001:0db8:0000:2300::/64.
A korisniku treba /52 blok.
Akio bismo fiksirali prva 52 bita, odnosno 13 hex cifara, dobili bismo:
2001:0db8:0000:2300::/64.
Ovde ocigledno imamo problem, jer su nam hex cifre 14-16 (biti 53-64) potrebne da budu totalno slobodne, da mozemo da ih menjamo od 000 do fff. A ovde ne mozemo, jer je 14. hex cifra 3, a ne 0.
Resenje je opet jednostavno - odaberemo prvi sledeci potpuno slobodan /52 blok:
2001:0db8:0000:0000::/52 - Popunjen
2001:0db8:0000:1000::/52 - Popunjen
2001:0db8:0000:2000::/52 - Delimicno popunjen
2001:0db8:0000:3000::/52 - Slobodan / prazan
Korisniku znaci sleduje:
2001:0db8:0000:3000::/52
Prvi segment:
2001:0db8:0000:3000::/64
Poslednji segment:
2001:0db8:0000:3fff::/64
Znaci:
Custoemr Segments IPv6 prefix First Segment Last Segment
-----------------------------------------------------------------------------------------------
Eta 2000 2001:db8:0:3000::/52 2001:db8:0:3000::/64 2001:db8:0:3fff::/64
Ako sada uleti naredni korisnik kome treba mali blok - npr. /56, njemu mozemo da dodelimo
2001:0db8:0000:4000::/56.
Medjutim, unutra
2001:0db8:0000:2000::/52 bloka ostalo nam je dosta "rupa" u koje mozemo da smestimo tok korisnika.
Prvi raspolozivi blok adresa unutar 2001:db8:0:2000::/52 nam je: 2001:0db8:0000:2300::/56 i on se uklapa idealno.
Ali, ako nam se sada pojavi izuzetno veliki korisnik kome treba /48 moracemo da "skocimo" na: 2001:0db8:0001::/48, sto je prvi slobodni /48 blok.
[Ovu poruku je menjao B3R1 dana 30.07.2014. u 15:00 GMT+1]