IPv6

Michal Růžička, xruzick7@fi.muni.cz


Obsah


1  Proč IPv6 a kam se podělo IPv5

Primárním důvodem, proč se o IPv6 začalo mluvit, byl strach z nedostatku IP adres. V dnes především používaném IPv4 jsou adresy 32bitové a máme tak k dispozici jen 232 unikátních adres (tedy zhruba 4,3 miliardy). Ve skutečnosti je to ještě méně, protože musíme odečíst privátní rozsahy adres, které nemohou být použity v internetu, a některé speciální adresy. Jak se dnes ukazuje, díky různým obezličkám typu NAT apod. se tento nedostatek dá částečně řešit. Přináší to sice různá omezení, nicméně nikomu se nechce měnit něco, co je tak široce rozšířené a navíc to celkem funguje. Díky výše uvedenému jsme se tedy masového nasazení IPv6 zatím nedočkaly a kdy k tomu dojde je velká otázka.

IPv6 byl přijat skupinou Internet Engineering Task Force v roce 1994 (a byl nazýván IP Next Generation, zkráceně IPng). Jak bylo uvedeno výše, hlavním důvodem vypracování IPv6 byla původně snaha rozšířit adresní prostor. IPv6 tedy používá 128bitové adresy, které poskytují dostatečný počet adres (zhruba 3,4 × 1038) „navždy“. (I když to si o 640 KiB operační paměti někteří lidé mysleli taky...)

Když už se ale bude muset změnit IP protokol, byla by škoda nevyužít toho a neprovést i další vylepšení. IPv6 tedy přináší mnoho změn i v dalších oblastech. Přináší např.

Proč ale IPv6? Proč ne IPv5? Protokol IPv5 také existuje. Nicméně se nejedná o žádnou náhradu IP protokolu. IPv5 je experimentální flow-oriented streamovací protokol určený pro podporu audia a videa. V praxi ale nebyl nikdy pořádně použit.


2  Adresování

2.1  Zápis adres

128bitové adresy IPv6 by bylo nepohodlné zapisovat stejným způsobem jako mnohem kratší adresy IPv4. Zápis se tedy provádí v šestnáctkové soustavě, kdy jsou vždy čtyři číslice odděleny dvojtečkou. Navíc je povoleno několik zkratek zápisu. IPv6 adresa tedy může vypadat např. takto: 2001:0db8:0000:0000:0000:0000:1428:57ab

Jak bylo uvedeno výše, při zápisu adresy je možno použít i několik zkratek. Dále uvedené adresy jsou ekvivalentní k adrese výše, pouze zapsané zkrácenou formou:

Jednotlivé zkratky je samozřejmě možné libovolně kombinovat.

V URL se IPv6 adresa uvádí v hranatých závorkách.

http://[2001:0db8:0000:0000:0000:0000:1428:57ab]/page.html
http://[2001:0db8:0000:0000:0000:0000:1428:57ab]:8080/page.html

Tento zápis umožňuje snadnou analýzu adresy bez matení uvedením čísla portu.

2.2  Typy adres

2.2.1  Adresy bez speciálního prefixu

2.2.1.1  Zpětnovazebná smyčka (loopback)

Adresa zpětnovazebného rozhraní, tedy adresa 127.0.0.1 v IPv4, je v IPv6 adresa 0000:0000:0000:0000:0000:0000:0000:0001.

2.2.1.2  Nespecifikovaná adresa

Adresa typu „kdokoli“, tedy adresa 0.0.0.0 v IPv4, je v IPv6 adresa 0000:0000:0000:0000:0000:0000:0000:0000.

2.2.1.3  IPv4 adresa mapovaná do IPv6

Adresa přiřazená uzlu, který pracuje pouze s IPv4 adresami, má tvar ::ffff:a.b.c.d, kde a.b.c.d je IPv4 adresa.

2.2.1.4  IPv4 kompatibilní IPv6 adresa

Adresa přiřazená uzlu, který pracuje s IPv4 i IPv6 adresami, má tvar ::a.b.c.d, kde a.b.c.d je IPv4 adresa.

2.2.2  Síťová část adresy (prefix sítě)

Speciální typ adresy, který je platný pouze na lince rozhraní. Packet s touto adresou jako cílovou nebo zdrojovou nikdy nesmí projít přes router.

Tato adresa je používána např. za účelem dotazu, zda se na lince nachází jiné zařízení apod.

Prefix těchto adres je fe8x: (v současnosti jediný používaný prefix), fe9x:, feax: nebo febx:, kde x je hexadecimální číslice (normálně 0).

| 10 bits  |        n bits           |       (118 - n) bits       |
+----------+-------------------------+----------------------------+
|1111111010|           0             |       INTERFACE ID         |
+----------+-------------------------+----------------------------+
                
2.2.2.2  Site local adresy

Tyto adresy jsou obdobou privátních rozsahů adres v IPv4 (168.192.x.x apod.).

Prefix těchto adres je fecx: (nejběžnější), fedx:, feex: nebo fefx:, kde x je hexadecimální číslice (normálně 0).

Tento typ adres je dnes zavržený ve prospěch unikátních lokálních adres.

| 10 bits  | n bits  |    m bits     |     (118 - n - m) bits     |
+----------+---------+---------------+----------------------------+
|1111111011|    0    |   SUBNET ID   |       INTERFACE ID         |
+----------+---------+---------------+----------------------------+
                
2.2.2.3 Unikátní lokální unicast adresy

Nový typ lokáních adres, který má oproti site local adresám tu výhodu, že adresy jsou unikátní nejen v rámci podsítě, ale globálně. Pokud tedy později dojde ke sloučení podsítí, nedojde k žádným kolizím a není třeba provádět změny adres.

Prefix těchto adres je fcxx: nebo fdxx:, kde x je hexadecimální číslice.

| 7 bits |1|  40 bits   |  16 bits  |          64 bits           |
+--------+-+------------+-----------+----------------------------+
| PREFIX |L| GLOBAL ID  | SUBNET ID |        INTERFACE ID        |
+--------+-+------------+-----------+----------------------------+
                

40bitové pole GLOBAL ID je generováno pseudonáhodnou funkcí. Je tak velmi nepravděpodobné, že by se objevili dvě shodné adresy.

2.2.2.4  Globální unicast adresy

Toto jsou ty „hlavní“ IP adresy, tzn. globálně v internetu využitelné, určené k jednoznačné celosvětové identifikaci rozhraní.

Prefix těchto adres je 2xxx: nebo 3xxx:, kde x je hexadecimální číslice.

|   |             |              |               |           | (125-n-m-o-p) |
| 3 |    n bits   |    m bits    |    o bits     |  p bits   |     bits      |
+---+-------------+--------------+---------------+-----------+---------------+
|010| REGISTRY ID | PROVIDER ID  | SUBSCRIBER ID | SUBNET ID | INTERFACE ID  |
+---+-------------+--------------+---------------+-----------+---------------+
                

Tyto adresy jsou přiřazovány hierarchicky, pole REGISTRY ID, PROVIDER ID, SUBSCRIBER ID a SUBNET ID mají postupně na starosti podřízené organizace, které si pomocí nich dělí adresní prostor za jim přiděleným prefixem. To je velmi výhodné a snižuje to velikost tabulek globálních směrovačů.

2.2.2.5  Anycast adresy

Anycast adresa je nový typ adresy zavedený v IPv6, který nemá obdobu v IPv4. Slouží k identifikaci skupiny uzlů, které mají stejný účel a data mohou být vyměňována s kterýmkoli z nich. Typické užití je např. pro nalezení DNS serveru apod. Data zaslaná na anycast adresu budou doručena právě jednomu „nejbližšímu“ uzlu ze skupiny.

Anycast adresy jsou obsaženy v bloku globálních unicast adres a syntakticky se od nich nedají odlišit. Anycast adresa nesmí být nikdy uvedená jako zdrojová adresa packetu.

2.2.2.6  Multicast adresy

Multicast adresa je speciální adresa přidělená skupině uzlů. Data zaslaná na tuto adresu budou doručena všem uzlům, které do této skupiny patří. Každý uzel může patřit do libovolného množství multicast skupin.

Formát multicast adresy je následující:

| 8 bits | 4 b. | 4 b. |                  112 bits                   |
+--------+------+------+---------------------------------------------+
|11111111| FLGS | SCOP |                  GROUP ID                   |
+--------+------+------+---------------------------------------------+
                

Prefix osmi jedniček vyznačuje multicast adresu, ze čtyřbitového pole FLGS je zatím použit pouze čtvrtý bit, ostatní jsou nulové. Hodnota FLGS 0000 značí permanentní „well known“ adresu přidělenou globální autoritou, hodnota 0001 značí dočasnou adresu.

Pole SCOP značí rozsah platnosti multicast skupiny, tzn. jak daleko se skupina bude šířit. Hodnoty jsou následující:
0 – Reserved
1 – Node-local scope
2 – Link-local scope
5 – Site-local scope
8 – Organization-local scope
E – Global scope
F – Reserved
Ostatní možné hodnoty nejsou přiřazeny.

Zbývajících 112 bitů slouží jako identifikátor skupiny.

2.2.3  Hostitelova část adresy

Za účelem umožnění autokonfigurace se spodních 64 bitů adresy obvykle využívá pro identifikaci hostitele. Těchto spodních 64 bitů adresy tedy může být určeno nějakým automatickým způsobem (stateless autokonfigurací vestavěnou přímo do IPv6, DHCPv6...), případně ručně.

2.3  Adresování sítí

Adresování sítí je obdobné jako u IPv4. Tedy zápis 2001:0db8:0000:0000::/64 udává prefix sítě, která obsahuje adresy 2001:0db8:0000:0000:0000:0000:0000:00002001:0db8:0000:0000:ffff:ffff:ffff:ffff.


3  Autokonfigurace zařízení po připojení do sítě

3.1  EUI-64 formát hostitelovy části adresy

Pro účely autokonfigurace je možné použít EUI-64 formát hostitelské části adresy. Při zapojení do sítě se zařízení link local multicastem dotáže routeru na prefix sítě. Když dostane odpověď, použije pro sestavení své IP adresy právě tento prefix. Zbývajících 64 bitů potom určí ze své fyzické adresy (pro Ethernet z MAC adresy). Např. na Ethernetové síti by si zařízení ze své MAC adresy s hodnotou 00:D0:B7:6B:4A:B2 vytvořilo sufix adresy takto:

Mezi třetí a čtvrtý byte MAC adresy (tedy na hranici mezi identifikátorem výrobce a identifikátorem konkrétního exempláře síťové karty) se vloží vzorek fffe. Výsledkem tedy je sufix 00d0:b7ff:fe6b:4ab2. Ten se ale ještě nepoužije, v takto vzniklém sufixu se provede doplněk 15. nejvyššího bitu. Výsledný sufix použitý pro sestavení IP adresy v našem příkladu by tedy byl 02d0:b7ff:fe6b:4ab2.

3.2  Router advertisment deamon (radvd)

Právě tento démon se stará o odpovědi na dotazy připojených nenakonfigurovaných zařízení. Na jejich dotaz jim odešle prefix sítě, ze kterého si výše uvedeným způsobem vytvoří vlastní IP adresu.

Po instalaci je třeba démona nakonfigurovat. Nastavení se provádí v konfiguračním souboru, který může být např. v souboru /etc/radvd/radvd.conf. Velmi jednoduchá konfigurace může vypadat např. takto:

interface eth0                       # Konfigurace pro rozhrani eth0.
{
        AdvSendAdvert on;            # Demon bude odpovidat na dotazy.
        prefix 2001:db8:0:1::/64     # Jako odpoved bude zasilan prefix 2001:db8:0:1::
        {
                AdvAutonomous on;    # Prefix muze byt pouzit pro autonomni autokonfiguraci.
        };
};
        

4  IPv6 pod GNU/Linuxem

GNU/Linux má podporu pro IPv6 přímo v jádře. První kód byl přidán do jádra 2.1.8 v roce 1999. Standard se však rychle vyvíjel a podpora IPv6 přímo v jádře zaostávala za aktuálním stavem standardu. V roce 2000 byl v Japonsku založen projekt USAGI, který pomohl implementovat potřebné chybějící funkce a aktualizovat ty zastaralé.

Se začátkem vývoje jádra 2.5.x byly USAGI patche příliš velké na to, aby je bylo možno plně začlenit do 2.4.x jader a tento stav se již nikdy nepodařilo zlepšit.

V současné době je mnoho USAGI patchů standardní součástí jader 2.6.x. Vývoj dalších funkcí v USAGI projektu pokračuje a čas od času jsou začleněny do vanilla jádra.

Pro FreeBSD existuje projekt KAME, který se stará o podporu IPv6 v tomto systému. Minimálně v minulosti byla jeho podpora IPv6 na vyšší úrovní než v GNU/Linuxu.

Pro zapnutí podpory IPv6 v GNU/Linuxu je třeba mít jádro zkompilované s jeho podporou (volba CONFIG_IPV6=[y | m]). Pak stačí přiřadit rozhraní IPv6 adresu a nastavit směrování.

ifconfig eth0 inet6 add fec0::2
route -A inet6 add default fec0::1


5  Tunelování IPv6 přes IPv4 sítě

V současné době neexistuje žádná globální IPv6 síť. Pro účely testování tedy vznikají různé virtuální IPv6 sítě, které tunely skrz IPv4 sítě spojují různé IPv6 sítě do jediné virtuální globální sítě. Jednou z nejznámějších byla páteřní virtuální IPv6 síť 6bone. Ta je od 6. června 2006 ve stádiu ukončování činnosti.

Tunelování probíhá tak, že na rozhraní mezi IPv6 a IPv4 sítí existují routery, které při odesílání dat balí IPv6 pakety do IPv4 paketů a ty posílají protějším hraničním routerům. Ty IPv6 packet zase vybalí a pošlou je do své IPv6 sítě.

iptunnel add mujtunel mode sit remote 10.0.20.1 local 10.0.20.2 ttl 16
ifconfig mujtunel up
ifconfig mujtunel add fec0:0:0:20::2
route -A inet6 add fec0:0:0:20::/64 dev mujtunel


6  Kompatibilita aplikací

Pokud chceme psát programy, které budou bez problémů fungovat nejen nad současnými IPv4 sítěmi, ale bez nutnotsti zásahu do kódu i po přechodu na IPv6, je nutné používat správné funkce pro práci se sítí.

Funkce getipnodebyname(3), getipnodebyaddr(3), getservbyname(3)getservbyport(3) byly zavrženy a nahrazeny společným rozhraním getaddrinfo(3). To umí pracovat jak nad IPv4, tak nad IPv6 sítěmi.


Použité zdroje

  1. Linux IPv6 HOWTO
  2. RFC 4193
  3. Článek o IPv6 na Wikipedia.org
  4. radvd.conf(5) – Linux man page
  5. getaddrinfo(3) – Linux man page
  6. Materiály k předmětu PV005
  7. Archiv referátů o IPv6 předmětu PV090