OpenVPN pro mírně pokročilé
8.12.2015 Zdroj: Root.cz
Generoval jsem klíče na jedné 10 let staré instalaci OpenVPN a přemýšlel jsem při tom, kolik toho mezitím umí nového a přitom je často používána tím deset let starým způsobem. Je možné, že o některých nových vlastnostech vůbec nevíte, nebo jste se je báli použít. Možná vás pár novinek zaujme.
První je moje oblíbené vkládání klíčů přímo do konfiguračního souboru. Tím dosáhneme toho, že uživatel dostává jeden jediný soubor (typicky s příponou .ovpn) a může se připojit velmi jednoduše bez vymýšlení, kam soubor dal, a jestli není potřeba nastavit nějaké cesty k ostatním souborům. Syntaxe je následující:
<ca>
-----BEGIN CERTIFICATE-----
.......
-----END CERTIFICATE-----
</ca>
<cert>
-----BEGIN CERTIFICATE-----
....
-----END
CERTIFICATE-----
</cert>
<key>
-----BEGIN PRIVATE KEY-----
.....
-----END PRIVATE KEY-----
</key>
Jinak řečeno místo parametrů ca, cert a
key, které odkazují na soubory vložíte obsah souboru přímo do konfiguračního
souboru OpenVPN. Zvláště pro uživatele na Microsoft Windows je to velké
zjednodušení.
Není problém tyto parametry různě kombinovat, pokud např. chcete mít privátní klíč lépe chráněný v zvláštním souboru a nebo pokud vložíte do konfiguračního souboru jen certifikát certifikační autority a necháte v souborech klíče uživatelů. Podporovány jsou následující parametry: ca, cert, dh, extra-certs, key, pkcs12, secret a tls-auth.
Když zmiňuji Microsoft Windows, tam můžete klíče uživatelů vložit do systémového úložiště certifikátů, které je přeci jen chráněno lépe než soubory na disku a certifikát odkázat z konfiguračního souboru pomocí jeho otisku a nebo jména následujícím způsobem:
cryptoapicert "THUMB:<cert_thumb>"
nebo
cryptoapicert "SUBJ:<cert_subject>"
Hodnotu pro THUMB lze získat asi jen po
importu certifikátu do úložiště a zobrazení jeho vlastností (v češtině se
položka jmenuje „Kryptografický otisk“). Pokud použijeme SUBJ, je situace
jednodušší. Ten si můžeme zobrazit přes příkaz openssl:
$ openssl x509 -in certifikat.crt -noout -subject
Lomítka a názvy položek ve
výpise nahradit čárkami, např.:
/C=CZ/ST=Czech Republic/L=Prague/O=Root.cz/CN=root1
převedeme na
CZ, Czech Republic, Prague, Root.cz, root1
a do konfiguračního souboru tedy
vložíme
cryptoapicert "SUBJ:CZ, Czech Republic, Prague, Root.cz, root1"
Dodatek: Jak správně podotkl Ind v diskuzi pod článkem, THUMB lze zjistit i bez klikání následujícím způsobem:
$ openssl x509 -sha1 -fingerprint -in cert.pem \
-out /dev/null | sed 's/:/
/g' | tr '[:upper:]' '[:lower:]'
Jedná se o SHA1 otisk zbavený dvojteček a
převedený na malé znaky.
Další konfigurační volba připomínající HTML tag se používá pro sdružování parametrů pro spojení s vzdáleným serverem. Můžeme totiž narazit na sítě, které blokují různé porty a tak si připravíme na straně serveru více OpenVPN démonů s různými konfiguracemi. A uživatele pak vyšleme do světa s konfiguračním souborem, který umí všechna připojení najednou a postupně je vyzkouší, dokud spojení neproběhne úspěšně. Může to vypadat např. takto:
<connection>
remote vpn.firma.cz 1194 udp
</connection>
<connection>
remote vpn.firma.cz 443 tcp
</connection>
<connection>
remote 1.1.1.1 443 tcp
</connection>
V tomto případě se
použije v první řadě klasické spojení na port 1194 protokolem udp, pokud není
úspěšné, tak se zkusí port pro https a tcp spojení a na závěr se pro klienty,
kteří nemají přístup k DNS zkusíme spojit na IP adresu naší brány bez použití
DNS. Vždy je ale dobré tam mít jako preferovanou variantu s použitím DNS,
protože pokud přestěhujete VPN server, nebudete muset hned obíhat všechny
klienty a odpadnou vám jen ti, kteří se z nějakého důvodu spojují přímo na IP
adresu.
Na závěr snad ještě osobní zkušenost, OpenVPN už umí IPv6 a opravdu to funguje. Jen krátká ukázka konfigurace:
tun-ipv6
server-ipv6 2a01:ffff:aaaa:bbbb::/64
push "route-ipv6 2000::/3"
push "tun-ipv6"
Routu 2000::/3 klientům posílám, protože jsou často v síti,
kde IPv6 nefunguje na 100 %, takže je lepší jim stáhnout všechen IPv6 provoz do
tunelu. Je to obdobné řešení jako redirect-gateway pro IPv4 provoz.