OpenVPN



OBSAH


Úvodem
Instalace
Config server
Vygenerování certifikátů
Instalace klientů
Config klient
Spojení 2 serverů
Revoke certifikatu
Užitečnosti

Úvodem
VPN vám dovoluje z jakéhokoliv místa kde je internet se bezpečně připojit na firemní sít´. Případně spojit několik vzdálených sítí mezi sebou.

Vysvětlení pojmů bridging versus routing.
Vpn spojení je tvořeno pomocí virtuálního rozhraní TUN/TAP. Rozdíl mezi nimi spočívá v tom, že TAP funguje na 2 vrstvě (směruje pomocí MAC adresy, ethernetové rámce ) a TUN funguje na 3 vrstvě (směruje pomocí IP adresy, IP paketů).

Bezpečnost
V první řadě je třeba mít jistotu,že uživatel,kterému poskytnete přístup do vaší sítě používá nějaký antivir a není to nějaký pako co nainstaluje na počítač kdejakou ptákovinu. Protože mu poskytujete přístup přímo do firemní sítě se všemy důsledky. Dále je třeba používat šifrované spojení, protože jen blázen dnes něco posílá internetem nešifrovaně. Proto jsou vygenerovány certifikáty. pro uživatele co pobíhají s notebookem po světě ještě není od věci používat šifrovaný certifikát. Pokud by někdo ten notebook ukrad, tak se alespon nedostane dovnitř do firemní sítě a nemůže tu napáchat nějaké škody.



Instalace
cd /usr/ports/security/openvpn
make install


neoznacovat PW_SAWE
[ ] PW_SAVE Interactive passwords may be read from a file


dokumentace je v less /usr/local/etc/rc.d/openvpn

nutne natahnout tap/tun modul nebo jadro zkompilovat s touto volbou
kldload if_tap

do /boot/loader.conf zapsat if_tap_load=”YES”

vytvoříme adresář pro VPN a přepneme se do něj
mkdir /usr/local/etc/openvpn
cd /usr/local/etc/openvpn


Nastavení spuštění po startu
ee /etc/rc.conf
openvpn_enable="YES"
openvpn_if="tun tap"
openvpn_configfile="/usr/local/etc/openvpn/openvpn.conf"
openvpn_dir="/usr/local/etc/openvpn"



Existují 2 způsoby použití Openvpn:
RoadWarrior- Připojení klientů k serveru
Tunel mezi dvema servery-spojení 2 sítí


RoadWarrior

konfig serveru

vytvoříme konfig
ee /usr/local/etc/openvpn/openvpn.conf



############## zacatek configu ##################
#co je jaka sit

#external ip: 1.2.3.4(192.168.0.5)
#internal ip: 10.0.1.1
#internal network: 10.0.0.0/24
#VPN pool: 10.0.1.0/24
#DNS server: 10.0.0.2
#routovani do site 192.168.0.0

###############################


local 192.168.0.5 #venkovni sit
port 1194 #port na kterem posloucha
proto udp #protokol UPD (muzete zamenit za TCP)
dev tun0 #virtualni zarizeni-muze jich byt vice s ruznymi konfiguraky

#klice
ca /usr/local/etc/openvpn/keys/ca.crt
cert /usr/local/etc/openvpn/keys/myserver.crt
key /usr/local/etc/openvpn/keys/myserver.key
dh /usr/local/etc/openvpn/keys/dh1024.pem


server 10.0.1.0 255.255.255.0 #rozsah pridelovanych adres
ifconfig-pool-persist ipp.txt # Zajisti aby VPN klienti dostavali porad stejnou VPN ip adresu
push "route 192.168.0.0 255.255.255.0" #site do kterych se bude routovat-muze jich byt vice
#push "dhcp-option DNS 10.0.0.2" #vnuti klientovi DNS server
keepalive 10 120 # pingy pro udrzeni NAT spojeni(kazdych 10sec,po 120sec bez odezvy ukonci spojeni)
#duplicate-cn #soucasne prihlaseni vice klientu se stejnym certifikatem
#pokud je ifconfig-pool-persist ipp.txt musi toto byt zakomentovane
cipher AES-256-CBC #sifrovaci metoda
auth SHA1 #autentifikacni metoda
comp-lzo #pouziti komprimace
user nobody #uzivatel pod kterym to pobezi
group nobody #skupina pod kterou to pobezi
persist-key
persist-tun
client-to-client # Pokud chcete videt i z klienta na klienta

#nahozeni a shozeni broadcastu
up ./bridge_up.sh
down ./bridge_down.sh


#logovani
log-append /var/log/openvpn.log
verb 3 #nastaveni vypisu v logach rozsah 1-11
status /var/log/openvpn.status 10 #kam OpenVPN pravidelne uklada svuj stav
mute 20

############## konec configu ################



skripty bridge_up.sh a bridge_down.sh.
TAP rozhraní umožňuje přenášet IP broadcasty. Notebook se třeba pomocí broadcastů zeptá na okolní počítace. Tento požadavek projde až do LAN sítě. Jeho odpověď musíme nějak dostat zpět do VPN. Proto dáme do bridge vnitřní síťovou kartu a tap0 zařízení. Vše co potom přijde na vnitřní síťovou kartu, je předáno i do tap zařízení. vr0 si změnte podle svojí sítovky.


ee bridge_up.sh
#!/bin/sh
ifconfig bridge0 create
ifconfig bridge0 addm vr0 addm tap0 up



ee bridge_down.sh
#!/bin/sh
ifconfig bridge0 destroy


nastavit executable


Direktivy serverového configu
mode standardně se použije point to point. Při použití "server" se jedná o multiklient mod
local 132.132.132.132 venkovní sít´ na které vpn naslouchá Je možno použít i resolvovatené jméno např server.doma.cz- v klientském configu musí být stejný
port 1194 port na kterém vpn naslouchá- v klientském configu musí být stejný
proto udp protokol jakým bude probíhat komunikace.Můžem použít tcp nebo udp. Většinou se používá udp pro větší výkon.
dev tun0 jaké zařízení použije pro komunikaci. Můžem použít tun nebo tap. Nezapomente uvést i číslo zařízení např. tap1
ca /usr/local/etc/openvpn/keys/ca.crt certifikát certifikační autority
cert /usr/local/etc/openvpn/keys/myserver.crt certifikát serveru
key /usr/local/etc/openvpn/keys/myserver.key klíč serveru
dh /usr/local/etc/openvpn/keys/dh1024.pem parametry pro Diffie-Hellman protokol
cipher AES-256-CBC šifrovací metoda
auth SHA1 aautentifikační metoda
duplicate-cn současné přihlášení více klientů se stejným certifikátem-pokud je ifconfig-pool-persist ipp.txt musí toto být zakomentované
server 10.0.1.0 255.255.255.0 určení virtuální sítě, server použije první adresu z rozsahu tj 10.0.1.1. používá se pro TUN zařízení
server-bridge 10.0.1.1 255.255.255.0 10.0.1.2 10.0.1.254 rozsah přidělovanych adres-vylučuje se s volbou server-zadává se rozsah od-do, pouze pro TAP
ifconfig-pool-persist ipp.txt Zajisti aby VPN klienti dostávali pořád stejnou VPN ip adresu
push "route 192.168.0.0 255.255.255.0" Sítě do kterých se bude routovat-muže jich být více-klient si toto nastavení stáhne directivou "pull"
push "route 10.0.10.0 255.255.255.0 10.0.11.1" prvni jsou IP site za serverem, maska, IP tap0-klient si toto nastavení stáhne directivou "pull"
push "dhcp-option DNS 10.0.10.1" nastavení pro klienta, použije tento DNS-klient si toto nastavení stáhne directivou "pull"
push "dhcp-option WINS 10.8.0.1" nastavení pro klienta, použije tento WINS-klient si toto nastavení stáhne directivou "pull"
route 192.168.0.0 255.255.255.0 informace pro server,aby používal i tuto sít´, primárně používá sít´uvedenou ve volbě server
client-config-dir ccd adresář s klientskými nastaveními. Nachází se v adresáři dle volby chroot. Soubory se jmenují podle klientského certifikátu tj pro klienta s certifikátem user123.key bude soubor user123.

Příklad voleb v tomto souboru:
# prideli klientovi pevnou IP adresu-Parametry jsou lokalni IP vzdalena IP,tj klient bude mít 192.168.12.5 a server 192.168.12.6
ifconfig-push 192.168.12.5 192.168.12.6
# tato adresa musi byt z rozsahu definovanom v direktive
# server anebo route
ifconfig-push 192.168.12.5 192.168.12.6
# zmena DNS serveru
push "dhcp-option DNS 192.168.10.40"
comp-lzo použití komprimace
user nobody uživatel s jehož právy to poběži
group nobody skupina s jehož právy to poběži
persist-key po redukci práv není proces schopen číst klíče-proto je použita tato volba a následující
persist-tun
client-to-client dovoluje vidět klienty mezi sebou, jinak je vidět jen server
max-clients 3 maximální počet uživatelů,kteří se mohou současně přihlásit
keepalive 10 120 pingy pro udržení NAT spojení(každých 10sec,po 120sec bez odezvy ukončí spojení
up ./bridge_up.sh spuštění scriptu pro nahození broadcastu
down ./bridge_down.sh spuštění scriptu pro shození broadcastu
chroot /usr/local/etc/openvpn/server/ server poběží v tomto adresáři
log-append /var/log/openvpn.log cesta k logu
verb 3 nastaveni vypisu v logach rozsah 1-11
status /var/log/openvpn.status 10 kam OpenVPN pravidelně ukládá svůj stav
mute 20 maximální počet podobných zpráv té samé kategorie


poznamka-
-pokud se bude připojovat windowsí klient a bude chtít přistupovat přes SMB na nějaké sdílené adresáře, raději to ani nezkoušet přímo z exploreru, ale použijte Total Commander nebo nějaký jiný file manager. Při komunikaci si totiž explorer začne číst tolik zbytečností, že se na kýžený výsledek (tzn. zobrazení seznamu souborů) pěkně načekáte.
vr0 si změnte podle svojí sítovky.

poznamka-pro verzi freebsd 5.4
ee /usr/local/etc/rc.d/openvpn.sh

protože je tam nějaká chybka,tak zpouštěcí script jen nahodí tap rozhraní. Použijte následující soubor z FreeBsd v6.3

Vložit následující text ZDE stáhni openvpn.sh

chmod 555 openvpn.sh


zkopírování souborů a scriptů pro generování certifikátů
cp /usr/local/share/doc/openvpn/easy-rsa/2.0/* /usr/local/etc/openvpn/

cd /usr/local/etc/openvpn


upravit soubor .vars

export KEY_COUNTRY="CZ"
export KEY_PROVINCE="Czech"
export KEY_CITY="Ceske Budejovice"
export KEY_ORG="server.key.cz"
export KEY_EMAIL="spravce@key.cz"


udelat zastupce pro bash
ln -s /usr/local/bin/bash /bin/bash

zavolat bash

bash
Pozor -defaultně není bash nainstalovaný, návod na instalaci je popsána v kapitole o Bashi

nastavit prava na spustení pro roota na /usr/local/etc/openvpn/whichopensslcnf , ./clean-all , ./build-dh , ./pkitool

poté spustíme scripty

source ./vars
./clean-all

tento generuje scripty
./build-dh

zapisuje privátní klíč do ca.key
./pkitool --initca

myserver nahradit jménem vašeho serveru- generuje privátní klíč www.dvorec.eu.key
./pkitool --server myserver

client1 nahradit jménem vašeho uživatele- generuje privátní klíč client1.key
./pkitool client1

stejné jako předtím, ale s heslem
./pkitool --pass client2

po skončení vypnout bash

exit


pokud budeme někdy v budoucnu chtít vygenerovat další certifikát
-spustíme bash
bash
-přepnem se do adresáře
cd /usr/local/etc/openvpn
-spustíme vars
source ./vars
-vygenerujeme certifikáty
./pkitool clientxyz



nastartování openvpn

pokud jsme nenatáhli modul již dříve
kldload if_tap

openvpn --config /usr/local/etc/openvpn/openvpn.conf

kontrola běhu
ps auwx|grep vtun
ps aux | grep vpn

nastavit routování (IP použijte podle toho jaký máte sítě)
route add -net 10.0.1.0/24 10.0.0.1


Nastavení klientů

klíče NUTNO na klienty nakopčit pomocí flash,cd,diskety(uff,kdo jí ještě má?) nebo pomocí scp
návod

klienta stáhneme jej z webu
http://openvpn.net/download_action.php?openvpn-2.1_rc4-install.exe





spustíme instalaci


klikneme na "Next"




odsouhlasíme licenci "I Agree"




necháme vše zafajfkované a klikneme na "Next"




cestu necháme a dáme "Install"




instalátor mimo jiné vytváří virtuální rozhraní




odsouhlasíme vytvoření zařízení(WXP sp2) "Pokračovat"




klikneme na "Next"




klikneme na "Finish"




spustíme GUI rozhraní(je možné to dát i do "Po spuštění pro automatický start).
Pokud by se z nějakého důvodu nevytvořilo TAP rozhraní nechá se zde vytvořit




dole na liště vám naskočí červená ikona



Nyní nastavíme konfigurační soubor a nakopírujeme certifikáty


Na woknech otevřeme složku C:\Program files\OpenVPN\config a nakopčíme tam certifikáty ze složky /usr/local/etc/openvpn/keys
ca.crt
client1.crt (název certifikátu bude takový jaký jste si zvolili-v Konfigu musíte mít stejný název,jinak to nebude fungovat)
client1.key (platí to samé jak u předcházející položky)


do stejné složky vytvoříme textový soubor client.ovpn

do něj nakopčíme tento text


client
#ve win bez cisla, v unixu s cislem(tap0)
dev tun

proto udp

#adresa serveru
remote 192.168.0.5 1194

#dulezite, dovoluje stahnout nastaveni od serveru
pull

tls-client # SSL klient
ca ca.crt
cert client1.crt
key client1.key
ns-cert-type server
auth SHA1
cipher aes-256-cbc
nobind
comp-lzo
persist-key
persist-tun
verb 3



Direktivy klientského configu
client říká,že jde o konfig pro klienta
remote 132.132.132.132 IP na které server vpn naslouchá. Je možno použít i resolvovatené jméno např server.doma.cz- v serverovám configu musí být stejný
port 1194 port na kterém vpn naslouchá- v serverovám configu musí být stejný
proto udp protokol jakým bude probíhat komunikace.Můžem použít tcp nebo udp. Většinou se používá udp pro větší výkon.
dev tun0 jaké zařízení použije pro komunikaci. Můžem použít tun nebo tap. Číslo zařízení např. tap1 je nutno uvest jen u unixových klientů
push přebírá direktivy ze serverového konfigu začínající push
ca ca.crt certifikát certifikační autority
cert votruba.crt certifikát klienta
key votruba.key klíč klienta
cipher AES-256-CBC šifrovací metoda
auth SHA1 aautentifikační metoda
ns-cert-type serverautorizace
resolv-retry infinitevhodné pro klienty používající notebook
comp-lzo použití komprimace
persist-key po redukci práv není proces schopen číst klíče-proto je použita tato volba a následující
persist-tun
verb 3 nastaveni vypisu v logach rozsah 0-11







klikneme na ikonu na liště pravým tlačítkem a dáme Connect




spojování se serverem-Na nic neklikejte




Bingo -jste připojeni k serveru
POZOR- pokud jste připojeni a na serveru je routování do sítě např. 192.168.0.0/24 a vy máte stanici také v síti 192.168.0.0/24, je třeba se nejdříve odpojit a pak se můžete připojovat zase ke stanicím ve vaší síti




odpojeni od serveru-prvým tlačítkem na ikonu a dát Disconnect





Tunel mezi dvema servery

osobně jsem to nezkoušel. Nicméně pan Tomáš Čierník byl tak laskavý, že mi poskytl jeho konfiguráky.
Proto jsou komentáře v libozvučné slovenštině.

konfig serveru A

vytvoříme konfig
ee openvpn.conf

# Tunnel options

# Prichadzajuce spojenie ocakava na adrese xxx,
# spojenie nadvazuje na adresu yyy,
# obidve spojenia su typu udp a na porte 1195
local xxx
remote yyy
proto udp
port 1195

# nazov zariadenia - pre udp spojenie je potrebne pouzit tun
# pre tcp spojenie tap
dev tun1

# kluc tls-auth musi byt na obidvoch stranach rovnaky,
# ale cislo uvedene za nim je na jednej strane 0, na druhej 1
# pouzitie tls-auth sluzi ako ochrana pred viacerymi typmi utokov,
# viac je popisane na http://openvpn.net/index.php/documentation/howto.html#security
tls-auth keys/ta.key 0

# "downgrade" privilegii po pripojeni, uzatvorenie procesu
# do jeho adresara
user nobody
group openvpn
chroot /etc/openvpn/

# ulozenie klucov do pamate - po pouziti user a group
# sa proces nemusi vediet dostat k tym na disku
persist-tun
persist-key

# cesta k logu a jeho ukecanost
log-append log/openvpn.log
verb 4
mute 20

# logovanie stavu pripojenia, aktualizuje sa kazdych 60 sekund
status log/status-openvpn.log 60

# zapina kompresiu
comp-lzo

# 192.168.1.1 je IP adresa tohoto VPN servera
# 192.168.1.2 je IP adresa druheho
# na druhej strane budu tieto IP adresy prehodene
ifconfig 192.168.1.1 192.168.2.2

# pridava cestu do LAN za druhym serverom
route 192.168.30.0 255.255.255.0


# TLS key negotiating options
# volba tls-server nemoze byt pouzita v obidvoch
# konfigurakoch - na druhej strane musi byt tls-client
tls-server

# dh2048.pem musi byt na oboch stranach rovnaky
# ostatne kluce musia byt rozne
# klientske certifikaty (cert a key) su generovane na druhom stroji
ca keys/ca.crt
dh keys/dh2048.pem
cert keys/pc1.client.crt
key keys/pc1.client.key

# End of file




konfig serveru B

vytvoříme konfig
ee openvpn.conf

# Tunnel options

# Prichadzajuce spojenie ocakava na adrese yyy,
# spojenie nadvazuje na adresu xxx,
# obidve spojenia su typu udp a na porte 1195
local yyy
remote xxx
proto udp
port 1195

# nasledujuce volny su popisane v druhom konfiguraku
dev tun2

tls-auth keys/ta.key 1

user nobody
group openvpn
chroot /etc/openvpn/

persist-tun
persist-key

log-append log/openvpn.log
verb 4
mute 20

status log/status-openvpn.log 60

comp-lzo

# 192.168.1.2 je IP adresa tohoto VPN servera
# 192.168.1.1 je IP adresa druheho
ifconfig 192.168.1.2 192.168.1.1

# pridava cestu do LAN za druhym serverom
route 192.168.20.0 255.255.255.0

# TLS key negotiating options
# na druhej strane musi byt pouzita volba tls-server
tls-client

# dh2048.pem musi byt na oboch stranach rovnaky
# ostatne kluce musia byt rozne
# klientske certifikaty (cert a key) su generovane na druhom stroji
ca keys/ca.crt
dh keys/dh2048.pem
cert keys/pc2.client.crt
key keys/pc2.client.key


# End of file




Vygenerování certifikátů pro servery

Generovanie CA certifikatu pre server na 10 rokov
generuje sa na obidvoch pocitacoch; ostava na tom, kde bol generovany
openssl req -days 3650 -nodes -new -x509 -keyout keys/private/ca.key -out keys/ca.crt -config openssl.cnf
Generovanie DH pre server
generuje sa len na jednom pocitaci, pouzije na obidvoch
openssl dhparam -out keys/dh2048.pem 2048

TLS key pre klientov aj server
generuje sa len na jednom pocitaci, pouzije na obidvoch
openvpn --genkey --secret keys/ta.key
Na generovanie certifikatov pre klientov som si vytvoril skript
Pri jeho spustani je potrebne uviest v parametri nazov klienta
Certifikat sa generuje na 10 rokov
Generuje sa na obidvoch pocitacoch; nepouzije sa na tom, na ktorom bol generovany, ale na druhom
cat gen-client.sh
openssl req -days 3650 -nodes -new -keyout keys/$1.key -out keys/$1.csr -config openssl.cnf
openssl ca -days 3650 -out keys/$1.crt -in keys/$1.csr -config openssl.cnf


V subore openssl.cnf som menil len tieto polozky v zahlavi [ CA_default ]

dir = "/etc/openvpn/keys" # Where everything is kept
certs = $dir # Where the issued certs are kept
crl_dir = $dir # Where the issued crl are kept
database = $dir/index.txt # database index file.
new_certs_dir = $dir # default place for new certs.

certificate = $dir/ca.crt # The CA certificate
serial = $dir/serial # The current serial number
crl = $dir/crl.pem # The current CRL
private_key = $dir/private/ca.key # The private key
RANDFILE = $dir/.rand # private random number file



klice je treba bezpecnym zpusobem dopravit na druhy stroj(CD,flash,disketa:-)),scp)

pomoci scp
scp /usr/local/etc/openvpn/secret.key uzivatel@fw.domena2.net:/home/uzivatel

pak se musime prihlasit pres ssh na druhy server a zkopirovat klic na spravne misto
(pokud by jsme meli na SSh povolenyho roota,tak se to necha udelat rovnou,ale defaulte je root blokovan)

ssh uzivatel@fw.domena2.net
HESLO
mkdir /usr/local/etc/openvpn
cp /home/uzivatel/secret.key /usr/local/etc/openvpn/secret.key
chmod 600 secret.key




revoke certifikatu
V podstate je to seznam certifikátů, které již VPN nebude akceptovat. Pokud vám odejde zaměsnanec, vy si sice od něj můžete certifikáty vyžádat, ale nemáte jistotu, že si je nenakopčil a nebude se snažit někdy připojit. Sice je možnost si v logu VPN zjistit, jakou IP dostává přidělenou a tu blokovat, ale toto je spolehlivější.

zavoláme bash
bash

přepneme se do adresáře
cd /usr/local/etc/openvpn

načteme proměnné
source ./vars

zablokujeme klienta s názvem ztraceny_klic (pouze jméno certifikátu- bez přípony)
./revoke-full ztraceny_klic

dostaneme takovýto výsledek

Using configuration from /usr/local/etc/openvpn/openssl.cnf
DEBUG[load_index]: unique_subject = "yes"
Adding Entry with serial number 13 to DB for /C=CZ/ST=Czech/L=Ceske Budejovice/O=server.keytec.cz/CN=ztraceny_klic/emailAddress=spravce@domena.cz
Revoking Certificate 13.
Data Base Updated
Using configuration from /usr/local/etc/openvpn/openssl.cnf
DEBUG[load_index]: unique_subject = "yes"
ztraceny_klic.crt: /C=CZ/ST=Czech/L=Ceske Budejovice/O=server.keytec.cz/CN=ztraceny_klic/emailAddress=spravce@domena.cz
error 23 at 0 depth lookup:certificate revoked


ta chyba na poslední řádce error 23 je v pořádku

revoke-full script vygeneroval v adresáři keys soubor crl.pem

upravíme konfigurák serveru
ee /usr/local/etc/openvpn

a vepíšeme do něj řádku
crl-verify crl.pem

uděláme hardlink souboru crl.pem o úroven výše
ln /usr/local/etc/openvpn/keys/crl.pem /usr/local/etc/openvpn/

a restartujeme server


pokud při připojení klienta (jakéhokoliv ) dostaneme v logu hlášku

Jul 8 08:08:03 2009 us=663067 192.168.0.92:1244 TLS: Initial packet from 192.168.0.92:1244, sid=21c3b637 400b81df WRRWWWWRWRWRWRWRWRWRWRWRWRWRWRWRWRWRWRWRWRWRWRWRWRWRRRRWRWRWRWRWRWRWRWRWRWRWRWRWRWRWRWRWRWRWRWed Jul 8 08:08:03 2009 us=766356 192.168.0.92:1244 CRL: cannot read: /usr/local/etc/openvpn/crl.pem: No such file or directory (errno=2) Wed Jul 8 08:08:03 2009 us=766504 192.168.0.92:1244 Exiting

tak je třeba zkontrolovat, jestli je soubor crl.pem čitelný pro uživatele nobody. VPN server přitom spadl, tak je třeba jej znova nastartovat.





Užitečnosti
Pokud vám to nebude chodit, je třeba nastavi ukecanost na nějaké vyšší číslo-verb 6, Zkontrolovat, zdanám komunikaci neostřihává firewall na klientovi nebo na serveru. Hodně napoví i výpis tcpdumpu tcpdump -i tun0.
Počet přístupů na stránky 1