OpenVPN gateway (tutorial)

După o mică sesiune de ARP Poisoning m-am hotărât să trag repede un OpenVPN ca să n-am probleme. Mă jucam azi cu Cain-ul împreună cu un student și am rămas uimit când a agățat parolele de pe https. Practic, jucăria genera certificate ssl fake și “păcălea” victima. Dacă o să am ocazia să fac o sesiune de ARP Poisoning undeva într-o sală mai plină și să urmăresc mai multe IP-uri o să pun un post cu poze pe aici.

Revenind la OpenVPN, am zis că-i cea mai bună soluție să evit probleme de genul ăsta în medii mai “nesigure”. Serverul pe care aveam de gând să-l folosesc pentru conectare rulează Feisty Fawn (de pe vremea când era beta chiar) iar clientul avea să fie laptopul propriu cu Windoze.

Instalarea este simplă (pe ambele mașini), poate un pic mai simplă pe Ubuntu.

Server:

apt-get install openvpn openssl bridge-utils

Client :

Se descarcă OpenVPN GUI. Se pornește installer-ul cu dublu-click. Se urmează instrucțiunile.

După instalare, pe server vor trebui create cheile și certificatele. Pentru asta va trebui să intrați în /usr/share/doc/openvpn/examples/easy-rsa/2.0 .


cd /usr/share/doc/openvpn/examples/easy-rsa/2.0

Se editează fișierul

vars

(pentru a scuti introducerea datelor de mai multe ori) și se schimbă variabilele pentru :

export KEY_COUNTRY=" "
export KEY_PROVINCE=""
export KEY_CITY=" "
export KEY_ORG=""
export KEY_EMAIL=""

După care se rulează comenzile :

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

Generăm și cheie pentru client(i):

./build-key gigi

Și terminăm și cu Diffie Hellman (aici e posibil să dureze mai mult, depinde de mașină):

./build-dh

Toate cheile generate sunt în directorul keys. Ar trebui să le mutăm într-un loc mai sigur și să punem în /etc/openvpn/keys doar cheile și certificatele necesare:


mkdir /etc/openvpn/keys
cp ca.key ca.crt dh1024.pem server.key server.crt /etc/openvpn/keys/

Pe client vom lua cheile și certificatele necesare acolo și le vom copia în C:Program Filesopenvpnconfigkeys (presupunând că ăsta-i folderul cu instalarea OpenVPN GUI ). Folderul “keys” va trebui creat. Cheile și certificatele necesare sunt :


ca.crt
gigi.crt
gigi.key

Am terminat cu generarea cheilor, acum trecem la configurare. Primul este serverul.

În /etc/openvpn facem un fișier nou, server.conf.


cd /etc/openvpn
touch server.conf
vim server.conf

Fișierul de configurare ar trebui să conțină următoarele linii :


port 9999
proto tcp
dev tap
client-to-client
server 10.11.12.0 255.255.255.192
push "redirect-gateway"
ca keys/ca.crt
cert keys/server.crt
key keys/server.key
dh keys/dh1024.pem
client-to-client
cipher AES-128-CBC
comp-lzo
max-clients 5
user nobody
group nogroup
persist-key
persist-tun
chroot /etc/openvpn

Salvăm și ieșim. Mai trebuiesc setate niște reguli pe firewall pentru ca routarea să funcționeze și clientul să poată avea acces la internet. Dacă există deja un firewall pe mașină editați-l pe acela, dacă nu, creați un script nou cu următoarele reguli :


echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth1  -j SNAT --to xxx.xxx.xxx.xxx
#Unde xxx.xxx.xxx.xxx este adresa IP externa, routabilă a serverului.
#Cea prin care serverul are acces în internet.
iptables -A FORWARD  -j ACCEPT
iptables -A INPUT -i tap+ -j ACCEPT
iptables -A FORWARD -i tap+ -j ACCEPT
iptables -t nat -A POSTROUTING -s  10.11.12.0/24 -o eth1 -j MASQUERADE

Facem scriptul executabil și-l rulăm.


chmod 755 firewall
./firewall

Acum putem să rulăm și daemonul de openvpn. Ca să verificăm că nu avem erori la pornire, deschidem o fereastră noua pe server și urmărim syslog.


tail -f /var/log/syslog

Pornim serverul și stăm cu ochii pe syslog pentru a prinde eventualele erori.


/etc/init.d/openvpn start

Erorile ar putea fi legate de alt serviciu care ascultă pe portul respectiv.

Mai avem de făcut ultimul pas și anume, configurarea clientului.

Din C:Program FilesOpenVPNsample-config copiem fișierul client.ovpn în C:Program FilesOpenVPNConfig și-l redenumim ca gigi.ovpn.
În el operăm modificări la următorii parametri :


client
tls-client
dev tap
proto tcp
#Adresa IP a serverului și portul de conectare.
remote xxx.xxx.xxx.xxx 9999
persist-key
persist-tun
ca keys/ca.crt
cert keys/gigi.crt
key keys/gigi.key
cipher AES-128-CBC
comp-lzo

Salvăm, închidem fișierul și pornim OpenVPN GUI. Dăm click pe “Connect” și ar trebui să funcționeze.

Printre problemele care ar putea să apară, cea mai frecventă este legată de firewall. Ori cel aflat pe server ori cel aflat pe sistem. Vedeți dacă serverul permite conexiuni pe portul respectiv sau dacă clientul nu filtrează și el. În rest, n-ar trebui să apară probleme. Restul sunt de tipul PEBKAC (search google for this one :P ).

Enjoy

7 Comments OpenVPN gateway (tutorial)

  1. bogd

    1) Scoate MASQ. N-are rost sa faci si SNAT, si MASQ in acelasi timp.
    2) Daca nu ai nevoie de bridging pentru broadcast-uri (such as gaming sau file sharing over the vpn :P ), foloseste tun in loc de tap (si atunci nici nu mai ai nevoie de apt-get install bridge-utils). Daca ai nevoie de ele, mai trebuie configurat si bridge-ul.
    3) ca.key nu trebuie sa fie in openvpn/keys (e cheia privata a CA-ului, folosita doar pentru semnarea certificatelor. Pentru verificarea de la conectare, serverul foloseste doar ca.crt).

    Reply
  2. Meekuu

    STIU ca trebuia editat tutorialul însă există o mică problemă. În apache aici e instalat mod_security care filtrează diverse chestii cum ar fi încercări de citire de prin /etc and so on. Ca să postez tutorialul a trebuit să dezactivez mod_security, să postez și să-l activez la loc. La fiecare încercare de editare trebuie să fac același lucru. După cum scrie și sus, I’m Lazy… :D Așa că, lumea poa’ să citească și în comentarii despre asta.

    Reply
  3. dragos

    imi apre o prb legata de gigi.crt
    Cannot load certificate file keys/user1.crt: error:02001003:system library:fopen:No such process: error:20074002:BIO routines:FILE_CTRL:system lib: error:140AD002:SSL routines:SSL_CTX_use_certificate_file:system lib

    stii unde ar putea fi prb?

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *