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:

  1. 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)
  2. 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«

  3. 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

  4. 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

  5. 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

  6. 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

    ……………………..+………………………………………………………………..+…………………………………………………………………………………………………………….+…………………..+……..+……………+……………………………………………………………………………..+……………………+………………………..+……………+….+…………….+………+………+………………+….+………………………………..+…………………….+….+……+……..++*++*++*

  7. 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
  8. 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í.
  9. 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

  1. 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

  2. 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.
  3. 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

  4. 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
inet addr:10.8.0.6  P-t-P:10.8.0.5  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)

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.