Languages

User login


Servidor OpenVPN per a multiples clients utlitzant Certificats


    Aquest document vol explicar pas a pas com muntar un servidor OpenVPN per compartir un accés a internet amb multiples clients i poder alhora accedir a la totalitat de la subxarxa local de l'esmentat servidor. Per fer aquest document, m'he basat en conceptes ja explicats en documents i enllaços existents en aquesta web i altres, i amb l'ajuda de guiferos com son en Miquel Martos, En Carles Noguera i l'Aleix Solé, i l'inestimable ajuda del nostre amic Google.

   Amb aquesta configuració ens permet tenir el tunel muntat en un portatil, i independentment de on ens conectem, l'openvpn s'adapta a la xarxa on estem per poder enrutar be i aixecar el tunel allà on estiguem. (Per exemple un portatil, conectat a qualsevol lloc de guifi, sense tocar res, a la que tinguem conexio, el tunel ja estara disponible).

1.- Plataforma

    Tot i que el que explicare està orientat a un servidor OpenVPN sobre un debian sarge, i amb clients sota WinXP, és facilment adaptable a altres combinacions.

2.- Funcionament

    D'entre els tipus de tunels que es poden fer amb openVPN, hem triat fer un tunel enrutat, perquè es dels més fàcils de configurar i a no ser que necesitem les opcions que ens ofereixen altres tunels, es per a mi la millor opció. Més informació i discusió sobre altres tipus de tunels la podeu trobar a openvpn.net.
    El funcionament es basa en un servidor OpenVPN escoltant en un port tcp /udp concret. En principi el port oficial assignat per IANA es el 1194, però podem fer-ne servir qualsevol de lliure mentre ho especifiquem a la configuració. Per tal d'establir la comunicacio entre servidors i clients, cal que el servidor tingui obert el port que haguem escollit per fer el tunel. Una característica interessant del tunel es com s'identifiquen els clients: es basa en certificats digitals que asseguren que la maquina que intenta establir un tunel amb el servidor, ha estat previament autoritzada a fer-ho. A diferència d'altres mètodes de comunicacio enque la indentificació es fa a traves de contrasenyes que s'han d'especificar cada cop, amb aquest sistema, tant sols col·locant els fitxers amb els certificats a les 2 bandes del tunel, ja no haurem de fer cap mena d'identificacio manualment. Si voleu llegir + sobre el tema hi ha un document molt bo a la pàgina de l'Oriol.

3.- Instalacio i configuració del servidor

    Abans de començar, especificarem la configuració de les xarxes on esta muntat el túnel que ens servirà d'exemple:

Node servidor guifi

Servidor                 192.168.1.3
Ip Publica               10.138.21.5  

Node client guifi

Client                     192.168.10.10
Ip Publica               10.138.34.35 

Notar que les xarxes dels servidors i dels clients han de ser de rangs diferents (192.168.1.0/24 i 192.168.10.0/24 en aquest cas), si es que voleu tenir accés total sense problemes entre xarxes. M'explico : Si el client nomes vol el tunel per la porta d'enllaç a internet, això es podria passar per alt, ja que les uniques rutes que hi haurien afectarien a les ip's del rang 10.8 de l'enllaç servidor-client. Però si volem tenir acces a la subxarxa del servidor i la nostra xarxa te la mateixa numeracio, llavors la ruta que afegeix l'openvpn aniria a buscar les ips de la nostra xarxa i la del servidor pel tunel, i aixo no ho volem ;) .

Aquest manual serveix exacatament igual, si el servidor o el client NO estan darrera de un firewall, si és aixi ens estalviarem de toar ports a la radio.

3.1 - Paquets i comprovacions

    Per instalar la part del servidor, amb Debian, només ens caldra fer

 apt-get install openvpn 

també necessitarem el paquet per generar els certificats

 apt-get install openssl 

Comprovem que tenim suport per els dispositius tunel

modprobe tun

si no obtenim cap error, tot esta OK. Amb aixó ja tenim instalat tot el necessari per la part del servidor, fàcil oi?.

3.2 - Creació dels certificats

(NOTA : Suposarem com a nom del servidor "openvpn" per posar un exemple, pero podeu posar el que volgueu)

    Avans de configurar el servidor, haurem de generar els certificats que ens serviran per identificar-nos. El paquet de l'openVPN porta uns scripts ja preparats per fer-nos aquesta tasca + facil. Els passos específics son els seguents en debian:

Anem a la carpeta on hi ha els scripts /usr/share/doc/openvpn/examples/easy-rsa i executem les següents ordres per inicialitzar

 . ./vars 
./clean-all

IMPORTANT !!!  :
Les dades de l'Autoritat de certifiació i les dels clients han de exactament les mateixes, sino, els certificats no serviran.
Si genereu certificats clients temps despres d'haver creat els primers, recordeu que avans de poder fer-ho heu de tornar a executar . ./vars i tenir el ca.crt i el crt key del servidor encara a la carpeta keys.

ara generem la Autoritat de Certificació

./build-ca

ens demanara les dades de que parlavem avans, podem fer intro i deixar les dades per defecte, o ficar-hi dades reals. La dada que si que hem dintroduïr i que ha de ser DIFERENT en tots els certificats, es quan ens demani el "COMMON NAME" aqui li podem posar el nom del host on tenim el servidor, per l'exemple farem servir openvpn. Un cop fet això, generarem el certificat per al servidor

./build-key-server openvpn-servidor

el procés serà practicament igual que l'anterior, aquest cop posem com a "COMMON NAME "openvpn-servidor", seguint tambe la regla d'usar el nom del host primer. Al final ens demanarà confirmació 2 cops per signar el certificat. Un cop fet aixo, generarem el certificat pel client

./build-key openvpn-client1

Aquesta operació l'hem de repetir per cada un dels clients als quals volguem donar accés al servidor. En l'apartat de configuració veurem un mètode per tal que els clients comparteixin el mateix certificat, pero desde www.openvpn.org no ens ho recomanen més lluny de fer proves, per temes de seguretat. Només ens queden 2 passos per acabar amb el tema dels certificats. Ara generarem els paràmetres Diffie Hellman.

./build-dh

Aquesta operació tardarà bastant. (12 minuts en un P2 a 400, feu numeros ) Ja per últim, generem una clau que ens servira per reforçar la seguretat del nostre tunel
 

openvpn --genkey --secret openvpn-auth.key

3.3 - Localització dels certificats

Ara toca veure que ha generat tota aquesta feina que hem fet i què n'hem de fer. A la mateixa carpeta on estavem trobarem l'arxiu openvpn-auth.key. La resta d'arxius que necessitarem els trobarem subcarpeta keys. La ubicació d'aquests arxius serà la següent:

Al Servidor

ca.crt
dh1024.pem
openvpn-servidor.key
openvpn-servidor.crt
openvpn-auth.key

Als clients

ca.crt
openvpn-client1.key
openvpn-client1.crt
openvpn-auth.key

Els arxius del servidor aniran a la carpeta /etc/openvpn/keys, els de un client linux també, i un a un client windows C:/archivos de programa/OpenVPN/Config o allà on sigui que hagueu instalat l'OpenVPN.

3.4 configuracio del servidor

Hem de crear un arxiu openvpn-servidor.conf a dins la carpeta /etc/openvpn i escriure-hi el seguent

port1194
proto udp
dev tun
dh /etc/openvpn/keys/dh1024.pem
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/bandoler-servidor.crt
key /etc/openvpn/keys/bandoler-servidor.key
tls-auth /etc/openvpn/keys/utopia-auth.key 0
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 192.168.0.0 255.255.255.0"
client-to-client
keepalive 10 120
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
verb 3

    Aquestes opcions i d'altres estàn perfectament documentades a www.openvpn.net, Alt per alt comentarem que el servidor en concret fara servir el port 2000 udp sobre la interficie tun. La opcio server defineix una subxarxa sobre la que treballarà el tunel, en aquest cas 10.8.0.0, el servidor s'agafara la 10.8.0.1 per a ell i assignarà parelles de ip's als clients per fer els enllaços. (subxarxes /30 com en els enllaços WDS o entre vlans.) El push, li diu als clients quina ruta ha d'afegir per accedir a la xarxa local del servidor en aquest cas 192.168.0.0.  El client-to-client es per si ens interessa que els diferents clients dels extems del tunel es puguin veure entre si. A l'arxiu ipp.txt, guardarà a quins clients ha assignat cada ip. Si volem fer que els clients puguin fer servir els mateixos certificats, tal com haviem comentat avans, hi haurem de afegir la opcio "duplicate-cn" .
     Un cop guardat l'arxiu, hem de crear linterficie on s'executara el tunel

openvpn --mktun --dev tun0

ara ja podem reengegar lopenvpn perquè ens agafi la configuració que acvavem de fer

/etc/init.d/openvpn restart

si el tunel s'aixeca correctament, veurem un missatge tal com

Starting virtual private network daemon: openvpn-servidor(OK)

Si us dona un error, proveu d'engegar-lo amb

openvpn /etc/openvpn/openvpn-servidor.conf


i aixi podreu veure el motiu pel qual no funciona.
Ja tenim el servidor funcionant, nem pel client.

3.5 - Configuració del client

    En un client linux, la instalacio i colocació dels arxius, i per engegar-lo, es exactament igual a la de el servidor, per tant com que ja esta explicat, ens centrarem en la instalació en windows.

    En windows, instalem l'openvpn que podem trobar a http://openvpn.net/release/openvpn-2.0.5-install.exe i una interfície gràfica molt útil a openvpn.se.  Aquesta ultima pàgina tambe ens ofereix un paquet que ens instala ambdues coses . Un cop instalat, veurem que ens ha creat una nova conexió de xarxa local a la llista de conexions de xarxa, normalment l'anomena "xarxa local 2", li canviem el nom per un de més significatiu com ara "tunel-openvpn".
    A la mateixa carpeta on avans hem dit que copiariem els certificats del client, ara creem un arxiu client.ovpn amb el contingut seguent

client 
dev tun
dev-node "tunel-openvpn"
proto udp
port 1194
remote 10.138.21.5
nobind persist-key
persist-tun
mute-replay-warnings
route 10.138.0.0 255.255.0.0 net_gateway
route 172.25.0.0 255.255.0.0 net_gateway
redirect-gateway
ca ca.crt
cert openvpn-client1.crt
key openvpn-client1.key
tls-auth utopia-auth.key 1
comp-lzo
verb 3

Com en el cas del servidor, està tot documentat a www.openvpn.net. Amb remote li indiquem la ip publica del lloc on hi ha el servidor openvpn. En un entorn guifi client sense internet on volguem que el transit de guifi segueixi anant per guifi per la via normal i el transit d'internet a traves del tunel, amb la comanda route el que fem es obligar que el transit de guifi.net, no vagi a traves del tunel sino que vagi a traves de la porta d'enllaç que hi hagues activa avans de engegar el tunel. Es a dir, si la nostra gateway es 192.168.1.1 en el moment d'engegar el tunel, net_gateway prendra aquest valor. Si volem que el transit per defecte viatji a trave del tunel, hem de redireccionar la nostra default, cap a la porta d'enllaç del tunel, aixo és el que fa la comanda redirect-gateway. Si ho hem fet correctament, engeguem la gui, i veurem la opcio "conectar" , i despres d'un inici semblant a aquest :

Fri Nov 11 01:23:54 2005 OpenVPN 2.0 Win32-MinGW [SSL] [LZO] built on Apr 17 2005
Fri Nov 11 01:23:54 2005 Control Channel Authentication: using 'openvpn-auth.key' as a OpenVPN static key file
Fri Nov 11 01:23:54 2005 Outgoing Control Channel Authentication: Using 160 bit message hash 'SHA1' for HMAC authentication
Fri Nov 11 01:23:54 2005 Incoming Control Channel Authentication: Using 160 bit message hash 'SHA1' for HMAC authentication
Fri Nov 11 01:23:54 2005 LZO compression initialized
Fri Nov 11 01:23:54 2005 Control Channel MTU parms [ L:1542 D:166 EF:66 EB:0 ET:0 EL:0 ]
Fri Nov 11 01:23:54 2005 Data Channel MTU parms [ L:1542 D:1450 EF:42 EB:23 ET:0 EL:0 AF:3/1 ]
Fri Nov 11 01:23:54 2005 Local Options hash (VER=V4): '504e774e'
Fri Nov 11 01:23:54 2005 Expected Remote Options hash (VER=V4): '14168603'
Fri Nov 11 01:23:54 2005 UDPv4 link local: [undef]
Fri Nov 11 01:23:54 2005 UDPv4 link remote: 10.138.21.5:2000

Podem comprovar la configuracio que s'ens ha assignat amb

ipconfig

i si volem mirar com ha quedat la taula de rutes

route print

(en linux farem ifconfig / ip route)

Si ens surten problemes i no ens conecta, haurem de fer certes comprovacions, com son

- Comprovar que no tinguem cap firewall que ens talli la conexio
- Comprovar que tinguem el servei de client DHCP activat a la banda client

En casos diferents on hi hagi adsl+guifi o si es vol accedir a guifi desde internet a traves del tunel, s'hauran de modificar/treure comandes "route" del client.

4 - Enrutament i Forwarding

Si simplement volem accedir a la maquina on hi ha el openvpn, no caldra fer res més, hi podrem accedir a traves de la seva adreça local o a traves de 10.8.0.1. Si voliem compartir internet hem de fer alguna cosa més :

Activar el FORWARDING a la banda del servidor, perquè accepti les peticions més enllà del servidor, i enrutar el transit utilitzant iptables:

iptables -A INPUT -i tun+ -j ACCEPT 
iptables -A FORWARD -i tun+ -j ACCEPT
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

5 - Comprovacions i Final

    Amb tot aixo, ara hauriem de poder fer ping a qualsevol maquina de la subxarxa del servidor, aixi com a les ip's de les 2 bandes del tunel, i a les ip's dels altes clients del tunel. Podeu comprovar que el transit va per on toca, si feu traceroute (tracert en windows) a alguna maquina del server o de guifi. Si us hi fixeu, a efectes pràctics, de punta a punta del tunel nomes hi ha un salt, independentment dels salts per on hagi de passar per arribar a l'altre extrem del tunel. Un cop ens funcioni podem afegir les comandes de la secció 4 a inici del server per no tenir-les que tornar a posar en futurs reboots.

    De la mateixa manera, el client es pot configurar com a servei en windows (en linux ja s'instala com a servei per defecte). Hi ha moltes + opcions que no explicarem ara, com poden ser accedir a les subxarxes dels clients, assignar ip's fixes als clients, especificar opcions diferents per cada client al servidor .... Totes es poden fer modificant la configuracio de servidor i/o client o enrutant correctament en cada cas. Per informació sobre aquestes opcions i qualsevol dubte, adreçeu-vos a aquest document.