IPv6

Miroslav Franc, xfranc2(at)fi.muni.cz


Obsah


Motivace

Na počátku 90. let bylo, hlavně kvůli nedostatku IP adres, rozhodnuto o vývoji náhrady za IPv4. Protokol byl pojmenován (IP Next Generation) IPng a později přejmenován na IPv6. Hlavní důvodem byl růst počtu počítačů připojených do Internetu a s tím spojený nedostatečný adresní prostor. V současnosti se nedostatek adres často řeší pomocí NAT (Network Adress Translation). Kdy se pakety pocházející z interní sítě upravují, aby navenek vykazovaly jedinou zdrojovou adresu. Tak se přiřadí celé podsíti jedna jediná IP adresa. Počítače uvnitř podsítě tak nejde přímo adresovat z Internetu.

Další důvody pro IPv6:

IPv6 adresa

Adresa v IPv6 má 128 bitů. Počet adres je tedy teoreticky cca 3,4 * 1038 (340 282 366 920 938 463 463 374 607 431 768 211 456). Na jeden m2 naší planety jich připadá zhruba 6,67 * 1027. Zapisuje se jako 8 čtveřic hexadecimálních čísel oddělených dvojtečkou.

Zkracování zápisu

Adresa v plném tvaru:
FF01:0000:0000:0000:0000:0000:0000:0101

Vypuštění úvodních nul:
FF01:0:0:0:0:0:0:101

Vypuštění souvislých sekvencí 4 nul a nahrazení za ::. Lze jen jednou pro zachování jednoznačnosti.
FF01::101


Používá se beztřídní adresace (CIDR): 3ffe:ffff::12/64 - délka prefixu

Kategorie adres v IPv6
IPv6 speciální adresy a adresní prefixy Více na Iana.org.

Struktura paketu

Hlavička paketu má pevnou délku 40 B. Na rozdíl od IPv4 ubyl kontrolní součet, identifikace paketu, příznaky fragmentace a fragment offset. Paket byl zjednodušen, aby se směrovač měl co nejméně práce. Implementováno tzv. řetězení hlaviček - položka "Next header". Obsahuje typ hlavičky, která následuje. Lze použít rovnou TCP nebo UDP, což znamená, že už žádné další hlavičky nejsou. Každá z rozšiřujících hlaviček má rovněž položku "Next header". Takto se hlavičky řetězí. Hlavičky, které by mohly směrovač zajímat, by měly být ze začátku.

název anglickynázev českybitůkomentář
Versionverze protokolu4vždy IPv6
Traffic classtřída provozu8analogie Type of service u IPv4
Flow labelindikace toku20identifikuje proud datagramů od jednoho
odesilatele ke stejnému cíli se stejnými vlastnostmi
Payload lengthdélka paketu16
Next headerdalší hlavička8typ další hlavičky, co je za základní hlavičkou
Hop limitlimit na počet skoků8analogie TTL u IPv4
Source addresszdrojová adresa128
Destination addresscílová adresa128
Datadata

Další hlavičky zajišťují fragmentaci (Fragment header), autentizaci (Authentication Head) a šifrování (Encapsulating Security Payload), směrování předepsanou cestou (Routing header) atd.


Mobilita

Každý počítač má svou domácí síť a svoji IP adresu. V době nepřítomnosti ho zastupuje tzv. domácí agent, což je směrovač v domácí síti. Kterému mobilní počítač oznamuje změněnou adresu (změna vazby - musí být autentifikovaná). V připadě pokusu o komunikaci s mobilním počítačem, mu domácí agent přepošle požadavek a další komunikace už probíhá přímo mezi komunikujícími stranami.


EUI-64 formát

Převod IP adres na linkové vrstvě zajišťuje protokol ARP. Nevýhoda je v přímo specifikovaná velikost linkové adresy (48 bitů). 24 bitů (indentifikace výrobce) a 24 (sériové číslo). To je použitelné jen nad Ethernetem. Řešení v IPv6: Každý linkový protokol má zobrazení svých adres do EUI-64 formátu. Řešení pro ethernet - MAC adresu: Doprostřed se vloží fffe a 7. nejvyšší bit se nastaví na 1 v případě globálně jednoznačné adresy nebo na 0 v případě lokálně jednoznačné adresy.

Příklad

MAC adresa:
00:04:76:47:8e:81

Upravený EUI-64 formát adresy:
0204:76ff:fe47:8e81

Automatická konfigurace a NDP

Stavová konfigurace

Konfigurace pomocí DHCPv6. Počítač pošle dotaz a DHCP server sdělí vše potřebné.

Bezstavová konfigurace

Funguje díky tzv. "neighbor discovery" (objevování sousedů). Každý směrovač v určitých intervalech rozesílá do sítě, k níž je připojen, základní informace o síti (Router Advertisement). Jde hlavně o prefixy dané sítě a info o tom, zda může sám sloužit jako default gateway, kam je schopen směrovat o jeho linkovou adresu. Počítač může při startu požádat o tyto informace, pomocí tzv. výzvy směrovači (Router Solicitation packet). K prefixu sítě, který takto obdrží, si připojí svoji adresu v upraveném EUI-64 formátu a adresa je na světě. Současně si také vytvoří tabulku implicitních směrovačů. Tohle má však dva nedostatky, jednak k dané adrese neexistuje dopředný, ani reverzní záznam a druhak jaksi chybí info o DNS serverech.

Neighbor discovery také nahrazuje ARP/RARP užívaný u IPv4. Pokud chce počítač zjistit linkovou adresu jiného počítače na téže síti, pošle "Neighbour Solicitation packet". Jako odpověď dostane "Neighbour Advertisement", který obsahuje danou adresu. Funguje to tedy stejně jako ARP. Redirect packet je ekvivalentem ICMP redirect z IPv4. Poslední vymožeností je test, zda je počítač naživu. Pokud počítač vysílá pakety a nedostává žádné zpět, tak vyšle "Neighbor Solicitation packet". Pokud nedostane jako odpověď "Neighbor Advertisement", prohlásí daný počítač za mrtvý. Využívá se hlavně u směrovačů.


radvd - Router Advertisement Daemon

Implementace NDP (Neighbor discovery protokol). Běží na směrovači. Ke stažení na v6web.litech.org. Posílá "Router Advertisement" do sítě periodicky nebo když je vyzván stanicí pomocí "Router Solicitation". Součástí je i program radvdump, který slouží k výpisu příchozích "router advertisement".



Důležité volby:
-u <uživatel> # spouštění pod nerootovským uživatelem a jeho primární skupinou
-t <adresář>  # spouštění v chrootovaném adresáři
Povolit přeposílání IPv6 paketů:
Linux: sysctl -w net.ipv6.conf.all.forwarding=1
FreeBSD: sysctl net.inet6.ip6.forwarding=1

Konfigurace
/etc/radvd.conf
---------------
interface eth0 {                            # kam posíláme info (rozhraní)
        AdvSendAdvert on;                   # povolení odesílání
        MinRtrAdvInterval 200;              # minimalni interval, mezi vyslaním nevyžádaných RA (sekundy)
        MaxRtrAdvInterval 600;              # maximální interval, mezi vyslaním nevyžádaných RA (sekundy)
        prefix 3ffe:ffff:0100:f101::/64 {   # prefix sítě
                AdvValidLifetime 3600;      # platnost adresy (sekundy)
        };
};
---------------

Na cílové stanici se dá zpracování RA vypnout, buď celkově a nebo jen pro jedno konkrétní rozhraní.
sysctl -w net.ipv6.conf.all.accept_ra=0
sysctl -w net.ipv6.conf.all.accept_eth0=0

sysctl net.inet6.ip6.accept_rtadv=0

Nastavení IPv6 adresy

Linux

/proc/net/if_inet6  # podle existence tohoto souboru poznáme, zda je zakompiloavaná podpora IPv6

ifconfig <název_rozhraní> inet6 [add|del] <ipv6_adresa>/<délka_prefixu>
route [add|del] inet6 default <adresa_brány>

FreeBSD

options inet6  # musí být v jádře

ifconfig <název_rozhraní> inet6 <ipv6_adresa>/<délka_prefixu> [eui64] [delete]
route [add|del] inet6 default <adresa_brány>

Povolit firewall a pravidla pro IPv6 nastavovat pomocí ip6tables.
iptables -I INPUT -p ipv6 -j ACCEPT

DNS

Dopředný překlad - AAAA záznamy. (adresa je 4x delší :-))
Reverzní překlad - pseudodomény ip6.int. (6bone) a ip6.arpa. (produkční):
V budoucnosti snad všechno v ip6.arpa..
Pozor: adresa se zapisuje pozpátku po jednotlivých číslicích oddělených tečkou. Nelze zkrátit.
V Bindu 9 existuje i DNAME, což je obdoba CNAME a A6 - umožňuje přidělování podle prefixů. Ale preferují se AAAA záznamy. A DNAME označeno jako depracted.



Aby Bind komunikoval přes IPv6.
options {
	...
	listen-on-v6 port 53 { any; };
};

6bone

6bone je testovací IPv6 síť. Síť začala jako virtuální s pomocí tunelování IPv6 nad IPv4 a postupně pomalu přechází k nativní IPv6 síti. Jejím hlavním účelem je testování standardů a implementací nového protokolu.


Tunelování

Slouží k přenosu IPv6 paketů přes IPv4 síť. Toho využívá například 6bone, pro spojování sítí, které na IPv6 už fungují nativně.



Tunelujeme
# Linux
ip tunnel add cervidira mode sit remote 10.0.50.1 local 10.0.50.2 ttl 255
ip link set dev cervidira up
ip addr add fec0:0:0:50::2/64 dev cervidira
ip route add fec0:0:0:50::/64 dev cervidira
ip tunnel show # ověříme správnost

# FreeBSD
ifconfig gif0 create
ifconfig gif0 tunnel 10.0.50.1 10.0.50.2
ifconfig gif0 inet6 fec0:0:0:50::1/64
route add -inet6 default -interface gif0
ifconfig gif0 # ověříme správnost

# /etc/rc.conf
gif_interfaces="gif0"
gifconfig_gif0="10.0.50.1 10.0.50.2"
ipv6_ifconfig_gif0="fec0:0:0:50::1/64"
ipv6_defaultrouter="fec0:0:0:50::2:/64"
ipv6_gateway_enable="YES"

getaddrinfo(3)

Dle POSIX 1003.1g. Nahrazuje gethostbyname(3) a getservbyname(3). Vrací nulu v případě úspěchu.

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>

int getaddrinfo(const char *node,              /* FQDN, textový zápis adresy IPvX */
                const char *service,           /* jméno podle /etc/services nebo čislo portu */
                const struct addrinfo *hints,  /* struktura addrinfo */
                struct addrinfo **res);        /* tady se uloží vysledek */

void freeaddrinfo(struct addrinfo *res);

struct addrinfo {
           int    ai_flags;            /* příznaky v hints; dají se spojovat logickým součtem */
           int    ai_family;           /* PF_INET či PF_INET6 */
           int    ai_socktype;         /* SOCK_STREAM, SOCK_DGRAM, ... */
           int    ai_protocol;         /* IPPROTO_TCP či SOCK_UDP */
           size_t ai_addrlen;          /* délka adresy soketu */
           struct sockaddr *ai_addr;   /* adresa soketu */
           char   *ai_canonname;       /* kanonické jméno */
           struct addrinfo *ai_next;   /* následující prvek seznamu nebo NULL */
};

Libovolná adresová rodina     ai_family               AF_UNSPEC
Libovolný typ soketu          ai_socktype             0
Libovolný protokol            ai_protocol             0

Jinak, v takovém případě je samozřejmě lepší NULL.


IPv6 v RFC


Reference

  1. České IPv 6: http://www.ipv6.cz/
  2. Mikuláš Patočka: Protokol IP verze 6: http://artax.karlin.mff.cuni.cz/~mikulas/doc/ipv6.html
  3. FreeBSD Handbook: http://www.freebsd.cz/doc/en_US.ISO8859-1/books/handbook/network-ipv6.html
  4. Gentoo Linux Documentation: http://www.gentoo.org/doc/en/ipv6.xml
  5. Archiv referátů: http://www.fi.muni.cz/~kas/p090/#archiv
  6. 6bone Home Page: http://www.6bone.net/
  7. Michal Ludvig: IPv6 krok za krokem: http://www.logix.cz/michal/doc/article.xp/ipv6-1
  8. RFC: http://www.ietf.org/rfc/
  9. man getaddrinfo
  10. man radvd.conf