OpenVPN snadno a rychle

8.12.2015 Zdroj: Root.cz

Obejít přísně nastavený firewall, dostat se ke službám uvnitř sítě, zabezpečit komunikaci nebo se na cestách dostat jednoduše k IPv6 konektivitě. K tomu všemu se může hodit vlastní VPN. Uživatelé se často OpenVPN bojí a považují jej za něco komplikovaného. Ukážeme si, že se to dá zvládnout za pár minut.
Pravděpodobně to znáte taky: na služební cestě dorazíte do hotelu, připojíte se ke krásné místní Wi-Fi síti, ale ouha: správce vám nechal jen porty 80 a 443 a nikam jinam než na web se nedostanete. Nezavoláte si pomocí VoIP, nefunguje vám IMAP ani nemáte možnost se připojit k SSH. Krajně nepříjemná situace, ale bohužel poměrně běžná. V mnoha firmách mají bezdrátovou síť pro hosty, která je z nepochopitelných důvodů nastavená úplně stejně. Pokud ale máte předem připravený přístup do VPN, máte vyhráno. Vytvoříte si tunel „domů“ a máte otevřené dveře kamkoliv.

Následující návod vás provede všemi potřebnými kroky při vytvoření OpenVPN serveru a připojení klientů v Linuxu a Androidu. Potřebovat budeme jen linuxový server (klidně OpenWRT router) s veřejnou IP adresou. Na něm si vygenerujeme certifikáty pro server a klienty, nastavíme OpenVPN server a umožníme připojení. Vše nám bude fungovat i v případě, že máme jen IPv4 nebo IPv6 konektivitu – VPN tunelem se budou z naší domovské sítě přenášet obě a budeme tak mít na koncovém zařízení dual-stack.

Certifikační autorita

OpenVPN používá pro autentizaci uživatelů TLS certifikáty. Na rozdíl od autentizace pomocí jména a hesla nemůže dojít k man-in-the-middle útoku, protože si klient ověří, zda se server prokazuje certifikátem vydaným správnou autoritou. Ověřovány jsou tedy obě strany a spojení je navázáno až po autentizaci serveru i klienta.

Generovat klíče, žádosti i certifikáty můžete samozřejmě ručně pomocí utility OpenSSL, ale existuje výrazně jednodušší cesta: součástí OpenVPN jsou skripty easy-rsa, které vše zjednoduší a zbaví vás povinnosti znát hromadu parametrů. Práce s generováním se omezí jen na spuštění jednoho příkazu. Pokud si OpenVPN instalujete přímo ze zdrojového souboru, jsou skripty už jeho součástí. V moderních distribucích je ale najdete v samostatném balíčku – má to tak Debian, Ubuntu i OpenWRT.

Následující kroky je možné provádět přímo na serveru nebo na libovolném jiném počítači, nezáleží na tom. Nejprve si skripty zkopírujeme ze systému do jiného adresáře. Tam budeme provádět všechny další změny a právě v tomto adresáři vznikne naše certifikační autorita.

$ cp -r /usr/share/easy-rsa /home/petr
Poznámka: V některých distribucích existuje skript make-cadir, kterému jen předáte v parametru cestu a on provede zkopírování za vás. Výsledek je ale stejný.

Poté je potřeba do nově vytvořeného adresáře vstoupit a editovat soubor vars, ve kterém se nacházejí proměnné definující parametry naší certifikační autority. Většinu obsahu můžeme nechat ve výchozím stavu, zásadní parametry jsou na konci:

export KEY_COUNTRY="CZ" # země
export KEY_PROVINCE="" # provincie
export KEY_CITY="Praha" # město
export KEY_ORG="Internet Info" # organizace
export KEY_EMAIL="redakce@root.cz" # mail
export KEY_OU="redakce Root.cz"
Doporučuji ještě věnovat pozornost proměnným CA_EXPIRE a KEY_EXPIRE, které definují počet dnů platnosti autority a jednotlivých certifikátů. Ve výchozím stavu je nastaveno 10 let. Poté už můžeme vygenerovat klíče a certifikáty své nové autority:

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

Generating a 2048 bit RSA private key
..........+++
..............+++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.

Protože jsme poctivě vyplnili odpovědi na všechny otázky do vars, můžeme na všechny následující dotazy prostě stisknout enter – bude jich celkem osm. Tím jsme vytvořili svou certifikační autoritu, v adresáři keys vznikly soubory ca.key s klíčem a ca.crt s certifikátem.

Certifikát serveru

Teď už to bude velmi jednoduché a přímočaré, k vygenerování certifikátu serveru bude stačit spustit další skript a předat mu jako parametr unikátní název serveru. Serverový certifikát se liší jen v jednom příznaku, který jej jako serverový označuje. To je podstatné kvůli zabránění MitM útoku – žádný klient se pak nemůže vydávat za váš server a unášet ostatním klientům spojení.

$ ./build-key-server mujserver
Generating a 2048 bit RSA private key
.....................................+++
.+++
writing new private key to 'mujserver.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.

Průběh je úplně stejný, jen se vás utilita na konci zeptá na heslo k certifikátu (můžete nechat prázdné) a chce potvrdit podepsání a uložení nového serverového certifikátu – dáte dvakrát yes a je hotovo. V adresáři keys opět vznikly soubory mujserver.key s klíčem a mujserver.crt s certifikátem.

Pro server ještě budete potřebovat vygenerovat parametry pro výměnu klíčů algoritmem Diffie-Hellman. Opět stačí jediný příkaz:

$ ./build-dh
Generování trvá pár desítek sekund, ale je potřeba ho udělat jen jednou. Výsledkem je soubor dh2048.pem v adresáři keys.

Certifikáty pro klienty

Každý klient, který se bude chtít k naší VPN připojit, bude potřebovat vlastní certifikát. Nedoporučuji mít jeden certifikát na více klientech, přijdete o možnost autorizace jednotlivých klientů a revokaci ztracených certifikátů. Pro generování stačí spustit správný skript a opět mu předat unikátní jméno klienta:

$ ./build-key notebook
Opět jen mačkáme enter a na konci dvakrát odpovíme yes. Proces je úplně stejný jako u serverového certifikátu, tento je ale označen jako klientský. Postup zopakujeme pro každého klienta. Pokud chceme, aby klient při připojování vždy zadával heslo ke svému privátnímu klíči, použijeme pro generování skript build-key-pass.

Konfigurace serveru

Na serveru musí být přítomné soubory dh2048.pem, ca.crt, mujserver.crt a mujserver.key. Nahrajeme si je do adresáře /etc/openvpn. Pomocí svého certifikátu bude server prokazovat klientům identitu a tu jejich zase ověří pomocí certifikátu důvěryhodné autority.

Poté založíme soubor /etc/openvpn/server.conf a do něj vložíme konfiguraci podobné té následující:

; pro správné zacházení s UDP provozem
multihome
; udržet zařízení a klíče v paměti při restartu
persist-key
persist-tun
; soubory s certifikáty a klíčem
ca /etc/openvpn/ca.crt
cert /etc/openvpn/mujserver.crt
key /etc/openvpn/mujserver.key
dh /etc/openvpn/dh2048.pem
; název síťového rozhraní - měl by začínat na tun
dev tunvpn
; udržování spojení se serverem - každou sekundu,
; restart po pěti sekundách nedostupnosti
keepalive 1 5
; standardní port
port 1194
; použitý protokol udp6 podporuje spojení po IPv6 i po IPv4
; ve vývojové verzi je třeba nahradit prostým udp
proto udp6
; úspornější přidělování adres VPN klientům
topology subnet
; rozsah adres pro VPN - první adresu obsadí server, ostatní klienti
server 192.168.222.0 255.255.255.0
server-ipv6 2001:db8:beef::1/64
; soubor se stavem serveru
status /tmp/openvpn-status.log
; seznam přidělených adres klientům
ifconfig-pool-persist /tmp/ipp.txt
verb 3
; volby pro klienta - přesměrování provozu do VPN, vnucení DNS serveru
push redirect-gateway def1 ipv6
push dhcp-option DNS 192.168.222.1
push dhcp-option DNS 2001:db8:beef::1
Zásadní jsou pro nás části definující cestu k souborům s certifikáty, klíčem a parametry DH. Dále je potřeba zvolit vhodné nastavení adres přidělovaných ve VPN. Ty nesmí kolidovat s adresami ve skutečné síti. Vysvětlení všech parametrů naleznete v dokumentaci OpenVPN. Po uložení konfigurace stačí server zapnout a on je připraven přijímat jednotlivé klienty.

Konfigurace klienta

Nastavení klienta je velmi podobné, můžete ho využít jak v OpenVPN v Linuxu, tak i například v klientovi pro Android. Do něj je možné textovou konfiguraci přímo importovat.

;přepne chování do režimu klienta
client
;jméno serveru - může jich být víc
remote vpn.example.com 1194
; jméno a typ síťového rozhraní OpenVPN
dev tunvpn
dev-type tun
proto udp6

; opakované překládání doménového jména serveru
resolv-retry infinite
; náhodná volba serveru
remote-random

; použití dynamického čísla portu pro VPN tunel
nobind
; zachování privátního klíče při restartu
persist-key
; kontrola typu serverového certifikátu
ns-cert-type server
verb 3
ca /etc/openvpn/ca.crt
cert /etc/openvpn/notebook.crt
key /etc/openvpn/notebook.key
; omezení rychlosti (pro případ zacyklení)
shaper 1000000
Pro lepší manipulaci s konfigurací je možné vložit certifikáty a klíče přímo do souboru. K tomu slouží tagy <ca>, <cert> a <key>. Nebudeme tak muset do klienta (nebo serveru) přenášet čtyři soubory, ale pouze jeden. Do konfiguračního souboru místo odkazů na soubory vložíte následující část:

<ca>
-----BEGIN CERTIFICATE-----
MIIEUTCCAzmgAwIBAgIJAKiBl+gfWDbrMA0GCSqGSIb3DQEBCwUAMHgxCzAJBgNV
qpBI2JaWXfUGBm3GgXFdr2v1i8Zgdlw+nsu40Djv+W3oy55wCCvtU5aggivPed0n
LLbKRHs=
(zkráceno)
-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE-----
MIIEqzCCA5OgAwIBAgIBAzANBgkqhkiG9w0BAQsFADB4MQswCQYDVQQGEwJDWjEO
EXPHvHEwoWzu4J7oIMzhdJO4N2fDP7dfJ7rxtylr/DfiIH5hSr1Wqmua/5YilRM=
(zkráceno)
-----END CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDBi9f5OT2Dl8KC
z4HM3VdlhTxwu0ZjakbPpK/F/+S/hQxHxdoB+cY1rCJBQ6yrsRdbS0y+Aosh1keW
p+qoskNweGKS701k7MgtGwi9
(zkráceno)
-----END PRIVATE KEY-----
</key>
Pokud máme vše nadefinováno, stačí na klientské straně také spustit OpenVPN a dojde k propojení obou stran do jedné VPN sítě.