OpenVPN es una solución de conectividad basada en software libre: SSL (Secure Sockets Layer) VPN Virtual Private Network (red virtual privada), OpenVPN ofrece conectividad punto-a-punto con validación jerárquica de usuarios y host conectados remotamente, resulta una muy buena opción en tecnologías Wi-Fi y soporta una amplia configuración, entre ellas balanceo de cargas. Está publicado bajo la licencia GPL, de software libre.

 

Esquema de red

Una actuará como servidor vpn, mientras que la otra actuará como cliente:

Recomiendo hacer dicho escenario con KVM o virtualbox, modificando el fichero /etc/network/interfaces

Una vez tengamos definido el esquema vamos a proceder a configurar OpenVPN.

Instalar OpenVPN

Vamos a instalar los paquetes apt install openvpn openssl en la maquina que va a actuar de servidor «Server», una vez instalado creamos un directorio que se llamara easy-rsa en /etc/openvpn

root@server:~# cd /etc/openvpn/
root@server:/etc/openvpn# mkdir easy-rsa

OpenVPN nos ofrece una serie de scripts para la creación de certificados autofirmados para identificar a nuestro servidor tanto como a los clientes, la ubicación de estos scripts es el directorio /usr/share/easy-rsa, ahora copiaremos esta serie de scripts al directorio easy-rsa creado previamente.

root@server:/etc/openvpn# cp /usr/share/easy-rsa/* ./easy-rsa/

Para la creación de los certificados es necesario exportar una serie de variables para definir los datos en la creación de los certificados que vamos a crear. Esto lo realizamos editando el fichero vars.

Eliminamos todos los comentarios y dejamos las siguientes lineas:

export EASY_RSA="`pwd`"

export OPENSSL="openssl"
export PKCS11TOOL="pkcs11-tool"
export GREP="grep"

export KEY_CONFIG=`$EASY_RSA/whichopensslcnf $EASY_RSA`

export KEY_DIR="$EASY_RSA/keys"

echo NOTE: If you run ./clean-all, I will be doing a rm -rf on $KEY_DIR

export PKCS11_MODULE_PATH="/usr/lib/changeme.so"
export PKCS11_PIN=usuario

export KEY_SIZE=2048
export CA_EXPIRE=365
export KEY_EXPIRE=365

export KEY_COUNTRY="ES"
export KEY_PROVINCE="ANDALUCIA"
export KEY_CITY="Sevilla"
export KEY_ORG="jlramirez.gonzalonazareno.org"
export KEY_EMAIL="admin@juanluramire.com"
export KEY_OU="OpenVPN"

export KEY_NAME=openVPN

export KEY_CN=JuanluRamirez

Ejecutamos el script modificado

root@server:/etc/openvpn# source ./easy-rsa/vars 
bash: /etc/openvpn/whichopensslcnf: No such file or directory
NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/keys

Una de las lineas que podemos observar en el script es la que podemos ver anteriormente, es decir, nos solicitara la ejecución del script para eliminar posibles claves:

root@server:/etc/openvpn/easy-rsa# ./clean-all 
root@server:/etc/openvpn# source ./easy-rsa/vars

Con esto tenemos todas las configuraciones previas a la creación de certificados.

Creación llave diffies hellman

Es un protocolo de establecimiento de claves entre partes que no han tenido contacto previo, utilizando un canal inseguro, y de manera anónima (no autentificada). Se emplea generalmente como medio para acordar claves simétricas que serán empleadas para el cifrado de una sesión (establecer clave de sesión). Siendo no autenticado, sin embargo, provee las bases para varios protocolos autenticados.

Para ello ejecutamos el script build-dh:

root@server:/etc/openvpn/easy-rsa# ./build-dh 
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
..............................................................................+.................................................................+.......................

Creación certificado Autoridad certificadora

Podemos observar como crear un certificado raiz y como firmar peticiones de certificados en el siguiente post

Ahora solo vamos ejecutar el script que realiza esta opción build-ca:

root@server:/etc/openvpn/easy-rsa# ./build-ca 
Generating a 2048 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) [ANDALUCIA]:
Locality Name (eg, city) [Sevilla]:
Organization Name (eg, company) [jlramirez.gonzalonazareno.org]:
Organizational Unit Name (eg, section) [OpenVPN]:
Common Name (eg, your name or your server's hostname) [JuanluRamirez]:
Name [openVPN]:
Email Address [admin@juanluramire.com]:
Info! Si nos devuelve un error bastara con editar el fichero el cual nos de el error, en mi caso, ha sido openssl-1.0.0.conf y comentamos las lineas que dan error, para ver la linea nano -c [Nombre_fichero]

Creación Clave y certificado raíz

Para el correcto funcionamiento de OpenVPN también se requiere de un certificado y una key en el servidor, para ello vamos a utilizar el script build-key-server [nombre].

Servidor

root@server:/etc/openvpn/easy-rsa# ./build-key-server servidor
Generating a 2048 bit RSA private key
.................................................+++
..+++
writing new private key to 'servidor.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) [ANDALUCIA]:
Locality Name (eg, city) [Sevilla]:
Organization Name (eg, company) [jlramirez.gonzalonazareno.org]:
Organizational Unit Name (eg, section) [OpenVPN]:
Common Name (eg, your name or your server's hostname) [server]:
Name [openVPN]:
Email Address [admin@juanluramire.com]:

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/openssl-1.0.0.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'ES'
stateOrProvinceName   :PRINTABLE:'ANDALUCIA'
localityName          :PRINTABLE:'Sevilla'
organizationName      :PRINTABLE:'jlramirez.gonzalonazareno.org'
organizationalUnitName:PRINTABLE:'OpenVPN'
commonName            :PRINTABLE:'server'
name                  :PRINTABLE:'openVPN'
emailAddress          :IA5STRING:'admin@juanluramire.com'
Certificate is to be certified until Feb  6 22:19:46 2018 GMT (365 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

Host

Igual que hemos realizado en el paso anterior vamos a crear un certificado y una clave privada para la maquina host ./build-key [Nombre], pero en este caso al no tratarse del servidor ejecutaremos un script distinto.

root@server:/etc/openvpn/easy-rsa# ./build-key host
Generating a 2048 bit RSA private key
...................................+++
...........+++
writing new private key to 'host.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) [ANDALUCIA]:
Locality Name (eg, city) [Sevilla]:
Organization Name (eg, company) [jlramirez.gonzalonazareno.org]:
Organizational Unit Name (eg, section) [OpenVPN]:
Common Name (eg, your name or your server's hostname) [host]:
Name [openVPN]:
Email Address [admin@juanluramire.com]:

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/openssl-1.0.0.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'ES'
stateOrProvinceName   :PRINTABLE:'ANDALUCIA'
localityName          :PRINTABLE:'Sevilla'
organizationName      :PRINTABLE:'jlramirez.gonzalonazareno.org'
organizationalUnitName:PRINTABLE:'OpenVPN'
commonName            :PRINTABLE:'host'
name                  :PRINTABLE:'openVPN'
emailAddress          :IA5STRING:'admin@juanluramire.com'
Certificate is to be certified until Feb  7 11:26:45 2018 GMT (365 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

Ya tendremos todas las claves y certificados en el directorio /etc/openvpn/easy-rsa/keys:

Info! Por defecto OpenVPN genera tanto los certificados como las keys con sus correctos permisos.

Configuración túnel en las dos maquinas

Vamos a modificar tanto en Server como en el cliente host

Server

En el servidor tenemos instalado openvpn, por lo tanto vamos a crear un fichero que se llamara servidor.conf.

Creamos fichero servidor.conf

root@server:/etc/openvpn# nano servidor.conf
# nombre de la interfaz
dev tun
# Direcciones IP virtuales
ifconfig 10.99.99.1 10.99.99.2
# Subred eth1 de la maquina destino 
route 10.0.101.0 255.255.255.0
# Rol de Servidor
tls-server
# Parámetros Diffie-Hellman
dh /etc/openvpn/easy-rsa/keys/dh2048.pem
# #Certificado de la CA
ca /etc/openvpn/easy-rsa/keys/ca.crt
# Certificado Servidor
cert /etc/openvpn/easy-rsa/keys/server.crt
# Clave privada servidor
key /etc/openvpn/easy-rsa/keys/server.key
# Compresión LZO
comp-lzo
# Tiempo de vida
keepalive 10 60
# Fichero de log
log /var/log/server.log
# Nivel de Depuración
verb 6

Una vez creado y guardado el fichero reiniciamos el servicio systemctl restart openvpn.service && reboot, al volver a arrancar la maquina realizamos un ip a y observamos ya tenemos nuestro tunel:

root@server:/home/vagrant# ip a | grep tun0
6: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
    inet 10.99.99.1 peer 10.99.99.2/32 scope global tun0

El ultimo paso en el servidor es permitir el enrutamiento para ello modificamos la siguiente linea en /etc/sysctl.conf:

#Esta linea

#net.ipv4.ip_forward=1

#Por esta

net.ipv4.ip_forward=1

Host

Esta maquina actuara como cliente y no tenemos instalado el paquete apt install openvpn, una vez instalado, vamos a adquirir los certificados creados en nuestro servidor, para ello vamos a utilizar el comando scp

root@host:/etc/openvpn# mkdir keys
root@server:/etc/openvpn/easy-rsa/keys# scp ca.crt host.* index.txt serial vagrant@192.168.1.66:
vagrant@192.168.1.66's password: 
ca.crt                                                                                                                                100% 1850     1.8KB/s   00:00    
host.crt                                                                                                                              100% 5683     5.6KB/s   00:00    
host.key                                                                                                                              100% 1704     1.7KB/s   00:00    
index.txt                                                                                                                             100%  316     0.3KB/s   00:00    
serial 
                                                                                                                               100%    3     0.0KB/s   00:00

Creamos el directorio mkdir /etc/openvpn/keys y copiamos a /etc/openvpn/keys, los ficheros transferidos por scp

root@host:/etc/openvpn/keys# ls -la
total 32
drwxr-xr-x 2 root root 4096 Feb  6 23:17 .
drwxr-xr-x 3 root root 4096 Feb  6 23:07 ..
-rw-r--r-- 1 root root 1850 Feb  6 23:14 ca.crt
-rw-r--r-- 1 root root 5683 Feb  6 23:14 host.crt
-rw------- 1 root root 1704 Feb  6 23:14 host.key
-rw-r--r-- 1 root root  316 Feb  6 23:14 index.txt
-rw-r--r-- 1 root root    3 Feb  6 23:14 serial
root@host:/etc/openvpn/keys#

Creamos fichero host.conf

Creamos en /etc/openvpn el fichero host.conf y lo rellenamos con lo siguiente:

root@host:/etc/openvpn# nano host.conf

dev tun
ifconfig 10.99.99.2 10.99.99.1
#Ip eth0 servidor
remote 192.168.1.65
# Subred eth1 de la maquina destino 
route 10.0.100.0 255.255.255.0
tls-client
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/host.crt
key /etc/openvpn/keys/host.key
comp-lzo
keepalive 10 60
log /var/log/host.log
verb 6

Guardamos la configuración, reiniciamos el servicio y reiniciamos la maquina systemctl restart openvpn && reboot

Comprobaciones tunel

Vamos a realizar diferentes comprobaciones como por ejemplo:

Ping y traceroute de una maquina cliente a otra

Cliente1-Cliente2

Cliente2-Cliente1

Conexion ssh de una maquina cliente a otra

Cliente1-Cliente2

Cliente2-Cliente1