Vysoká škola báňská - Technická univerzita Ostrava Dynamické IPv6 tunelovaní Projekt do předmětu TPS Macka Radek : mac309 Balluch Andrej : bal134 Datum: 8.2.2006
1 Obsah 1 Úvod 2 2 Řešení 2 2.1 Slepá větev - tunnel broker Telecom Italia Labs........ 2 2.2 Realizace pomocí OpenVPN................... 3 2.3 Nastavení OpenVPN....................... 4 2.3.1 Konfigurační soubory serveru.............. 5 2.3.2 Konfigurační soubory klienta............... 6 3 Zhodnocení 7 4 Příloha 8 Použitá Literatura
2 1 Úvod Účelem projektu je vytvořit tunelované spojení dvou odlehlých IPv6 sítí pomocí stávající IPv4 sítě, které není (ale může být) permanentní, ale existuje pouze na potřebnou dobu. Může se tedy jednat např. o připojení jediného klienta k existující síti nebo také o připojení skupiny klientů přes IPv4 síť. Projekt jsme řešili na platmorfmě Linux (zpočátku Debian kernel 2.4.26, později už jen výhradně kernel 2.6.8 s podporou IPv6 a tap/tun 1 modulů). Jedná se tedy o klient-server architekturu. Za server je považován stroj, za nímž se nachází IPv6 síť a zároveň leží v dosažitelné IPv4 síti. Za klienta je považován odlehlý stroj, jež pomocí IPv4 sítě chce serveru a potažmo za ním ležící IPv6 sítě dosáhnout. 2 Řešení 2.1 Slepá větev - tunnel broker Telecom Italia Labs Řešením tohoto problému může být obdobou tunel-broker aplikací, které umožňují připojení jenotlivých stanic do již existujících IPv6 sítí (např. FreeNet6, 6Bone, 6Win apod.). Proto jsme si zvolili jednu z těchto mála dostupných aplikací 2 a snažili se ji přizpůsobit našim laboratorním podmínkám. Jedná so o aplikaci, která je ovládáná přes webové rozhraní a všechna data o existujících klientech a jejich IP adresách, potřebné autentifikační údaje shromažďovala v databázi (msql). K realizaci těchto tunelů pak využívala perlových skriptů. Problém však nastal, když ani na jednom z našich strojů nebylo možno tuto databázi - jednalo se o msql (verze 2.0.3) kvůli chybám ve zdrojových kódech zkompilovat a jejich binární podoba nebyla navzdory prosbě autorům dostupná. 1 Virtuální síťová zařízení sloužící: TUN je point-to-point driver navržený k IP tunelování. Nabízí uživatelským aplikacím komunikaci na virtuálních zařízeních tunx, kde jádro dále směruje IP rámce zařízení /dev/tunx a stará o předávání na fyzická rozhraní. TAP je virtuální ethernetové síťové rozhraní /dev/tapx, které umožňuje tunelování podobně jako TUN, ale s tím rozdílem, že v jádře dochází k tunelování celých ethernetových rámců. 2 Jednalo se o vývojový balík spolupracujících aplikací vyvinutých Telecom Italia Labs http://carmen.cselt.it/ipv6/tools/ipv6tb/index.html z konce 90tých let minulého století, dnes již nejspíše používají nějaké své uzavřené řešení.
3 2.2 Realizace pomocí OpenVPN Po počátečním neúspěchu jsme tedy hledali další řešení a zvolili jsme si variantu, kdy realizaci použijeme aplikaci OpenVPN. Copak vlastně umí OpenVPN? OpenVPN je to uživateslky přívětivý, robustní, a vysoce konfigurovatelný VPN 3 démon, kterým můžete bezpečně propojit dvě či více sítí pomocí šifrovaného i nešifrovaného tunelu. OpenVPN patří do skupiny open source VPN, které nepoužívají IPSec. Místo toho je použito SSL/TLS 4 šifrování. Mezi jeho hlavní přednosti patří: Podpora většiny platforem - Linux, Solaris, OpenBSD, FreeBSD, NetBSD, Mac OS X a Windows 2000/XP. Celý program běží v user-mode, a není tedy potřeba patchovat kernel (za předpokladu, že máte zapnutou podporu pro TUN/TAP zařízení). Podpora režimů 1:1 (režim point-to-point tunel) nebo 1:N (režim client/server). Možnost použití sdíleného klíče a/nebo SSL certifikátů. Jednoduchá a srozumitelně zdokumentovaná konfigurace a podrobné logovací soubory. Vysoká odolnost při použití na méně kvalitních linkách při použití komprese. Podpora HTTP a SOCKS proxy. To je výhodné především pro road warrior režim 5, klient se tak může připojit téměř odkudkoli. OpenVPN standardně používá protokol UDP, ale lze použít i TCP. Veškerá komunikace probíhá na jediném portu. Díky tomu lze tedy snadno nakonfigurovat firewall, aby propouštěl pouze pakety na tomto portu. Celý OpenVPN 3 zkratka pro Virtual Private Network 4 SSL znamená Secure Sockets Layer a je to šifrovací protokol navržený firmou Netscape, který funguje nad vrstvou TCP/IP a (nejen) pod protokoly HTTP,FTP TLS(Transport Layer Security) je protokol, pomocí něhož se šifruje/dešifruje komunikace. TLS vychází z protokolu SSL a je s ním velmi ůzce svázán. TLS i SSL fungují stejně a oba se používají k identifikaci serveru (případně i klienta) certifikáty. Ikdyž se od příliš neodlišují, jsou bohužel vzájemě nekompatibilní. 5 Road warrior je vlastně klient cestující např. se svým přenosným počítačem, který chce dosáhnout domovské sítě z různých destinací.
4 démon komunikuje prostřednictvím TAP nebo TUN rozhraní. Takto vytvořená rozhraní všechna přijatá data předávají přímo uživatelskému procesu, který tak může vystupovat v roli sítové karty. Instalace OpenVPN je jednoduchá. Buď si ze stránek projektu http: //openvpn.net/download.html opatříme tgz balíček (aktuálně ve verzi 2.0), rozbalíme a použijeme trojici./configure, make a make install. Pokud chceme používat kompresi, musíme mít nainstalovanou knihovnu lzo a pokud i šifrování tak openssl. Další možností je např. použítí binárního balíčku dodaného přímo k vaší distribuci (v našem případě Debian) získaného z oficiálného zdroje pomocí příkazu apt-get install openvpn, odpadne nám tedy případné řešení závislostí. Praktické ověření proběhlo na dvou počítačích s operačním systémem Linux, distribuce Debian, s jádrem 2.6.8 spolu s dostupným balíčkem OpenVPN verze 2.0. Na těchto strojích dostupných vzájemně přes IPv4 síť (viz. obrázek 1) poběží OpenVPN. Na prvním počítači je zkonfigurováno v režimu serveru naslouchajícího na portu 5000 TCP na případná připojení klientů (odboba VPN koncentrátoru) a na druhém v režimu klienta, který se na port serveru přes IPv4 síť připojuje. Korektně funkční bylo spojení jak na bázi protokolu TCP, tak i UDP, pro dokumentaci jsme si zvolili TCP. Obrázek 1: Schéma zapojení 2.3 Nastavení OpenVPN Nyní můžeme po dokončení příkazu apt-get install openvpn přistoupit k jeho konfiguraci. Konfigurační soubory jsme měli uloženy v adresáři /etc/openvpn/. Pro první stroj - server je použita IPv4 adresa eth0 rozhraní 158.196.158.80 a klientova IPv4 adresa je 158.196.49.88. OpenVPN nám umožní vytvořit virtuální point-to-point IPv6 tunel s adresami 2001:638:500:f100::f101:1 (tun0 na serveru) a 2001:638:500:f100::f101:2 (tun0 na klientovi).
5 2.3.1 Konfigurační soubory serveru Chování OpenVPN bylo ovlivněno těmito konfiguračními soubory: /etc/openvpn/server-conf/ konfirurační soubor server.conf a skript server.up k vytvoření,oadresování rozhraní tun a nastavení parametrů směrování a předávání paketů. /etc/openvpn/server-logs/ k ukládání údajů logu do souboru server.log (velmi důležité, zejména pokud ladíte tunel při použití SSL šifrování :-). Obsahy konfiguračních souborů: server.conf daemon server #OpenVPN běží v módu server dev tun #vytvoří rozhraní tun tun-ipv6 #tun má umět předávat IPv6 up /etc/openvpn/server-conf/server.up #skript, spuštěný při startu openvpn démona log-append /etc/openvpn/server-logs/server.log #umístení log souboru port 5000 #na jakém portu bude server naslouchat proto tcp-server #na jakém protokolu server poběží persist-tun #zachovat totéž tun rozhraní i po rozpadu spojení detekovaného ping-timerem ping 15 #jak často provádí ping na druhý konec tunelu - test připojení ping-restart 45 #jak dlouho čekat na restart při neaktivitě ping-timer-rem #provádí restart spojení pouze pokud již zná adresu druhého konce tunelu verb 5 #úroveň upovídanosti do logu (5 je dostačující) server.up jedná se o spustitelný skript interpretovaný v Bashi. #!/bin/bash INTERFACE=$1; shift; #parsuje argumenty získané z démona openvpn TUN MTU=$1; shift; UDP MTU=$1; shift; LOCAL IP=$1; shift; REMOTE IP=$1; shift; MODUS=$1; shift; ip link set ${INTERFACE} up #vytvoření tun rozhraní předaného parametrem z démona ip link set mtu ${TUN\MTU} dev ${INTERFACE} #a nastavení MTU pro toto rozhraní ip -6 addr add 2001:638:500:f100::f101:1/112 dev ${INTERFACE} #přidělíme tomuto rozhraní jeho IPv6 adresu, která bude viditelná v celé naši IPv6 síti)
6 ip -6 addr add fe80::f101:1/64 dev ${INTERFACE} #přidělíme tomuto rozhraní jeho IPv6 adresu, která je pouze pro potřeby identifikace v point-to-point spojení) ip -6 route add 2001:638:500:f101::/64 dev ${INTERFACE} #přidáme nový záznam do směrovací tabulky jádra exit 0 2.3.2 Konfigurační soubory klienta OpenVPN bylo nastaveno těmito soubory: /etc/openvpn/ konfirurační soubor klient.conf a skript klient.up k vytvoření,oadresování rozhraní tun a nastavení parametrů směrování a předávání paketů. /etc/openvpn/ k ukládání údajů logu do souboru klient.log. Obsahy konfiguračních souborů: klient.conf daemon client #OpenVPN běží v módu klient dev tun #vytvoří rozhraní tun tun-ipv6 #tun má umět předávat IPv6 remote 158.196.158.80 #adresa, kde OpenVPN server naslouchá up /etc/openvpn/klient.up #skript, který se spouští při startu openvpn démona log-append /etc/openvpn/client.log #umístení log souboru port 5000 #na jakém portu budeme naslouchat proto tcp-client #na jakém protokolu klient poběží persist-tun #zachovat totéž tun rozhraní i po rozpadu spojení detekovaného ping-timerem ping 15 #jak často provádí ping na druhý konec tunelu - test připojení ping-restart 45 #jak dlouho čekat na restart při neaktivitě ping-timer-rem #provádí restart spojení pouze pokud již zná adresu druhého konce tunelu verb 5 #úroveň upovídanosti do logu (5 je dostačující) klient.up #!/bin/bash INETRFACE=$1; shift; #parsuje argumenty získané z démona openvpn TUN MTU=$1; shift; UDP MTU=$1; shift; LOCAL IP=$1; shift; REMOTE IP=$1; shift; MODUS=$1; shift; ip link set tun0 up #vytvoření tun rozhraní ip link set mtu ${TUN MTU} dev tun0 #a nastavení MTU tomuto rozhraní
7 ip -6 addr add 2001:638:500:f100::f101:2/112 dev tun0 #přidělíme tomuto rozhraní jeho IPv6 adresu, která bude viditelná v celé naši IPv6 síti) ip -6 addr add fe80::f101:2/64 dev tun0 #přidělíme tomuto rozhraní jeho IPv6 adresu, která je pouze pro potřeby identifikace v point-to-point spojení) ip -6 route add default dev tun0 metric 1 #přidáme nový záznam do směrovací tabulky jádra sysctl -w net.ipv6.conf.all.forwarding=1 #zapneme předávání IPv6 paketů ip -6 addr show dev eth0 grep 2001:638:500:f101::1/64 \ #přidělíme adresu rozhraní eth0 podle našich potřeb, aby bylo dosažitelné v naší podsíti >/dev/null 2>&1 ip -6 addr add 2001:638:500:f101::1/64 dev eth0 exit 0 3 Zhodnocení Máme-li zhodnotit použité řešení, tak jsme byli spokojeni příjemnou konfigurovatelností aplikace OpenVPN. Provoz byl bezproblémový na Fast Etherner síti a díky možnostem použití komprese a případného šifrování atd. bude funkční i zabezpečený kanál na pomalejších linkách. Korektní provoz byl otestován několika náhodně zvolenými aplikacemi, které podporovaly IPv6. Analyzátorem jsme odchytili komunikaci při navazování SSH spojení přes IPv6 tunel (v příloze) zabalené uvnitř IPv4 paketů.
8 4 Příloha Přikládáme k nahlédnutí výpis logu client.log při vytváření tunelu na klientském počítači. Thu Feb 8 14:47:30 2006 us=704855 OpenVPN 2.0.1 i486-pc-linux-gnu [SSL] [LZO] [EPOLL] built on Nov 7 2005 #spuštění démona Thu Feb 8 14:47:30 2006 us=705049 ******* WARNING *******: all encryption and authentication features disabled -- all data will be tunnelled as cleartext Thu Feb 8 14:47:30 2006 us=708476 TUN/TAP device tun0 opened #vytvoření tun0 rozhraní Thu Feb 8 14:47:30 2006 us=708635 TUN/TAP TX queue length set to 100 Thu Feb 8 14:47:30 2006 us=708786 /etc/openvpn/client.up tun0 1500 1502 init net.ipv6.conf.all.forwarding = 1 #startovací skript a parametry, jež jsou mu předány démonem Thu Feb 8 14:47:30 2006 us=849077 Data Channel MTU parms [ L:1502 D:1450 EF:2 EB:4 ET:0 EL:0 AF:14/2 ] Thu Feb 8 14:47:30 2006 us=849196 Local Options String: V4,dev-type tun,link-mtu 1502,tun-mtu 1500,proto TCPv4 CLIENT,tun-ipv6 Thu Feb 8 14:47:30 2006 us=849244 Expected Remote Options String: V4,dev-type tun,link-mtu 1502,tun-mtu 1500,proto TCPv4 SERVER,tun-ipv6 Thu Feb 8 14:47:30 2006 us=849343 Local Options hash (VER=V4): aed45092 Thu Feb 8 14:47:30 2006 us=849416 Expected Remote Options hash (VER=V4): 2074cb83 Thu Feb 8 14:47:30 2006 us=850010 Attempting to establish TCP connection with 158.196.158.80:5000 #snaha navázat spojení na server Thu Feb 8 14:47:30 2006 us=851828 TCP connection established with 158.196.158.80:5000 #spojení bylo úspěšné Thu Feb 8 14:47:30 2006 us=851989 Socket Buffers: R=[87380->131072] S=[16384->131072] Thu Feb 8 14:47:30 2006 us=852068 TCPv4 CLIENT link local: [undef] Thu Feb 8 14:47:30 2006 us=852120 TCPv4 CLIENT link remote: 158.196.158.80:5000 Thu Feb 8 14:47:30 2006 us=852589 Peer Connection Initiated with 158.196.158.80:5000 Thu Feb 8 14:47:31 2006 us=978152 Initialization Sequence Completed #počáteční propojení bylo taktéž úspěšné Dále příkládáme stručný výpis navazování SSH provozu procházejícího přes IPv6 tunel mezi klientem a serverem (dle obrázku). SSH server naslouchal na adrese 2001:718:1001:158:204:76ff:fe0d:fa3f, což je IPv6 adresa rozhraní eth0 a klient se připojoval z adresy 2001:638:500:f100::f101:2, což je adresa virtuálního tunelového rozhraní tun0. Ukázka IPv6 paketu, kdy SSH server zasílá klientovi informace o běžící verzi SSH serveru (SSH-2.0-OpenSSH 3.8.1p1 Debian-8.sarge.4), tedy se jedná ještě o čitelnou nešifrovanou informaci. Frame 4 (117 bytes on wire, 117 bytes captured) Frame Number: 4 Packet Length: 117 bytes
9 Obrázek 2: SSH spojení Protocols in frame: sll:ipv6:tcp:ssh #všimněme si struktury protokolu Protocol: IPv6 (0x86dd) Internet Protocol Version 6 Version: 6 Traffic class: 0x00 Payload length: 61 Next header: TCP (0x06) Hop limit: 64 Source address: 2001:718:1001:158:204:76ff:fe0d:fa3f Destination address: 2001:638:500:f100::f101:2 Transmission Control Protocol, Src Port: 22 (22), Dst Port: 1879 (1879), Seq: 1, Ack: 1, Len: 41 Source port: 22 (22) Destination port: 1879 (1879) Sequence number: 1 (relative sequence number) Next sequence number: 42 (relative sequence number) Checksum: 0xb055 [correct] SSH Protocol Protocol: SSH-2.0-OpenSSH 3.8.1p1 Debian-8.sarge.4 Ukázka IPv4 paketu, který nese IPv6 paket uvedený výše. Frame 48 (157 bytes on wire, 157 bytes captured) Frame Number: 48 Packet Length: 157 bytes Capture Length: 157 bytes Protocols in frame: eth:ip:tcp:data #všimněme si struktury protokolu Ethernet II, Src: 00:04:76:0d:fa:3f, Dst: 00:0a:f3:6e:bc:0a Type: IP (0x0800) Internet Protocol, Src: 158.196.158.80 (158.196.158.80), Dst: 158.196.49.88
(158.196.49.88) Version: 4 Header length: 20 bytes Total Length: 143 Identification: 0x84ac (33964) Flags: 0x04 (Don t Fragment) Fragment offset: 0 Time to live: 64 Protocol: TCP (0x06) Header checksum: 0xa88b [correct] Transmission Control Protocol, Src Port: 5000 (5000), Dst Port: 5509 (5509), Seq: 92, Ack: 172, Len: 103 Source port: 5000 (5000) Destination port: 5509 (5509) Sequence number: 92 (relative sequence number) Next sequence number: 195 (relative sequence number) Acknowledgement number: 172 (relative ack number) Header length: 20 bytes Flags: 0x0018 (PSH, ACK) Window size: 16254 Checksum: 0x0db3 [correct] 10
11 Reference [1] Satrapa, P.: Ipv6, Praha(2002), ISBN 80-86330-10-9 [2] How&to na použití OpenVPN jako IPv6 tunel brokeru http: //www.join.uni-muenster.de/dokumente/howtos/howto_openvpn_ Tunnelbroker.php [3] Domovské stránky projektu IPv6 tunel brokeru Telecom Italia Labs http://carmen.ipv6.tilab.com/ipv6/tools/ipv6tb [4] Úvod do OpenVPN na serveru root.cz http://www.root.cz/clanky/ openvpn-vpn-jednoduse [5] man openvpn