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]:
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
:
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:
No se han encontrado comentarios