OpenVPN es una aplicación sumamente interesante en el campo de las redes VPN que aprovecha al máximo todas las características de cifrado, certificación y autenticación que soporta OpenSSL para crear túneles sobre redes IP utilizando únicamente un puerto TCP/UDP, se trata de una aplicación bastante robusta y estable que se ha consolidado como una de las mejores aplicaciones en el campo de VPN en el software libre (su licencia es GNU/GPL).
Al igual que cualquier túnel sobre IP utilizando una VPN, una de las principales ventajas es precisamente la posibilidad de “saltar” las restricciones que pueden estar establecidas entre una máquina determinada y la red a la cual se encuentra conectada, a continuación se indica como es el proceso de instalación y como utilizar OpenVPN
OpenVPN
En sistemas basados en Debian, para instalar OpenVPN será suficiente con ejecutar el comando
>apt-get install openvpn |
Con esto se instala OpenVPN, posteriormente es necesario comenzar con el proceso de configuración de la VPN en concreto, es necesario generar los certificados y claves para que los clientes puedan conectarse, para este fin, el proceso de configuración consta de los siguientes pasos:
- El directorio de configuración de openvpn se encuentran ubicado en /etc/openvpn, es allí donde se deben ubicar certificados y claves que aceptará la VPN. Para un inicio rápido, se cuenta con algunos “ejemplos” de configuración que pueden ser personalizados, en este caso, el primer paso es copiar el contenido completo del directorio “easy-rsa” al directorio /etc/openvpn, easy-rsa se encuentra incluido en “/usr/share/doc/openvpn/examples/easy-rsa/” el contenido de este directorio incluye dos directorios más “1.0” y “2.0” en estos directorios se encuentran las utilidades necesarias para comenzar a construir certificados de autoridad (CA)
- Ubicados en el directorio /etc/openvpn/easy-rsa/2.0 es necesario editar el fichero “vars” para incluir los datos relacionados con el certificado de autoridad que se va a generar, es importante cambiar los valores que se incluyen por defecto en este fichero, especialmente la zona correspondiente a los datos de Provincia, País, Días de expiración, etc. El contenido de este fichero puede ser el siguiente:
# easy-rsa parameter settings # NOTE: If you installed from an RPM,
# don’t edit this file in place in
# /usr/share/openvpn/easy-rsa —
# instead, you should copy the whole
# easy-rsa directory to another location
# (such as /etc/openvpn) so that your
# edits will not be wiped out by a future
# OpenVPN package upgrade.
# This variable should point to
# the top level of the easy-rsa
# tree.
export EASY_RSA=»`pwd`»
#
# This variable should point to
# the requested executables
#
export OPENSSL=»openssl»
export PKCS11TOOL=»pkcs11-tool»
export GREP=»grep»
# This variable should point to
# the openssl.cnf file included
# with easy-rsa.
export KEY_CONFIG=`$EASY_RSA/whichopensslcnf $EASY_RSA`
# Edit this variable to point to
# your soon-to-be-created key
# directory.
#
# WARNING: clean-all will do
# a rm -rf on this directory
# so make sure you define
# it correctly!
export KEY_DIR=»$EASY_RSA/keys»
# Issue rm -rf warning
echo NOTE: If you run ./clean-all, I will be doing a rm -rf on $KEY_DIR
# PKCS11 fixes
export PKCS11_MODULE_PATH=»dummy»
export PKCS11_PIN=»dummy»
# Increase this to 2048 if you
# are paranoid. This will slow
# down TLS negotiation performance
# as well as the one-time DH parms
# generation process.
export KEY_SIZE=1024
# In how many days should the root CA key expire?
export CA_EXPIRE=3650
# In how many days should certificates expire?
export KEY_EXPIRE=3650
# These are the default values for fields
# which will be placed in the certificate.
# Don’t leave any of these fields blank.
export KEY_COUNTRY=»ES»
export KEY_PROVINCE=»MA»
export KEY_CITY=»Madrid»
export KEY_ORG=»OPENVPN»
export KEY_EMAIL=»jj.jj@jj.mydomain«
- Ahora se procede a utilizar este fichero para la generación del certificado de confianza
>source vars NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/2.0/keys
>./clean-all
>./build-ca
Generating a 1024 bit RSA private key
……………………………….++++++
…..++++++
writing new private key to ‘ca.key’
—–
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [ES]:
State or Province Name (full name) [MA]:
Locality Name (eg, city) [Madrid]:
Organization Name (eg, company) [OPENVPN]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server’s hostname) [OPENVPN CA]:
Name []:
Email Address [jj.jj@jj.mydomain]:
El efecto de los comandos anteriores ha sido, básicamente la generación de la clave privada y el certificado correspondiente a la CA
- Ahora se debe construir el certificado para instalar en el servidor, para este fin se ejecuta lo siguiente:
>./build-key-server server Generating a 1024 bit RSA private key
……………………..++++++
….++++++
writing new private key to ‘server.key’
—–
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [ES]:
State or Province Name (full name) [MA]:
Locality Name (eg, city) [Madrid]:
Organization Name (eg, company) [OPENVPN]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server’s hostname) [server]:
Name []:
Email Address [jj.jj@jj.mydomain]:
Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject’s Distinguished Name is as follows
countryName :PRINTABLE:’ES’
stateOrProvinceName :PRINTABLE:’MA’
localityName :PRINTABLE:’Madrid’
organizationName :PRINTABLE:’OPENVPN’
commonName :PRINTABLE:’server’
emailAddress :IA5STRING:’jj.jj@jj.mydomain’
Certificate is to be certified until Jun 2 18:17:53 2021 GMT (3650 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
- Anteriormente se ha creado la clave utilizada por el servidor y se han dejado los valores por defecto, por otro lado tampoco se ha indicado ningún tipo de contraseña. Ahora se deben generar los certificados correspondientes al cliente final, en el caso de que existan varias máquinas que se conecten a la VPN, este script debe ejecutarse para cada uno de dichos clientes.
>./build-key client1 Generating a 1024 bit RSA private key
……………………………………++++++
……………………….++++++
writing new private key to ‘client1.key’
—–
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [ES]:
State or Province Name (full name) [MA]:
Locality Name (eg, city) [Madrid]:
Organization Name (eg, company) [OPENVPN]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server’s hostname) [client1]:
Name []:
Email Address [jj.jj@jj.mydomain]:
Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject’s Distinguished Name is as follows
countryName :PRINTABLE:’ES’
stateOrProvinceName :PRINTABLE:’MA’
localityName :PRINTABLE:’Madrid’
organizationName :PRINTABLE:’OPENVPN’
commonName :PRINTABLE:’client1′
emailAddress :IA5STRING:’jj.jj@jj.mydomain’
Certificate is to be certified until Jun 2 18:24:34 2021 GMT (3650 days)
Sign the certificate? [y/n]:y
1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
- Ahora, dado que OpenVPN utiliza mecanismos de cifrado basado en OpenSSL es necesario “construir” los parámetros Diffie-Hellman, se trata de un protocolo estándar que consiste en el intercambio seguro de claves secretas entre dos usuarios sobre un medio inseguro (como por ejemplo internet) para conseguir esto en OpenVPN se cuenta con el script build-dh
./build-dh Generating DH parameters, 1024 bit long safe prime, generator 2
This is going to take a long time
……………………..+………………………………………………………………..+…………………………………………………………………………………………………………….+…………………..+……..+……………+……………………………………………………………………………..+……………………+………………………..+……………+….+…………….+………+………+………………+….+………………………………..+…………………….+….+……+……..++*++*++*
- Con los pasos anteriores se han creado todos los certificados necesarios para el funcionamiento de la VPN, todos estos certificados se encuentran ubicados en el directorio /etc/openvpn/easy-rsa/2.0/keys el contenido de este directorio será similar al siguiente
ca.crt Certificado Raiz para la CA ca.key Clave Raiz para la CA dh1024.pem Parametros DH server.crt Certificado del servidor server.key Clave del Servidor client1.crt Certificado del client1. client1.key Clave del client1 - El siguiente paso es establecer y personalizar los ficheros de configuración de clientes y servidor, para esto, nuevamente puede utilizarse los ejemplos que se incluyen en el directorio /usr/share/doc/openvpn/examples/sample-config-files de este directorio se deben copiar los ficheros server.conf.gz y client.conf al directorio /etc/openvpn. El fichero comprimido server.conf.gz debe ser descomprimido (utilizando gunzip por ejemplo) y utilizar el fichero de configuración que se encuentra allí.
- Abrir el fichero de configuración server.conf y establecer las propiedades correspondientes a las localizaciones de los certificados, que deben apuntar a /etc/openvpn/easy-rsa/2.0/keysLas lineas en el fichero de configuración correspondientes a los certificados son:
ca /etc/openvpn/easy-rsa/2.0/keys/ca.crt
cert /etc/openvpn/easy-rsa/2.0/keys/server.crt key /etc/openvpn/easy-rsa/2.0/keys/server.key # This file should be kept secret # Diffie hellman parameters. # Generate your own with: # openssl dhparam -out dh1024.pem 1024 # Substitute 2048 for 1024 if you are using # 2048 bit keys. dh /etc/openvpn/easy-rsa/2.0/keys/dh1024.pem |
- Abrir el fichero de configuración client.conf y establecer las propiedades correspondientes a los certificados y CA que se ubicarán en la máquina remota, suponiendo que el cliente tenga ubicados todos estos ficheros en directorio /opt/openvpnclient el contenido del fichero debe contener esta ruta, por otra parte es necesario definir la propiedad “remote” donde se puede indicar una dirección IP o el nombre de un dominio accesible al cliente para establecer la conexión.
# The hostname/IP and port of the server. # You can have multiple remote entries
# to load balance between the servers.
remote jdaanial-homeip.net 1194
;remote my-server-2 1194
# SSL/TLS parms.
# See the server config file for more
# description. It’s best to use
# a separate .crt/.key file pair
# for each client. A single ca
# file can be used for all clients.
ca /opt/openvpnclient/ca.crt
cert /opt/openvpnclient/client.crt
key /opt/openvpnclient/client.key
- En este punto la configuración esta lista, solamente hace falta copiar los ficheros:
ca.crt
client1.crt
client1.key
client.conf
En el cliente evidentemente también se debe instalar openvpn para ejecutar el comando de conexión. - Finalmente, es necesario iniciar el servicio en la máquina servidora con el comando openvpn fichero_config_server de la siguiente forma
>openvpn server.conf Sun Jun 5 22:34:31 2011 OpenVPN 2.1.0 x86_64-pc-linux-gnu [SSL] [LZO2] [EPOLL] [PKCS11] [MH] [PF_INET6] [eurephia] built on Jul 12 2010
Sun Jun 5 22:34:31 2011 NOTE: your local LAN uses the extremely common subnet address 192.168.0.x or 192.168.1.x. Be aware that this might create routing conflicts if you connect to the VPN server from public locations such as internet cafes that use the same subnet.
Sun Jun 5 22:34:31 2011 NOTE: OpenVPN 2.1 requires ‘–script-security 2’ or higher to call user-defined scripts or executables
Sun Jun 5 22:34:31 2011 Diffie-Hellman initialized with 1024 bit key
Sun Jun 5 22:34:31 2011 /usr/bin/openssl-vulnkey -q -b 1024 -m <modulus omitted>
Sun Jun 5 22:34:31 2011 TLS-Auth MTU parms [ L:1542 D:138 EF:38 EB:0 ET:0 EL:0 ]
Sun Jun 5 22:34:31 2011 ROUTE default_gateway=192.168.1.1
Sun Jun 5 22:34:31 2011 TUN/TAP device tun0 opened
Sun Jun 5 22:34:31 2011 TUN/TAP TX queue length set to 100
Sun Jun 5 22:34:31 2011 /sbin/ifconfig tun0 10.8.0.1 pointopoint 10.8.0.2 mtu 1500
Sun Jun 5 22:34:31 2011 /sbin/route add -net 10.8.0.0 netmask 255.255.255.0 gw 10.8.0.2
Sun Jun 5 22:34:31 2011 Data Channel MTU parms [ L:1542 D:1450 EF:42 EB:135 ET:0 EL:0 AF:3/1 ]
Sun Jun 5 22:34:31 2011 Socket Buffers: R=[126976->131072] S=[126976->131072]
Sun Jun 5 22:34:31 2011 UDPv4 link local (bound): [undef]
Sun Jun 5 22:34:31 2011 UDPv4 link remote: [undef]
Sun Jun 5 22:34:31 2011 MULTI: multi_init called, r=256 v=256
Sun Jun 5 22:34:31 2011 IFCONFIG POOL: base=10.8.0.4 size=62
Sun Jun 5 22:34:31 2011 IFCONFIG POOL LIST
Sun Jun 5 22:34:31 2011 Initialization Sequence Completed
- Posteriormente en la máquina del cliente ejecutar:
>openvpn client.conf
Mon Jun 6 00:03:59 2011 OpenVPN 2.1.0 x86_64-pc-linux-gnu [SSL] [LZO2] [EPOLL] [PKCS11] [MH] [PF_INET6] [eurephia] built on Jul 12 2010 Mon Jun 6 00:03:59 2011 NOTE: OpenVPN 2.1 requires ‘–script-security 2’ or higher to call user-defined scripts or executables Mon Jun 6 00:03:59 2011 /usr/bin/openssl-vulnkey -q -b 1024 -m <modulus omitted> Mon Jun 6 00:03:59 2011 LZO compression initialized Mon Jun 6 00:03:59 2011 Control Channel MTU parms [ L:1542 D:138 EF:38 EB:0 ET:0 EL:0 ] Mon Jun 6 00:03:59 2011 Data Channel MTU parms [ L:1542 D:1450 EF:42 EB:135 ET:0 EL:0 AF:3/1 ] Mon Jun 6 00:03:59 2011 Local Options hash (VER=V4): ‘41690919’ Mon Jun 6 00:03:59 2011 Expected Remote Options hash (VER=V4): ‘530fdded’ Mon Jun 6 00:03:59 2011 Socket Buffers: R=[126976->131072] S=[126976->131072] Mon Jun 6 00:03:59 2011 UDPv4 link local: [undef] Mon Jun 6 00:03:59 2011 UDPv4 link remote: [AF_INET]192.168.1.34:1194 Mon Jun 6 00:03:59 2011 TLS: Initial packet from [AF_INET]192.168.1.34:1194, sid=09d8c3dd b020b25d Mon Jun 6 00:03:59 2011 VERIFY OK: depth=1, /C=US/ST=CA/L=SanFrancisco/O=Fort-Funston/CN=Fort-Funston_CA/emailAddress=me@myhost.mydomain Mon Jun 6 00:03:59 2011 VERIFY OK: nsCertType=SERVER Mon Jun 6 00:03:59 2011 VERIFY OK: depth=0, /C=US/ST=CA/L=SanFrancisco/O=Fort-Funston/CN=server/emailAddress=me@myhost.mydomain Mon Jun 6 00:03:59 2011 Data Channel Encrypt: Cipher ‘BF-CBC’ initialized with 128 bit key Mon Jun 6 00:03:59 2011 Data Channel Encrypt: Using 160 bit message hash ‘SHA1’ for HMAC authentication Mon Jun 6 00:03:59 2011 Data Channel Decrypt: Cipher ‘BF-CBC’ initialized with 128 bit key Mon Jun 6 00:03:59 2011 Data Channel Decrypt: Using 160 bit message hash ‘SHA1’ for HMAC authentication Mon Jun 6 00:03:59 2011 Control Channel: TLSv1, cipher TLSv1/SSLv3 DHE-RSA-AES256-SHA, 1024 bit RSA Mon Jun 6 00:03:59 2011 [server] Peer Connection Initiated with [AF_INET]192.168.1.34:1194 Mon Jun 6 00:04:02 2011 SENT CONTROL [server]: ‘PUSH_REQUEST’ (status=1) Mon Jun 6 00:04:02 2011 PUSH: Received control message: ‘PUSH_REPLY,route 10.8.0.1,topology net30,ping 10,ping-restart 120,ifconfig 10.8.0.6 10.8.0.5’ Mon Jun 6 00:04:02 2011 OPTIONS IMPORT: timers and/or timeouts modified Mon Jun 6 00:04:02 2011 OPTIONS IMPORT: –ifconfig/up options modified Mon Jun 6 00:04:02 2011 OPTIONS IMPORT: route options modified Mon Jun 6 00:04:02 2011 ROUTE default_gateway=192.168.1.1 Mon Jun 6 00:04:02 2011 TUN/TAP device tun1 opened Mon Jun 6 00:04:02 2011 TUN/TAP TX queue length set to 100 Mon Jun 6 00:04:02 2011 /sbin/ifconfig tun1 10.8.0.6 pointopoint 10.8.0.5 mtu 1500 Mon Jun 6 00:04:02 2011 /sbin/route add -net 10.8.0.1 netmask 255.255.255.255 gw 10.8.0.5 Mon Jun 6 00:04:02 2011 Initialization Sequence Completed |
Ahora el cliente puede comunicarse con el servidor por medio de la red privada creada, de hecho, como en el caso de Hamachi, tanto en cliente como en servidor, se ha creado una nueva interfaz de red.
Servidor
>ifconfig
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet addr:10.8.0.1 P-t-P:10.8.0.2 Mask:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) |
Cliente
>ifconfig
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 |
Finalmente, se listan algunas ventajas y desventajas en el uso de esta herramienta
Ventajas | Desventajas |
Licencia Libre GNU/GPL | Es necesario generar ficheros de configuración y certificados para cada uno de los clientes que se conecte |
Mecanismos de seguridad fuertes por el uso de OpenSSL | Un poco mas compleja de otras herramientas para crear VPN, sin embargo, esto no significa que la complejidad sea demasiado elevada. |
Contiene scripts que facilitan la generación de certificados y claves privadas validos tanto para cliente como para servidor | Se maneja un modelo cliente-servidor lo que significa que todas las conexiones son creadas y administradas por una capa “servidora”, lo que quiere decir que el cliente debe “conocer” la ubicación del servidor, ya sea por dirección IP o por nombre de dominio DNS |
Se trata de una herramienta bastante estable y ampliamente utilizada lo que permite tener un nivel de confianza a la hora de utilizarla en un entorno real (Internet) | Si se utiliza en Internet, es necesario contar con un dominio o un servidor con una dirección IP publica para que los clientes puedan conectarse. |
El proceso de instalación y configuración básico es muy sencillo y se puede tener una VPN funcional en poco tiempo. |