Přidat článek mezi oblíbenéZasílat nové komentáře e-mailem Jak na OpenVPN - minimanuál

Cílem tohoto článku je popsat a na příkladech ukázat nejběžnější využití služby VPN. Jako VPN systém bude použit OpenVPN v aktuální verzi 2. Výběr padl na tento software proto, že je open source, a existuje pro všechny významné platformy (Linux, BSD i Windows). Jako východisko pro příklady je brán (asi nejčastější) případ, kdy server běží na Linuxu a klienti jsou PC s Windows. Nicméně změny platformy jsou v tomto případě téměř irelevantní.

1. Nejdříve (opět) trocha teorie

VPN je zkratka pro pojem Virtual Private Network, tj. Virtuální soukromá síť. Používá se převážně ve dvou případech: první případ lze popsat situací, kdy tzv. cestující uživatel potřebuje přistupovat k prostředkům své domácí lokální sítě, přičemž tyto prostředky nelze z nějakých důvodů (bezpečnostní, rychlostní, apod.) publikovat na internetu. Je třeba hned na úvod poznamenat, že VPN nezrychluje přístup k domovské síti (je to spíše naopak), ale může vám zpřístupnit např. terminálserver ukrytý až za demilitarizovanou zónou. Druhý případ častého použití VPN je propojení dvou a více LAN sítí a vytvoření virtuální WAN (Wide Area Network) přes internet v případech, kdy je nemožné, nebo finančně příliš nákladné, zakoupit fyzickou point-to-point linku nebo alespoň telekomunikační virtuální okruh. Tolik k nejběžnějšímu užití (nicméně není problém "vymyslet" např. užití VPN pro virtuální herní síť.)

1.1 Jak funguje provoz a zabezpečení

Zabezpečení celé komunikace probíhá pomocí šifrování na úrovni virtuálního adaptéru (jak u serveru, tak klienta), jehož podoba může mít dvě varianty:

TUN – Virtuální Point to Point síťové rozhraní (pracuje s IP rámci)
TAP – Virtuální Ethernet síťové rozhraní (pracuje s Ethernet rámci)

Šifrování pak zajišťuje balík OpenSSL, základní (není cílem článku popisovat kompletní funkcionalitu OpenSSL) konfigurace certifikátů a vysvětlení bude následovat záhy.
Pro ukázku jsem zvolil rozhraní typu TAP z toho důvodu, že běží na nižší úrovni ISO/OSI, a proto dovoluje při použití daleko větší volnost (např. použít i jiné protokoly, než z rodiny TCP/IP) navzdory faktu, že má větší režii, a dále proto, že umožní vytvořit nejen množinu point-to-point spojení, ale kompletní virtuální LAN.

1.2 Důležité informace než začnete

Pro bezproblémovou konfiguraci je vhodné připomenout, že budeme vytvářet virtuální síť propojující LAN s PC mimo ni, případně dvě LAN mezi sebou, a proto je vhodné věnovat velkou pozornost plánování směrování (routingu), a obzvláště pak správnému výběru síťových adres, a to ve všech sítích, které se budou této taškařice účastnit. Pokud vás dostihne nemilá skutečnost, že v některé propojované síti je použit stejný rozsah adres (typicky se to stává u obligátního rozsahu 192.168.1.0/24, nověji u LAN sítí za DSL routery, které hodně často používají sítě 10.0.0.0/24), budete muset použít netriviální „doplněk“ ve formě NATu na rozhraních TAP/TUN, případně v některé síti změnit rozsah adres. Proto zmiňuji tento „gotcha“ hned na úvod, abych vám ulehčil debugování a hledání důvodu „proč ten krám pitomej nefunguje.“
Pro jednoduchost nebudeme uvažovat implementaci bridgingu mezi LAN rozhraním a VPN rozhraním. Pokud máte zájem o takové nastavení, odkážu vás na web OpenVPN, kde je tato problematika popsána a rozebrána.

2. Konfigurace serveru

V této kapitole budou rozebrány kroky potřebné pro plnou funkčnost serveru.

2.1 Instalace softwaru

Rád bych ještě nejprve upozornil méně zkušené uživatele na vhodnost použití nativního balíčkovacího/portage systému, který nabízí většina linuxových i BSD distribucí. Pomocí něj by neměl být problém nainstalovat veškeré zde zmíněné softwary. Pokud mohu doporučit, obecně je vhodné instalovat balíčky jednotlivě a nespoléhat se na závislosti. Postup instalace je následovný:

# nainstalujte OpenSSL
# nainstalujte OpenVPN

Ve Windows bych doporučil stažení OpenVPN s GUI, viz openvpn.se . Jeho nastavení pro použití pod neprivilegovaným účtem se pak budu věnovat ve speciální kapitole.

2.2 Generujeme certifikáty serveru (a klienta)

OpenVPN má celkem jednoduchý systém vytváření certifikátů a klíčů. Nachází se (většinou) v adresáři etc/openvpn/easy-rsa (ale viděl jsem jej i v /usr/share/ - nezbývá než hledat). Zde jsou nachystány skripty, které vám ušetří seznámení s OpenSSL. Předkládám postup výroby kořenových certifikátů jako self-signed.

Nejprve editujte soubor vars, který definuje dobu platnosti certifikátů, defaultní hodnoty polí klíčů (tyto MUSÍ být vyplněny) atp. Následně proveďte tyto příkazy (v jejich rámci se systém bude dotazovat):

./vars
./clean-all
./build-ca

Tímto jsme vyčistili cílový adresář a vygenerovali novou certifikační autoritu. Pokračujeme vygenerováním certifikátu a klíčů serveru a prvního klienta:

./build-key-server mujserver 
./build-key FrantaVoprsalek  

Je třeba poznamenat, že před každým novým generováním certifikátů/klíčů v nové session shellu musí být zavedeny parametry ze souboru vars. To lze provést buď jeho spuštěním, nebo, používáte-li např. Midnight Commander (který pro jednotlivé příkazy vytvoří vždy nové prostředí shellu), uvedením následujícího:

source ./vars ./build-key FrantaVoprsalek  

Poslední „standardní“ komponentou je Diffie-Hellman parameters file, ten vygenerujete pomocí

./build-dh 

Pro zajištění vyšší bezpečnosti komunikace (služba VPN by z meritu věci měla být dosažitelná odkudkoli, ale pak hrozí nebezpečí přinejmenším DoS útoku) je vhodné zajistit „předověření“ spojujícího se klienta, protože během negociace VPN připojení je v komunikačním kanále sděleno velmi mnoho relativně citlivých informací, které může potenciální útočník zneužít. Navíc negociace spojení a ověření klíčů je pro server relativně náročná úloha. Proto OpenVPN obsahuje nástroj TLS-Auth, kterým je (relativně nenákladně z pohledu výkonu serveru) na základě statického klíče ověřeno, zda je navazované spojení legitimní.

Klíč se vygeneruje pomocí příkazu

openvpn --genkey --secret ta.key

Uložte jej k ostatním klíčům, pokud jste změnili adresář jinam než ke klíčům.

2.3 Konfigurační soubor serveru

Konfigurace serveru je většinou uložena v adresáři /etc/openvpn, neměl by tam chybět předpřipravený „slepý“ konfigurační soubor openvpn.conf. Zde je komentovaný výpis našeho konfiguračního souboru:

#definujeme rezim cinnosti
mode server
tls-server
#definujeme typ rozhrani
dev tap

#definice IP konfigurace serveru. Server, pokud neni vyslovne
#uvedeno v kofiguraci jinak, si vezme prvni IP adresu z rozsahu
#tyto adresy budou pouzity ve virtualni LAN VPN
server 10.123.1.0 255.255.255.0

#definujeme “pamatovaka” – server si bude pamatovat klienty
#a pridelovat jim stale stejne IP adresy
ifconfig-pool-persist ip_pool.txt

#Klice systemu
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/mujserver.crt
key /etc/openvpn/easy-rsa/keys/mujserver.key
dh /etc/openvpn/easy-rsa/keys/dh1024.pem

#TLS autentikace pred samotnym spojenim pro osetreni DoS utoku
tls-auth ta.key 0

#umisteni a zpusob logovani
log-append /var/log/openvpn
status /var/run/openvpn/vpn.status 10

#Posilame klientovi DHCP udaje. Predpoklad: DNS a NTP server bezi na VPN
#serveru. Pokud to neni pravda, je treba zadat funkcni DNS server
push "redirect-gateway"
push "dhcp-option DNS 10.123.1.1"
push "dhcp-option DOMAIN mojedomena.cz"
push "dhcp-option NTP 10.123.1.1"

#Snizeni privilegii
user nobody
group nobody

#Nastaveni komprese toku dat, miry “ukecanosti” logu a IP parametru spojeni
comp-lzo
verb 3
keepalive 10 120

Nyní nezbývá, než server spustit. Měl by mít automaticky vytvořen spouštěcí skript někde v init.d adresáři v /etc – toto je odlišné u každé distribuce a předpokládám základní znalosti vlastního systému.

2.4 Poslední úkony na serveru

Jakmile je server nastartován, nezapomeňte přidat odpovídající záznam do tabulky směrování! OpenVPN obsahuje podporu skriptů, které lze spouštět při definovaných akcích (např. spuštění služby), a tedy lze dodefinovat přidání cesty zde.

3. Konfigurace klienta

Konfigurace klienta je vzásadě jednoduchý proces. Stačí nainstalovat OpenVPN (postup je stejný jako v případě serveru). V případě, že klient je systém Windows, silně doporučuji použít OpenVPN GUI (viz. openvpn.se), který má vlastní instalátor. Nezapomeňte vypnout/upravit integrovaný firewall Windows pro toto spojení.
Pak už jen stačí do adresáře config nakopírovat tls-auth token, certifikáty (ca + uživatel), klíč (uživatele) a vytvořit konfigurační soubor (např. server.ovpn) do nějž promítneme veškeré ceritifkáty, klíče a nastavení:

# rezim client
client

# definujeme rozhrani TAP (stejne jako na serveru)
dev tap

# definujeme protokol
proto udp

# Zde zadejte adresu svého serveru
remote server.nekde.neco.tld 1194

# Pokud mate Dial-up, tohle je velmi dobry parametr :-)
resolv-retry infinite

# definujeme, ze není třeba navazat se k specifickemu lokalnimu portu
nobind

# Pro ne-Windows klienty muzete snizit po pripojeni privilegia
;user nobody
;group nobody

# Try to preserve some state across restarts.
persist-key
persist-tun

# If you are connecting through an
# HTTP proxy to reach the actual OpenVPN
# server, put the proxy server/IP and
# port number here.  See the man page
# if your proxy server requires
# authentication.
;http-proxy-retry # retry on connection failures
;http-proxy [proxy server] [proxy port #]

# bezdratove site velmi často opakuji nektere pakety. Workaround.
mute-replay-warnings

# SSL/TLS nastaveni. certifikat serveru/autority a certifikat a klic klienta
ca ca.crt
cert FrantaVoprsalek.crt
key FrantaVoprsalek.key

# Verify server certificate by checking
# that the certicate has the nsCertType
# field set to "server".  This is an
# important precaution to protect against
# a potential attack discussed here:
#  http://openvpn.net/howto.html#mitm
#
# To use this feature, you will need to generate
# your server certificates with the nsCertType
# field set to "server".  The build-key-server
# script in the easy-rsa folder will do this.
ns-cert-type server

# TLS autentikace na strane klienta
tls-auth ta.key 1

# Komprese datoveho toku
comp-lzo

# Mira ukecanosti logu
verb 3

4. Nastavení OpenVPN GUI klienta ve Windows pro neprivilegovaného uživatele

Jakožto zastánce práce se systémy Windows výlučně pod neprivilegovanými účty jsem byl konfrontován s faktem, že OpenVPN GUI pod neprivilegovaným účtem neběží. Bylo proto nutné najít řešení, jak tento problém eliminovat. Jediná možnost, jak povolit neadministrátorům aktivovat nové síťové rozhraní je nainstalovat OpenVPN GUI jako službu. Základní kámen úrazu tkví v tom, že její start je výlučně v moci správců lokálního PC. Proto je třeba nastavit privilegia pro spouštění této služby. Toho lze dosáhnout např. pomocí nástroje subinacl (ten lze stáhnout ze stránek Microsoftu, je součástí NT resource kitu.

Příkaz pro změnu oprávnění spouštění služby je následující:

subinacl /SERVICE "OpenVPNService" /GRANT=users=TO

dále je pak nutno nastavit OpenVPN do režimu služby (pozor v případě, že jste instalovali klienta jinam, než do defaultní cesty):

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\OpenVPN-GUI]
@="C:\\Program Files\\OpenVPN"
"config_dir"="C:\\Program Files\\OpenVPN\\config"
"config_ext"="ovpn"
"exe_path"="C:\\Program Files\\OpenVPN\\bin\\openvpn.exe"
"log_dir"="C:\\Program Files\\OpenVPN\\log"
"priority"="NORMAL_PRIORITY_CLASS"
"log_append"="0"
"allow_edit"="1"
"allow_service"="1"
"allow_proxy"="1"
"allow_password"="1"
"service_only"="1"
"log_viewer"="C:\\WINDOWS\\notepad.exe"
"passphrase_attempts"="3"
"editor"="C:\\WINDOWS\\notepad.exe"
"connectscript_timeout"="15"
"disconnectscript_timeout"="10"
"preconnectscript_timeout "="10"
"silent_connection"="0"
"show_balloon"="1"
"show_script_window"="1"
"disconnect_on_suspend"="1" 

Kompletní soubor BAT a registry, které zajistí potřebné nastavení, můžete stáhnout zde: Open VPN as service

Spuštění vlastní VPN pak už proběhne jednoduchým kliknutím na ikonku v trayi a volbou „connect“ v daném menu spojení.

5. Závěr

Služba OpenVPN je vynikající nástroj, jehož použití je téměř univerzální. Díky standardnímu přístupu k síťovým rozhraním umožňuje správci filtrovat komunikaci z VPN pomocí firewallových pravidel (typicky se používá netfilter/iptables, případně ipfw), takže lze významným způsobem eliminovat případná bezpečnostní rizika. Pro kompletní popis konfiguračních parametrů doporučuji navštívit web autorů.

Pro masivnější nasazení certifikátů doporučuji windowsovský GUI program na generování požadavků na certifikaci, tento nástroj umožní lepší automatizaci ve větších firmách a přenos významné části procesu na uživatele. - viz. odkaz č. 3.

Odkazy na stažení a dokumentaci

(1) Domovská stránka OpenVPN – openvpn.net
(2) OpenVPN pro Windows s GUI – openvpn.se
(3) MyCertificate Wizard pro Windows – mycert
(4) Nástroj pro zprovoznění OpenVPN GUI pod neprivilegovaným uživatelem – Open VPN as service
(5) MSI installer pro SubinACL – http://www.microsoft.com/downloads/details.aspx?Fa m ilyID=e8ba3e56-d8fe-4a91-93cf-ed6985e3927b&display l ang=en

Předmět Autor Datum
dik za super clanok. davam si ho do oblubenych. :-)
IgorK 31.10.2006 10:59
IgorK
Excellent 8-) BTW tenhlencten OpenVPN klient je asi pěkně prasácky napsaný...
Vladimir 31.10.2006 13:11
Vladimir
Pekny clanek.:beer: stavime-vpn-cipe Stavime VPN cipe. :-D:-D
MaSo 31.10.2006 15:22
MaSo
díky, pánové.. :-)
touchwood 31.10.2006 17:48
touchwood
Jakmile je server nastartován, nezapomeňte přidat odpovídající záznam do tabulky směrování! OpenVPN…
siberian 01.11.2006 00:23
siberian
Windows si routu (alespoň do LAN subnetu) IMHO přidají samy. u směrování je ten problém, že všechny…
touchwood 01.11.2006 07:13
touchwood
O syntaxi nastavení tabulky nejde. Od toho je jak říkáš nápověda. Nemohl bys mi to zkusit vysvětlit…
siberian 01.11.2006 19:24
siberian
stačí ti to takto? [http://img180.imageshack.us/img180/5912/routingvpns r1.png] Více "akcí" netřeb…
touchwood 01.11.2006 20:55
touchwood
Nevím. :-) U klienta VPN asi už bude trasa 10.0.0.0 255.255.255.0 10.0.0.1 pro VPN, ale když budu ch…
siberian 01.11.2006 23:22
siberian
ehm. To je přesně to, o čem jsem mluvil. ;-)Musíš si uvědomit, jak funguje routování. Jako základní…
touchwood 02.11.2006 07:21
touchwood
Ale pokud nastavím u klienta výchozí bránu VPN server, tak přes něj bude chodit např. i internetový…
siberian 02.11.2006 18:48
siberian
a to je správně. VPN, kde klienti mají možnost komunikovat "mimo" VPN kanál je do značné míry nebezp…
touchwood 02.11.2006 20:07
touchwood
Používali jsme VPN ke hraní her a stahování souborů mezi sebou a mezi tím jsme třeba byli na netu, t…
siberian 02.11.2006 21:25
siberian
jak říkám -- pak si musíš udělat routes podle toho, co kam chceš směrovat. Je to v zásadě triviální,…
touchwood 02.11.2006 21:50
touchwood
nastavil jsem vpn podle infa od admina, připojení se vytvořilo, na routeru jsem nastavil forward por…
tomtom87 14.07.2016 16:50
tomtom87
Vpn je dobrá.Ale když budou chtít tak vás vystopují a nahlási adresu IP.Vcelku zbytečné ptal jsem se… poslední
MX 27.03.2019 14:55
MX

Jakmile je server nastartován, nezapomeňte přidat odpovídající záznam do tabulky směrování! OpenVPN obsahuje podporu skriptů, které lze spouštět při definovaných akcích (např. spuštění služby), a tedy lze dodefinovat přidání cesty zde.

Tak na tohle jsem byl nejvíce zvědavý, ale z tohoto malého odstavce nejsem o moc chytřejší. Kdybych například dělal server na své Windows XP stanici, tak bych musel nějak upravit směrovací tabulku, tu co má přímo windows? Třeba příkazem route v "CMD tabulce ;-)"? Nemohl bys prosímtě uvést nějaký příklad. I kdyby se to dělalo takhle, tak bych si asi s tím nejvěděl příliš rady.

Windows si routu (alespoň do LAN subnetu) IMHO přidají samy.

u směrování je ten problém, že všechny OS mají syntaxi příkazu na modifikaci směrování jinou, a to dost podstatně. Ve windows ti doporučím následující: zapiš v "CMD tabulce" :-D samotný příkaz, vyjede ti docela pěkná nápověda i s příklady.

např.

route ADD 10.123.1.0 MASK 255.255.255.0  10.123.1.1

Bohužel pro správné nastavení je třeba o směrování alespoň něco trošku vědět. (Apropos, další námět na článek.. :-))

O syntaxi nastavení tabulky nejde. Od toho je jak říkáš nápověda. Nemohl bys mi to zkusit vysvětlit na jednoduchém příkladu? Třeba, že server použije síťovou adresu 10.0.0.x pro VPN rozhraní a pro LAN má např. 192.168.0.x Klient má tedy stejnou síťovou VPN adresu jako server. Co bych pak musel zadat do směrovací tabulky, aby klient mohl komunikovat s LAN síti na straně serveru, tedy s počítači na 192.168.0.x adrese? To se musí upravit i nějak směrovací tabulka asi u něj že? Mohl bys mi prosímtě napsat, jak bys to udělal?

ehm. To je přesně to, o čem jsem mluvil. ;-)Musíš si uvědomit, jak funguje routování. Jako základní pravidlo platí: hostitel, který odesílá paket do vlastního subnetu, odesílá jej přímo. Pokud cíl není ve vlastním subnetu, použije se routovací tabulka. Pokud v tabulce není příslušný záznam, použije se výchozí brána, která pak musí zařídit vše potřebné a musí vědět, kam paket předat. Pokud máš tedy paket pro hostitele v síti 192.168.0.0, stačí jej předat výchozí bráně, a protože tato brána "ví" (je přímý člen cílového subnetu), kde ta síť je, nemusíš se starat o výslovné uvedení dalšího záznamu směrování (většinou dokonce ani na routeru).

a to je správně. VPN, kde klienti mají možnost komunikovat "mimo" VPN kanál je do značné míry nebezpečná záležitost. Pokud chceš pracovat se vzdálenou sítí, měl bys veškerou komunikaci směrovat do této sítě. Když se podíváš na komerční řešení VPN (Cisco, Nortel, apod.), zjistíš, že to mají udělané (a hlavně v reále implementované) právě takto.

Ono ostatně je to celkem logické, ve VPN máš zcela jiné DNS (s možností dosáhnout např. intranetových webových portálů).

Samozřejmě to lze nakonfigurovat tak jak píšeš, ale opravdu nechápu účel takového nastavení. Vidím v tom jen potenciální bezpečnostní rizika (např. to, že PC ovladáné přes bota napojeného na IRC se připojí k VPN koncentrátoru bez toho, že se přeruší spojení s řídicím kanálem IRC, že se obchází nastavení firewallu na straně VPN serveru atp. atd.)

edit: VPN je nástroj původem ryze pracovní a většinou, s výjimkou propojení 2 sítí, není permanentního charakteru. Očekávat "nadstandardní podporu brouzdání" je IMHO tak trochu zcestné - účel je jiný, a je popsán v článku. Když chceš brouzdat, tak přece VPN aktivní mít nepotřebuješ...

jak říkám -- pak si musíš udělat routes podle toho, co kam chceš směrovat. Je to v zásadě triviální, jednoduše necháš default ven ke svému ISP a ostatní subnety, které chceš tlačit do VPN si naroutuješ ručně.

nastavil jsem vpn podle infa od admina, připojení se vytvořilo, na routeru jsem nastavil forward portu 1194, ale stále se nemohu dostat na vzdálené stroje ani aplikace, které na nich běží. Co dělám špatně?

Zpět na články Přidat komentář k článku Nahoru