OpenVPN


Aktualizovaná verze článku o konfiguraci OpenVPN je k nalezení na BCVlogu: OpenVPN – propojení kanceláře a počítačů v terénu.


OpenVPN je jednoduše použitelná, robusní a velmi konfigurovatelná implementace VPN umožňující bezpečně propojit dvě a více sítí. Komunikace přez OpenVPN je šifrována pomocí SSL.

Projekt OpenVPN je Open Source a je šířen pod licensí GNU/GPL

Popis instalace a nastavení OpenVPN píšu vzhledem k OS Linux, ale podporované operační systémy jsou i MS Windows 2000/XP, MacOS X, OpenBSD, FreeBSD NetBSD a také Solaris. Kompletní výpis vlastností OpenVPN je k nalezení na stránkách projektu.

Instalace

Download

OpenVPN je ke stažení na adrese prdownloads.sourceforge.net/openvpn/, použil jsem verzi 2.0_beta10 a přeložil jsem si ji ze zdrových souborů. Aplikace závisí na knihovně LZO (dá se skompilovat i bez ní, ale proč se ochuzovat o kompresi?) a také potřebujete halvičkové soubory OpenSSL.

Kompilace

Zkompilujte a nainstalujte knihovnu LZO (klasika: ./configure --prefix=/usr && make && checkinstall), poté spusťte jako uživatel root ldconfig.

Překlad OpenVPN je také velmi jednoduchý:

tar -xjf openvpn-2.0_beta10.tar.gz
cd openvpn-2.0_beta10
./configure --prefix=/usr
make
checkinstall

Před tím než nainstalujete do systému balíček vytvořený checkinstallem, otestujte funkčnost šifrování (pořád jsme v adresáři se zdrojovýmy kódy OpenVPN):

./openvpn --genkey --secret key
./openvpn --test-crypto --secret key

Dál otestujeme navázání spojení pomocí TLS/SSL:

V jednom terminálu spustíme:

./openvpn --config sample-config-files/loopback-client

V druhém terminlu spustíme:

./openvpn --config sample-config-files/loopback-server

tun/tap

OpenVPN spoužívá pro komunikaci virtuální síťové zařízení tun nebo tap.

Podpora pro tun/tap je v linuxu součástí jádra, pokud používáte jádro z distribuce tak není co řešit. Pokud si překládáte jádro sami, nezapomeňte volbu(pro jádro řady 2.6):

Device Drivers --->
    Networking support  --->
        <M>   Universal TUN/TAP device driver support

Minimálně v distribuci Slackware budete muset vyrobit vyrobit zařízení /dev/net/tun:

mknod /dev/net/tun c 10 200

a nahrád modul zpřístupňující funkce tun do jádra:

modprobe tun

Nastavení

Firewall

Nastavte si maškarádu a povolte forward paketu.

Tunel bez zabezpečení

Tento tunel není nijak zabezpečen, komunikace probíhá protokolem UDP na portu 5000.

Na serveru 1 spusťte:

openvpn --remote server2.cz --dev tun1\
 --ifconfig 192.168.2.1 192.168.2.2 --verb 9

Na serveru 2 spusťte:

openvpn --remote server1.cz --dev tun1\
 --ifconfig 192.168.2.2 192.168.2.1 --verb 9

Funkčnost otestujete pomocí pingu na druhou stranu tunelu:

server 1: ping 192.168.2.2
server 2: ping 192.168.2.1

Tunel zabezpečený pevným klíčem

Nejdřív si vygenerujeme klíč, kterým zabezpečíme spojení:

openvpn --genkey --secret klic.key

Klíč musíte mít na obou počítačích na kterých končí tunel, přenos klíče by měl probbí9hat nějakým bezpečným způsobem.

První počítač:

openvpn --remote server2.cz --dev tun1 \
--ifconfig 192.168.2.1 192.168.2.2 --verb 5 --secret klic.key

Druhý počítač:

openvpn --remote server1.cz --dev tun1 \
--ifconfig 192.168.2.2 192.168.2.1 --verb 5 --secret klic.key

TLS/SSL

Předchozí varianty jsem popsal abych ukázal žejsou možné a funkční, ale nějak jsem pro ně nenašel vhodné využití. Protože trochu cestuji a chci se připojovat z notebooka z libovolného místa a chci to mít bezpečné, používám TLS/SSL.

SSL certifikáty

Pro to abysme mohli používat následující nastavení potřebujeme SSL certifikáty a klíče podepsane od jedné CA. Balíček OpenVPN obsahuje skripty s jednoduchou CA (adresář easy-rsa/), kterou použijeme.

V adresáři easy-rsa/ najdete soubor vars, který si musíte upravit v závislosti na tom kam jste si easy-rsa/ nakopírovali. Doporučuji abyste si přečetli README, ktere je v tom adresáři, je tam totiž kompletní popis výroby klíče.

Nastavení

Nastavení OpenVPN pro použití TLS/SSL mám v konfiguračních souborech, samozřejmě že to lze napsat jako prametry programu jako v minulých příkladech, ale to se mi moc nelíbí.

/etc/openvpn/

Všechny soubory, ktere zde budu popisovat jsou v adresáři /etc/openvpn, který má práva 700 a majitele uživatele root.

SSL certifikáty – Server

Na server si umístíme certifikát CA (ca.crt) a certifikát a klíč serveru (server.crt a server.key), které jsme si vygenerovali podle README v adresáři easy-rsa/, také bsyte neměli zapomenout na soubor dh1024.pem nebo dh2048.pem, záleží kterej jste si vyrobili.

server.conf

Tento soubor obsahuje nastaveni OpenVPN na straně serveru(pokud se kouknete do dokumentace k OpenVPN, zjistíte co která položka znamená.):

dev tun
ifconfig 192.168.2.1 192.168.2.2
up ./server.up
tls-server
dh dh2048.pem  
#nebo dh dh1024.pem
ca ca.crt
cert server.crt
key server.key
port 5000
comp-lzo
ping 15
ping-restart 45
ping-timer-rem
persist-tun
persist-key
verb 3

Parametry ifconfigu jsou ifconfig <lokalni IP> <vzdalena IP>, jsou to koncove adresy tunelu. Server běží na UDP portu 5000.

server.up

Soubor server.up je shell skript, přidává routu do VPNky.

route add -net 192.168.2.0 netmask 255.255.255.0 add gw $5
start.sh

start.sh je skript, který nahazuje VPNku, pro vypnutí VPN stačí killnout proces openvpn

#!/bin/bash
dir=/etc/openvpn
echo 1 > /proc/sys/net/ipv4/ip_forward
openvpn --cd $dir --daemon --config server.conf
SSL certifikáty – Klient

Na klientský počítač umístíme certifikát CA (ca.crt) a certifikát a klíč klienta (klient.crt a klient.key), které jsme si vygenerovali podle README v adresáři easy-rsa/.

klient.conf
dev tun
remote 147.32.119.186   # VPN server
ifconfig 192.168.2.2 192.168.2.1
up ./klient.up
tls-client
ca ca.crt
cert klient.crt
key klient.key
port 5000
#user nobody
#group nobody
comp-lzo
ping 15
ping-restart 45
ping-timer-rem
persist-tun
persist-key
verb 3
klient.up

Soubor klient.up je shell skript, který po nahození VPNky upravuje routovací tabulku klienta, musíte si napsat svůj v závislosti na vašich podmíkách na síti. Jako příklad zde ukážu svůj skript, kterým se připojuji když síťuji přez modem:

#!/bin/bash
route add 147.32.119.186 ppp0       # routa na VPN server
route del default                   # smažu výchozí gw
route add default gw 192.168.2.1    # vše budu routovat přez VPNku

V případě, že chcete všechen provoz tlačit přez VPNku, musíte přidt routovací pravidlo na VPN server.

start.sh

Jako klientský počítač mám notebook, který má vypnutý syslog a snažím se aby co nejméně zapisoval na disk. Proto mám /tmp přimountovaný jako tmpfs a OpenVPN nechavám logovat do souboru /tmp/openvpn.log

#!/bin/bash
dir=/etc/openvpn
modprobe tun
echo 1 > /proc/sys/net/ipv4/ip_forward
openvpn --log /tmp/openvpn.log --cd $dir --daemon --config klient.conf

19 thoughts on “OpenVPN

  • 2 dubna, 2009 at 12:45
    Permalink

    Zdravim. Mam problem s OpenVPN na nekterych systemech Windows. Specialne Windows XP. Pri stejne konfiguraci nekterym klientum OpenVPN funguje a nekterym to pise chybu TLS Error: TLS key negotiation failed. Dochazi k timeoutu.

    Pouzivam interface TAP a TCP komunikaci. Server nevyzaduje klientsky ceritfikat.

    Zde je cast konfigurace klienta:
    ———–
    proto tcp-client

    remote XXX.XXX.XXX.XXX 1194
    dev tap

    nobind

    persist-key

    tls-client

    ca ca.pem
    ns-cert-type server

    verb 3

    cipher AES-256-CBC

    auth SHA1

    pull

    auth-user-pass

    auth-nocache

    redirect-gateway
    ————-

    Neresil jste nekdo podobny problem s TLS na Windowsech?

  • 8 prosince, 2009 at 21:32
    Permalink

    Zdravím vás, vím že je plno napsaných návodů na openVPN a prošel jsem jich opravdu hodně ale nepodařilo se mi ani spustit server openVPN. Mohl by někdo napsat někdo opravdu jednoduchý polopatický návod na tuto VPN? Diky

  • 7 ledna, 2010 at 14:52
    Permalink

    Dobry den,

    Nastavil jsem openvpn aby jse authentifikovala vuci ldap pomocou user/heslo. Bohuzel uz ale nebere clienty, ktery chteji pouzit certifikat. Vyzaduje jenom user/heslo.
    Nevite jak mu rict aby to bral “cert neco username” ?

    Dekuju za radu

    plugin /usr/local/lib/openvpn-auth-ldap.so /etc/openvpn/auth_ldap.cfg
    client-cert-not-required
    username-as-common-name

Comments are closed.