Test

Roman Pavlík

PHP (Nette) vývojář, Linux administrátor

Twitter: @roman_pavlik

Všechny články

VPN s OpenVPN

Termín VPN (Virtuální privátní síť) se používá pro počítačové sítě typicky postavené nad veřejnou síťovou infrastrukturou. Termínem virtuální rozumíme fakt, že síť fyzicky neexistuje, resp. neexistují její fyzické hardwarové komponenty (směrovače, přepínače, atd…), nýbrž využívá již existující infrastrukturu, a provoz této sítě je celý vložen do paketů transportní vrstvy(typicky UDP, příp. TCP). Odtud také pojem tunelování. Toto je případ OpenVPN, existují i metody, které tunelování nevyužívají (IPsec,..). Těmito metodami se zde zabývat nebudu, OpenVPN je nevyužívá.

Termín privátní, znamená, že se jedná o síť, která je zřízena jen pro určitou omezenou skupinu uživatelů (firma, organizace,…) a nikdo jiný by se k ní neměl připojit a jakkoliv získat nebo manipulovat s přenášenými daty. Toto se dosáhne zvolením vhodné autentizační a autorizační metody a šifrováním všech informací, které posíláme tunelem. Ovšem ani autentizace, a ani šifrování samo o sobě není nutnou podmínkou pro provoz VPN sítě.

Tolik k stručné terminologii o VPN sítích. Pusťme se do OpenVPN.

OpenVPN – jak funguje ?

OpenVPN je implementace VPN pomocí tunelování na aplikační vrstvě. Nachází se ve všech hlavních linuxových distribucích. Samotná aplikace pracuje v uživatelském prostoru a nepotřebuje ke své činnosti oprávnění superuživatele. Doporučuji však spouštět OpenVPN pod superuživatelem. Je to z toho důvodu, že si OpenVPN může přizpůsobit některé parametry virtuálního sítového zařízení podle své potřeby. S využitím parametrů –user uživatel a –group skupina se ihned po startu svých práv vzdá ve prospěch uvedeného uživatele a skupiny.

Bez pomocí jádra operačního systému by tunelování šlo uskutečnit jen těžko. Linuxové jádro (samozřejmě i *BSD a dokonce i MS Windows) poskytuje možnost vytvořit virtuální síťové rozhraní TUN nebo TAP. K rozdílu se dostaneme později. Toto virtuální rozhraní se chová velmi jednoduše. Jakýkoliv paket, který vstoupí do tohoto rozhraní se vybalí a jeho obsah se zapíše do systémového souboru. Např. v aktuálním Debianu Wheezy je to soubor /dev/net/tun. Samozřejmě to funguje i obráceně, cokoliv se do souboru zapíše, objeví se jako paket na virtuálním systémovém rozhraní.

Toto systémové rozhraní se samozřejmě chová jako klasické rozhraní prakticky bez výjimek. Je mu potřeba nastavit IP adresu, masku a routovací pravidla.

Na následujícím obrázku můžete vidět již pokročilejší využití OpenVPN na serveru. OpenVPN naslouchá na veřejné IP adrese fyzického rozhraní na standardním portu 1194. VPN server spojuje jednotlivé klienty (je možné se setkat i s termínem VPN koncentrátor) a umožňuje klientům připojit se do sítě 10.0.0.0/8, v případě, že je to explicitně povoleno v konfiguraci severů, klienti se mohou připojit vzájemně mezi sebou. Je ovšem nutné nastavit u každého klienta routouvací pravidlo, že síť 10.0.0.0/8 je dostupná přes bránu 192.168.1.1.

TUN vs. TAP rozhraní

Funkce obou rozhraní je v podstatě shodná, všechny příchozí pakety se zapíší do souboru /dev/net/tun, a naopak všechny data zapsané do tohoto souboru se objeví jako pakety na příslušném síťovém rozhraní. Základní a v podstatě jediný rozdíl je, že rozhraní TAP pracuje s ethernetovými rámci a rozhraní TUN s IP pakety. Co to vlastně znamená? Aplikace pracující v uživatelském prostoru se souborem /dev/net/tun, v našem případě OpenVPN, má přístup buď rovnou k L2 vrstvě nebo jenom k L3 vrstvě. Při použití TUN nebo TAP se OpenVPN chová buď jako router nebo jako switch. Pochopitelně nelze vzájemně kombinovat různé typy rozhraní.

Jak takové rozhraní vytvoříme ?

Standardně pomocí OpenVPN. Parametr –mktun akceptuje argument tun nebo tap a parametr –dev požaduje jméno rozhraní, které bude vytvořeno typicky ve složce /dev/. Je dobrou konvencí pojmenovávat zařízení tun0, tun1,… resp. tap0, tap1,…

$ sudo openvpn --mktun tun --dev tun0

TUN/TAP rozhraní jsou samozřejmě systémová rozhraní, které musí podporovat jádro operačního systému a na samotné aplikaci OpenVPN jsou nezávislé. Proto je možné vytvořit TUN/TAP rozhraní i bez OpenVPN a to například příkazem ip.

$ sudo ip tuntap add dev tun0 mode tun

Pokud však používáte TUN/TAP rozhraní spolu s OpenVPN doporučuji vytvářet rozhraní pomocí OpenVPN. Je to z toho důvodu, že si OpenVPN rovnou nastaví dodatečné parametry rozhraní podle své potřeby.

Odstranit rozhraní můžete například takto:

$ sudo openvpn --rmtun --dev tun0

Dbejte však na to, že rozhraní musí být v okamžiku odpojování nepoužívané, jinak příkaz selže.

Jak se tedy rozhodnout, které rozhraní použít?

Mohlo by se zdát, že výhodnější a obecnější je použití zařízení TAP, které pracuje na L2 vrstvě tudíž, takové zařízení můžete přidat do ethernetového mostu a spojit tak například dvě LAN sítě přes jeden VPN tunel nebo pokud potřebujete komunikovat i nějakým nestandardním L3 protokolem. Toto řešení se může zdát krasně čisté a profesionální, avšak bude přinášet více problémů než užitku. V první řadě se VPN tunelem posílá více dat, tzn. do tunelu se posílají i ethernetové rámce. Dále je to šíření broadcast paketů VPN tunelem, což také zvyšuje zatížení tunelu a obvykle to nebývá ani potřeba.

OpenVPN podporuje při práci s rozhraním TUN pouze protokol IPv4 (ve verzi 2.3 už také protokol IPv6), z toho vyplývá omezení na použité L3 protokoly. V případě potřeby například protokolu IPX je třeba použít rozhraní TAP.

Obecně se doporučuje, i podle tvůrců OpenVPN, použít rozhraní TUN. V případě, že víte co děláte a proč to děláte, použijte rozhraní TAP.

Spojení point-to-point

Na závěr si ukážeme, jak vytvořit VPN tunel mezi dvěma stanicemi pomocí rozhraní TUN. Mějme tedy dvě stanice na síti například 203.0.113.0/24. První stanice má IP adresu 203.0.113.1 a druhá 203.0.113.2. První stanice bude mít adresu tunelu 192.168.99.1 a druhá 192.168.99.2.

Na první stanici provedeme sled následujících příkazů.

$ sudo openvpn --mktun tun --dev tun0
$ sudo ip addr add 192.168.99.1 dev tun0
$ sudo ip link set dev tun0 up
$ sudo ip route add 192.168.99.0/24 dev tun0
$ sudo openvpn --dev tun0 --remote 203.0.113.2 1194

Co jsme vlastně udělali? Prvním příkazem bylo vytvořeno virtuální systémové rozhraní tun0. Dalšími třemi příkazy jsme tomuto rozhraní nastavili IP adresu, rozhraní jsme zapnuli a nastavili statické routovací pravidlo, které říká, že všechny požadavky na síť 192.168.99.0/24 mají jít přes rozhraní tun0. Posledním příkazem jsem spustili instanci OpenVPN a řekli jí ať se snaží připojit na vzdálenou adresu 203.0.113.2 a port 1194, vytvořit VPN tunel a použít rozhraní tun0.

Pokud se OpenVPN spojení podaří oznámí vám to hláškou Initialization Sequence Completed. Pokud chcete spojení ukončit použijte klávesovou zkratku Ctrl+c.

Na druhé stanici provedeme v podstatě úplně to samé, pouze změníme adresy:

$ sudo openvpn --mktun tun --dev tun0
$ sudo ip addr add 192.168.99.2 dev tun0
$ sudo ip link set dev tun0 up
$ sudo ip route add 192.168.99.0/24 dev tun0
$ sudo openvpn --dev tun0 --remote 203.0.113.1 1194

Příkazem ping si můžete ověřit funkčnost tunelu. Například ze stanice s IP 192.168.99.1 pro­veďte ping na stanici 192.168.99.2

$ ping 192.168.99.2

Všimněte si, že ping na vzdálenou stanici a má o několik řádu delší odezvu než na lokální stanici.

Dále bych chtěl upozornit, že veškerá data, která prochází tunelem jsou v této konfiguraci nešifrovaná, což dokazuje hláška: all encryption and authentication features disabled – all data will be tunnelled as cleartext .

Závěr

Máme za sebou uvodní článek o OpenVPN. Na co se můžete těšit příště? Ukážeme si pokročilejší konfigurace site-to-site VPN, nastavení TLS vrstvy mezi OpenVPN klientem a serverem a další. Pokud jste v článku narazili na jákekoliv nejasnosti nebo nepřesnosti, napište je prosím do komentářů.

rp


Zdroje:

[1] OpenVPN – oficialní stránky [online]. 2001 [cit. 2013–05–11]. Dostupné z: www.openvpn.net

[2] CALETKA, Ondřej. Prezentace – OpenVPN. In: [online]. [cit. 2013–05–11]. Dostupné z: http://installfest.cz/…-OpenVPN.pdf

[3] Manuálové stránky OpenVPN



Komentáře

K tomuto článku zatím nebyl vložen žádný komentář.


Nový příspěvek


E-mailová adresa je soukromý údaj a nebude nikomu zobrazena.



Pro formátování textu komentáře můžete používat následující pravidla.

Texy titulky jsou, pro přehlednost diskuze, zakazány.


V případě jakýchkoliv problémů s odesílaním příspěvku mě, prosím, kontaktujte na e-mail uvedený v patičce webu.