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:
- Každé jednotlivé stanici můžete zakázat zpracovávání
advertisementů nastavením:
/sbin/sysctl -w net.ipv6.conf.all.accept_ra=0
Pokud chcete omezit příjem RA jen na konkrétním rozhraní, nahraďte all jeho jménem, např. eth0.
- Každá stanice si může kdykoliv vyžádat zaslání RA tím, že do sítě odešle Router solicitation message, tedy výzvu routeru, aby poslal patřičné údaje. Obvykle kernel tuto zprávu pošle po aktivování nového interface (třeba při bootu), nebo po zavedeni modulu ipv6.o. Kdyby to neudělal, musel by čekat leckdy i několik minut bez adresy až do chvíle, než router v pravidelném intervalu odešle své oznámení.
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 ]