Published on 2003-2-19 at linuxzone.cz

IPv6 krok za krokem - 2

Michal Ludvig <michal@logix.cz> (c) 2003

Z minulého dílu víte, jak vypadá IPv6 adresa a k čemu je ve světě IPv6 dobrý tunel. Pokud jste splnili zadání domácího úkolu, jste teď nejspíš registrovaní u některého tunnel brokera a možná už jste podle instrukcí na jeho stránkách rozchodili zálkadní IPv6 provoz. Dnes se blíže podíváme na konfiguraci tunelů, routování, firewall a další záležitosti reálného provozu.

Konfigurace tunelů

Tunely můžete konfigurovat buď "postaru" pomocí příkazů ifconfig a route, nebo půjdete s dobou a použijete víceúčelový program ip z balíčku iproute2. My samozřejmě půjdeme s dobou, takže náš první příkaz bude

/sbin/ip tunnel add tunylek mode sit local 91.92.93.94 remote 44.55.66.77 ttl 64
/sbin/ip
To je jasný, to je název programu.
tunnel
Taky jasný, budeme se zabývat tunelem.
add tunylek
Chceme přidat nový tunel a pojmenujeme ho tunylek.
mode sit
Chceme vyrobit tunel pro IPv6-over-IPv4 provoz, takže zvolíme typ sit. Další možné volby (ipip, gre) se používají pro jiné typy tunelů a nesouvisí s IPv6, takže nás nezajímají.
local 91.92.93.94 a remote 44.55.66.77
Veřejné IPv4 adresy místního a vzdáleného konce tunelu.
ttl 64
Tahle volba je zajímavější, než se na první pohled zdá. Pokud bychom jí neuvedli, bylo by to stejné, jako kdybychom zadali ttl inherit, což by znamenalo, že vnější (IPv4) paket zdědí TTL (Time To Live, životnost) vnitřního IPv6 paketu. Kupříkladu traceroute6 nejdříve pošle IPv6 paket s TTL=1. Zabalený IPv4 paket tuto hodnotu zdědí a bude mít také TTL=1, což ovšem znamená, že se nedostane dál, než k nejbližšímu IPv4 routeru. Tam jeho životnost vyprší a bude zahozen. Jenže my chceme, aby nám traceroute6 na první řádce ukázal že paket dorazil na bránu tunnel brokera, takže musíme zajistit, aby i IPv6 provoz s TTL=1 došel třeba přes půl IPv4 internetu až na druhý konec tunelu. No a k tomu nám poslouží volba ttl 64, díky níž budou mít všechny vnější pakety nastaveno TTL=64 bez ohledu na TTL paketu vnitřního a tudíž se vždy dostanou až na místo určení. Ještě jednou zdůrazňuji, že tunel se z hlediska IPv6 paketů chová jako jeden "hop" a naprosto nás nezajímá přes kolik IPv4 routerů zabalený paket cestou ve skutečnosti projde.

Takže máme nakonfigurovaný tunel. Zatím je shozený (down), abychom ho mohli používat, musíme ho zaktivovat:

/sbin/ip link set tunylek up

Nyní by již tunylek měl být funkční. Můžeme ho vyzkoušet:

# ping6 -I tunylek fe80::44.55.66.77
PING fe80::44.55.66.77(fe80::2c37:424d) from ::1 tunylek: 56 data bytes
64 bytes from fe80::2c37:424d: icmp_seq=1 ttl=64 time=0.063 ms
64 bytes from fe80::2c37:424d: icmp_seq=2 ttl=64 time=0.090 ms
^C

Protože linkové IPv6 adresy obou konců tunelu jsou v Linuxu odvozeny od příslušných IPv4 adres, můžeme je s výhodou zapisovat jako fe80::44.55.66.77 a fe80::91.92.93.94, což je stejné jako kdybychom "správněji" psali fe80::2c37:424d resp. fe80::5b5c:5d5e, ale bez nutnosti konverze dekadických čísel na hexadecimální.
Mimochodem pokud vám výše uvedený ping nebude chodit, může být chyba buď v konfiguraci vašeho tunelu, v nastavení firewallu, nebo v tom, že druhá strana nepoužívá Linux, takže vzdálená linková adresa může být tvořena jiným způsobem. Nevadí, čtěte dál, třeba se to časem vyřeší :-)

Jestliže chceme spojení s celým IPv6 světem, tak se celkem hodí nastavit routování:

/sbin/ip route add 2000::/3 dev tunylek

Možná se ptáte, proč přidáváme cestu pouze pro 2000::/3 a ne pro ::/0 nebo pro "default" nebo tak něco. Inu je to proto, že přestunylek budeme posílat pouze pakety směřující na globální adresy (viz první díl).
Taky se možná ptáte, kde je zapsána adresa routeru na druhém konci tunelu. Jednoduše řečeno: není potřeba. Pokud kernel ví, že tunel je dvoubodové spojení (point to point link) tak je jasné, že druhý konec je zároveň oním žádaným routerem. Až bude potřeba odeslat paket, který vyhovuje předchozímu routovacímu pravidlu, kernel ho zabalí do IPv4 obálky a odešle na adresu 44.55.66.77, kde ho tam sedící router vybalí a zpracuje nebo pošle dál. Je tedy vidět, že jeho IPv6 adresu nepotřebujeme. Pokud chcete vědět víc, doporučuji RFC 2491.

Než budeme moci začít komunikovat se světem, musíme si ještě nastavit vlastní globální adresu, aby druhá strana věděla, kam má posílat odpovědi. Řekněme, že jste od tunnel brokera dostali celý prefix 3ffe:ffff:1234::/48 a vašemu počítači chcete dát 3ffe:ffff:1234::1. Na lokální úrovni se obvykle používají subnety s prefixem 64bitů, takže kýžený příkaz je:

/sbin/ip addr add 3ffe:ffff:1234::1/64 dev tunylek

Nyní byste měli být schopni pingat a traceroutovat po celém IPv6 internetu (příkazy ping6 a traceroute6). Pokud vám toto bude fungovat, můžete z Mozilly, která je standardně IPv6-enabled, vyzkoušet nějaké weby (třeba http://www.ipv6.logix.cz, nebo http://www.kame.net), na kterých rovnou poznáte, zda jste připojeni přes IPv6 nebo přes IPv4 (předem si však vypněte případnou proxy). Pokud vám všechno chodí, máte nakonfigurovaného IPv6 klienta, gratuluji :-)

Mimochodem, jestliže používáte SuSE Linux verze 8.1 a nižší, budete muset explicitně povolit překlad doménových jmen na IPv6 adresy v souboru /etc/nsswitch.conf změnou volby dns na dns6 v řádcích hosts a networks. Pokud to neuděláte, bude resolver vracet vždy pouze IPv4 adresy.

Firewall

Pro přenos IPv4 paketů obsahujících zabalená IPv6 data se používá IPv4 protokol číslo 41, v /etc/protocols překvapivě označený jako ipv6. Pokud na svém počítači používáte paketový filtr, což je celkem rozumné, musíte tomuto protokolu uvolnit cestu:

/sbin/iptables -I INPUT -p ipv6 -j ACCEPT

Tím povolíte provoz samotného tunelu, takže IPv4 paket se dostane až do kernelu a tam z něj bude vybalen originální IPv6 paket. Protože dbáte na bezpečnost a víte, že zlí hoši se mohou vyskytovat i na 6bone, je celkem rozumné nastavit filtrování příchozího IPv6 provozu. Jednoduchý příklad může vypadat třeba takto:

/sbin/ip6tables -F INPUT
/sbin/ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT
/sbin/ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT
/sbin/ip6tables -A INPUT -p tcp -j LOG
/sbin/ip6tables -A INPUT -p tcp -j DROP

Samozřejmě je to jen ukázka. Konkrétní pravida si jistě každý odladí podle svých potřeb. Doporučuji někde ke konci nechat logování zahazovaných paketů, abyste věděli o co přicházíte a mohli se rozhodnout, zda by nebylo lepší něco z toho přece jenom akceptovat.

Lokální síť

Jeden počítač tedy máme připojen. Nyní předpokládejme, že do IPv6 Internetu chceme připojit celou síť. V tom případě musíme tunel nakonfigurovat na routeru, avšak globální adresu nenastavovat na interface tunylek, nýbrž na náš vnitřní interface (řekněme, že je to eth1). Nebojte se, že byste pak nemohli komunikovat přímo z routeru - výběr odchozí adresy v Linuxu probíhá tak, že se kernel nejprve podívá, jestli rozhraní, přes které bude paket odcházet (v našem případě tunylek) má přiřazenu adresu odpovídajícího typu (v našem případě globální). Pokud má, použije ji. V našem případě nemá, takže se podívá, jestli některý z ostatních interfaců nemá vhodnou adresu. Pokud ano, použije tu. V našem případě tedy pro odchozí pakety bude použita globální adresa z eth1.

Dále na routeru budete muset povolit forwardování IPv6 paketů:

/sbin/sysctl -w net.ipv6.conf.all.forwarding=1

a případně nastavit firewall podle vašich bezpečnostních požadavků.

Autokonfigurace

Router máme nakonfigurován, ale co stanice? Můžeme jednu po druhé obejít a na každé nastavit vše ručně:

/sbin/ip addr add 3ffe:ffff:1234::abcd/64 dev eth0
/sbin/ip route add 2000::/3 via 3ffe:ffff:1234::1

Ale to není taková legrace. Lepší je využít bezestavové autokonfigurace adres (Stateless address autoconfiguration) popsané v RFC 2462, která nám může ušetřit spoustu práce. Princip je takový, že router jednou za čas (obvykle po desítkách vteřin) pošle všem stanicím zprávu: "Ahoj, já jsem router a mám linkovou adresu fe80::200:ff:fe00:1. Tahle síť používá prefix 3ffe:ffff:1234::/64. Račte si nasvatit své adresy." Zprávě se učeně říká Router advertisement message (RA) - oznámení routeru.

Stanice, která tuhle zprávu zachytí, vezme svou ethernetovou adresu, třeba 00:01:02:03:04:05 a oznámený prefix a složí z nich svou globální adresu 3ffe:ffff:1234:0:201:2ff:fe03:506.
Proč dané MAC adrese odpovídá zrovna tato IPv6 adresa se dozvíte v RFC 2464 (Transmission of IPv6 Packets over Ethernet Networks) a RFC 2373 (IPv6 Addressing Architecture - kapitola "2.5.1 Interface Identifiers").
Dále si příjemce poznamená linkovou adresu routeru a nastaví si jí jako výchozí bránu pro všechny pakety, pro které nebude znát lepší cestu.

Je to jednoduché a elegantní řešení, které však není zcela dokonalé. Jednak k nově vytvořené adrese nebude existovat dopředný ani reverzní DNS záznam, ale protože tímto způsobem budeme většinou konfigurovat klientské stanice a nikoliv servery, nemuselo by nám to tolik vadit. Další problém je, že oznámení routeru narozdíl od DHCP odpovědi neobsahuje informaci o DNS serverech. Sice existují způsoby, jak tuto záležitost vyřešit, ale prozatím jsou vesměs ve stádiu úvah. Ale předpokládejme, že stanice jsou už nakonfigurovány pro IPv4 provoz a tudíž mají i povědomí o DNS serverech přístupných přes IPv4 protokol. Nic nám nebrání tyto servery využít i pro překlad IPv6 adres.

Pár poznámek k tomuto tématu:

radvd

V Linuxu najdete program radvd (Router ADVertisement Daemon), který pro posílání oznámení použijeme. Konfigurační soubor /etc/radvd.conf může vypadat třeba takhle:

# Posíláme do vnitřní sítě
interface eth1
{
	# Povolíme odesílání
	AdvSendAdvert on;
	
	# Nastavíme prefix
	prefix 3ffe:ffff:1234::/64 
	{
		# Platnost adresy bude 1 hodina
		AdvValidLifetime 3600;
	};
};

Voleb samozřejmě existuje mnohem víc a manuálová stránka je všechny podrobně popisuje.
Nyní stačí spustit program radvd a všechny počítače v lokální síti by se měly nakonfigurovat. Pokud chcete vidět, jaké informace jim router posílá, spusťte na některém z nich program radvdump, který každé oznámení routeru přehledně vypíše.

A je to. Vaše síť by nyní měla mít funkční IPv6 konektivitu. V dalším díle se dostaneme ke konfiguraci DNS a některých aplikací. Do té doby můžete směle experimentovat s tím, co jsme zatím dokázali.


IPv6 krok za krokem: [ 1 ] [ 2 ] [ 3 ]
[ Všechny články ] [ Domácí stránka ]