IPv6

Miroslav Jány, xjany@fi.muni.cz


Obsah


Úvod

Okolo roku 1992 Internet Engineering Task Force (IETF) začalo uvažovať nad problémami súvisiacimi s protokolom IPv4, a to najmä z hľadiska globálneho vyčerpania adresného priestoru a technických nedostatkov návrhu protokolu IPv4. Takto vzišiel podnet pre vznik protokolu novej generácie (IPng - IP next generation), ktorý by tieto problémy riešil. Po niekoľkých diskusiách prišlo na svet v decembri 1993 prvé RFC pre tento návrh (RFC-1550), načo po ďalších diskusiách bola o dva roky neskôr vydaná prvá špecifikácia protokolu Internet Protocol version 6 - IPv6 (RFC-1883). Táto dostala svoju finálnu podobu v decembri 1998, a je popísaná v RFC-2460.

Medzi hlavné rozdiely protokolu IPv6 oproti protokolu IPv4 patria:


IPv6 paket

IPv6 paket pozostáva z dvoch častí - z hlavičky a payloadu. Hlavička má veľkosť 40 bytov. Obsahuje zdrojovú a cieľovú adresu (každá 128 bitov), identifikáciu (verziu) protokolu (4 bity), traffic class (8 bitov, určuje prioritu paketu), flow label (20 bitov, kvôli manažmentu QoS), dĺžku payloadu (16 bitov), next header (8 bitov, odkaz na ďalšiu hlavičku) a hop limit (8 bitov, obdoba TTL). Payload môže mať veľkosť až do 64KB v štandardnom móde, alebo môže byť aj väčší (vďaka nastaveniu flagu "jumbo payload").


Adresovanie v IPv6, EUI64 formát

Adresa v IPv6 je 4x dlhšia než v IPv4. Kvôli prehľadnosti sa mení spôsob jej zápisu - zapisuje sa ako osem skupín po štyroch hexadecimálnych čísliciach, kde každá skupina je oddelená dvojbodkou:

2001:0db8:85a3:08d3:1319:8a2e:0370:7334

Zkracovanie zápisu

Ak skupina štyroch číslic obsahuje samé nuly (0000), je možné túto štvoricu vynechať:

2001:0db8:85a3:0000:1319:8a2e:0370:7344 == 2001:0db8:85a3::1319:8a2e:0370:7344

Taktiež je možné nahradiť súvislé sekvencie 4 núl za dve dvojbodky (::), ale iba raz, pretože by inak nebola zachovaná jednoznačnosť adresy:

2001:0db8:0000:0000:0000:0000:1428:57ab == 2001:0db8::1428:57ab

Úvodné nuly je možné v skupine vynechať:

2001:0db8::1428:57ab == 2001:db8::1428:57ab

Adresovanie sietí

V IPv6 sa pre adresovanie sietí používa beztriedna adresácia (CIDR). Zápis 2001:1234:5678:9ABC::/64 (64 je prefix v bitoch) znamená, že táto sieť môže alokovať adresy v rozsahu
od 2001:1234:5678:9ABC:: do 2001:1234:5678:9ABC:FFFF:FFFF:FFFF:FFFF.

Druhy adries

Broadcast adresy v IPv6 neexistujú. Nahradili ich multicast a unicast adresy.

Špeciálne adresy

EUI64 formát

Používa sa na generovanie link local adresy. Link local adresa sa vytvorí z MAC adresy (48 bitov, 24 bitov výrobca a 24 bitov sériové čislo) tak, že prvé 3 byty z MAC adresy sa použijú ako prvé 3 byty EUI64, štvrtý a piaty byte EUI64 bude mať hexadecimálnu hodnotu FFFE, a posledné 3 byty z MAC adresy budú posledné 3 byty EUI64. Následne sa urobí doplnok druhého najnižšieho bitu v prvom byte EUI64 identikátora. Tento bit je zvyčajne nulový, takže po doplnku má hodnotu 1. Príklad:

MAC adresa: 00:04:76:D1:C4:38

00:04:76 + FF:FE + D1:C4:38 (00:04:76ff:fed1:c438)

Po doplnku: 204:76ff:fed1:c438

Autokonfigurácia, mobilita

Autokonfigurácia môže byť stavová (za použitia protokolu DHCPv6), alebo bezstavová, ktorá funguje na základe tzv. "neighbour discovery" (objavovanie suseda). Smerovač na sieti v určitých intervaloch posiela do siete základné informácie o sieti (Router Advertisement). Zariadenie pripojené na sieť môže o tieto informácie požiadať prostredníctvom tzv. výzvy k smerovači (Router Solicitation). Obdrží prefix siete, ku ktorému pridá svoju adresu v EUI64 formáte a získa tak svoju adresu. Objavovanie suseda nahrádza aj ARP/RARP v IPv4. Pokiaľ chce zariadenie zistiť linkovú adresu iného zariadenia na sieti, pošle tzv. Neighbour Solicitation paket. Ako odpoveď obdrží Neighbour Advertisement od daného zariadenia.

Implementáciu NDP (Neighbour Discovery Protocol) rieši napr. démon radvd - Router Advertisement Daemon. Do siete môže posielať Router Advertisement pakety periodicky alebo pri výzve iným zariadením, ktoré pošle výzvu Router Solicitation.

Mobilita

V IPv6 je snaha o podporu mobility a to predovšetkým v umožnení adresovať mobilné zariadenia bez ohľadu na to v akej sieti sa nachádzajú. Podpora mobility sa opiera o základnú myšlienku, že i mobilné zariadenie je niekde doma, čiže je súčasťou tzv. domácej siete, kde má pridelenú aspoň jednu globálnu unicast IP adresu. Domáca adresa je nemenná a je zaregistrovaná v DNS, prostredníctvom tejto adresy je počítač trvale dostupný aj keď sa v nej práve nenachádza.


Súčasná implementácia v UNIX systémoch

Začiatky podpory IPv6 v Linuxe sa datujú s jadrom verzie 2.1.8 v novembri 1996. Nasledoval projekt USAGI, ktorého cieľom bolo vytvoriť a neustále zdokonalovať implementáciu IPv6 stacku pre Linuxové jadro, pričom by kopíroval referenčnú implementáciu protokolu IPv6 pre BSD systémy (projekt KAME).


Nastavenie IPv6 v Linuxe

Pre podporu IPv6 stacku nastavíme pri konfigurácii jadra voľbu CONFIG_IPV6=y. Netfilter v súčasnosti podporuje aj IPv6 protokol, a pokiaľ chceme filtrovať okrem IPv4 aj IPv6 traffic, môžeme si v jadre zapnúť podporu ip6tables (zatiaľ v experimentálnom štádiu).

Pridanie IPv6 adresy pre rozhranie eth0:

ifconfig eth0 inet6 add fec0::3

Pridanie do routovacej tabulky:

route add inet6 default fec0::1

Alebo si môžeme vytvoriť IPv6 tunel nad IPv4:

sh-3.1# iptunnel add tunnel0 mode sit local 10.0.20.2 remote 10.0.20.1 ttl 64
sh-3.1# ifconfig tunnel0 up; ifconfig tunnel0 add fec0:0:0:20::2
sh-3.1# route -A inet6 add fec0:0:0:20::/64 dev tunnel0

IPv6 DNS záznamy

Pre dopredný preklad sa používa AAAA záznam, môže obsahovať aj skrátený zápis (príklad záznamu v BIND):

ipv6host  IN  AAAA  3ffe:80ee:64b::1

Čo sa týka reverzných prekladov, tu musíme používať neskrátený zápis, a to celý odzadu, pričom každý hexadecimálny znak je oddelený bodkou. Reverzné preklady patria pod pseudodomény ip6.int (testovací projekt 6bone) alebo ip6.arpa (produkčná prevádzka IPv6). S pomocou šikovnej utilitky ipv6calc si môžeme túto prácu uľahčiť:

sh-3.1# ipv6calc -r --in ipv6addr --out revnibbles.int 3ffe:80ee:64b::1/48
b.4.6.0.e.e.0.8.e.f.f.3.ip6.int.
sh-3.1# # ^-- Co mozeme skvelo vyuzit pri pridavani zony alebo editacii rev. zaznamov ;-)"

Písanie aplikácií kompatibilných s IPv6

Funkcia getaddrinfo(3) kombinuje funkcionalitu poskytovanú fciami getipnodebyname(3), getipnodebyaddr(3), getservbyname(3) a getservbyport(3) do jediného rozhrania.

       int getaddrinfo(const char *node, const char *service,
                       const struct addrinfo *hints,
                       struct addrinfo **res);

       /* node = numericka adresa (oddelena bodkami v pripade IPv4,
          hexadecimalny format pre IPv6)
          service = port sluzby
          hints = specifikuje preferovany typ socketu alebo protokolu
          res = zretazeny zoznam struktur addrinfo
       */

       struct addrinfo {
           int     ai_flags;
           int     ai_family; // moze byt AF_INET, AF_INET6 alebo AF_UNSPEC (kazdy protokol)
           int     ai_socktype;
           int     ai_protocol;
           size_t  ai_addrlen;
           struct sockaddr *ai_addr;
           char   *ai_canonname;
           struct addrinfo *ai_next;
       };

Viac informácií je možné nájsť v manuáli (man 3 getaddrinfo), alebo v RFC-2553.