En este artículo os voy a enseñar como configurar un servidor OpenVPN en un EdgeRouter y como crear clientes para que se autentiquen contra nuestro EdgeRouter. Pero antes de ponernos manos a la obra te hablaré un poco acerca de OpenVPN
¿Que es OpenVPN?
OpenVPN es un un servidor/cliente VPN. Su uso más frecuente es acceder a internet de forma anónima. Aunque también puede tener otros usos como por ejemplo conectarte desde tu casa a la oficina de trabajo.
¿Cómo funciona OpenVPN?
Como te comente anteriormente OpenVPN está compuesto por un servidor y un cliente OpenVPN. El servidor está conectado a internet y el cliente se conecta al servidor para obtener acceso a internet. El cliente toma la misma localización geográfica e IP que el servidor .
¿Cómo instalar y configurar un servidor OpenVPN en EdgeRouter?
Ahora te mostraré como instalar y configurar un servidor OpenVPN en tú EdgeRouter. Estás listo? Pues manos a la obra!!
Pasos a seguir para instalar un servidor OpenVPN en un EdgeRouter
- Conectate por ssh a tu EdgeRouter
Lo primero que tendremos que hacer es conectarnos por ssh al EdgeRouter. Para ello entra en la consola de comandos y ejecuta lo siguiente:
ssh usuario@ipEdgeRouter (El usuario y contraseña por defecto del router es ubnt) - Ejecuta el comando «sudo su -«
Una vez conectado por ssh lo primero que tendrás que hacer es obtener permisos de super usuario, para ello ejecuta el comando sudo su – . A continuación te pedirá la contraseña (recuerda si no la cambiaste, la contraseña por defecto es ubnt)
- Creamos la Autoridad Certificadora
Lo siguiente es movernos a la carpeta misc.
Para ello ejecutamos el siguiente comando: cd /usr/lib/ssl/misc/
A continuación creamos la Autoridad Certificadora. Para ello ejecutamos el siguiente comando: ./CA.sh -newca
Te pedirá los siguientes datos:
PEM Passphrase: Abc123..(creamos una contraseña, en mi caso Abc123..)
Country Name: ES (código del pais, en mi caso es ES)
State Or Province Name: Galicia (Nombre de la comunidad autónoma, en mi caso Galicia)
Locality Name: Lugo (Nombre de la ciudad, en mi caso Lugo)
Organization Name: raulfranco.es (Nombre de la organización)
Organizational Unit Name: raulfranco (Nombre de la unidad de la organización)
Common Name: root
Email Address: email@example.com(Introducimos un email) - Creamos el certificado del servidor
Creamos el certificado del servidor ejecutando el siguiente comando:
./CA.sh -newreq
Te pedirá los siguientes datos:
Country Name: ES
State Or Province Name: Galicia
Locality Name: Lugo
Organization Name: raulfranco.es
Organizational Unit Name: raulfranco
Common Name: server
Email Address: email@example.com - Firmamos certificado del servidor
Ejecutamos el siguiente comando para firmar el certificado que acabamos de generar:
./CA.sh -sign - Copiamos archivos generados al directorio /config/auth/:
A continuación tendremos que copiar los siguientes archivos al directorio /config/auth/ . Para ello ejecutamos el siguiente comando:
cp /usr/lib/ssl/misc/demoCA/cacert.pem /config/auth/
cp /usr/lib/ssl/misc/demoCA/private/cakey.pem /config/auth/
mv /usr/lib/ssl/misc/newcert.pem /config/auth/host.pem
mv /usr/lib/ssl/misc/newkey.pem /config/auth/host.key - Generamos la clave Diffie-Hellman (puede tardar horas en generarse)
Vamos a generar la clave Diffie-Hellman. Esto puede tardar bastante tiempo así que haz café y ten paciencia. El comando para generarla es el siguiente:
openssl dhparam -out /config/auth/dh2048.pem -2 2048 - Generamos el certificado del cliente:
Tenemos que generar los certificados de los clientes . Para ello ejecutamos el siguiente comando:
./CA.sh -newreq
Te pedirá los siguientes datos:
Country Name: ES
State Or Province Name: Galicia
Locality Name: Lugo
Organization Name: raulfranco.es
Organizational Unit Name: raulfranco
Common Name: client1
Email Address: email@example.com - Firmamos el certificado del cliente:
Vamos a firmar el certificado del cliente, para ello tenemos que ejecutar el siguiente comando:
./CA.sh -sign - Movemos los archivos generados del cliente a la carpeta /config/auth/:
Vamos a copiar los archivos que acabamos de generar a la carpeta /config/auth/. Para ello:
mv newcert.pem /config/auth/client1.pem
mv newkey.pem /config/auth/client1.key - Generamos las claves de desencriptado
Generamos las claves de desencriptado:
openssl rsa -in /config/auth/host.key -out /config/auth/host-decrypted.key
openssl rsa -in /config/auth/client1.key -out /config/auth/client1-decrypted.key - Seguimos los pasos 8,9,10,11 por cada cliente que queramos crear.
Ahora debemos seguir los pasos 8,9,10,11 para crear tantos clientes vpn como queramos. Recuerda los comandos a ejecutar por cada cliente son los siguientes:
cd /usr/lib/ssl/misc/
./CA.sh -newreq
./CA.sh -sign
mv newcert.pem /config/auth/client.pem
mv newkey.pem /config/auth/client.key
openssl rsa -in /config/auth/host.key -out /config/auth/host-decrypted.key
openssl rsa -in /config/auth/client10.key -out /config/auth/client-decrypted.key
OJO!El common Name debe ser único para cada cliente - Configurar interfaces
Ahora debemos de configurar las interfaces de nuestro EdgeRouter. Para ello debemos entrar en el modo de configuración. Para ello ejecutamos el siguiente comando:
configure
a continuación realizamos la siguiente configuración:
set interfaces openvpn vtun0 mode server
set interfaces openvpn vtun0 server subnet X.X.X.X/X
set interfaces openvpn vtun0 server push-route X.X.X.X/X
set interfaces openvpn vtun0 server name-server X.X.X.X
set interfaces openvpn vtun0 tls ca-cert-file /config/auth/cacert.pem
set interfaces openvpn vtun0 tls cert-file /config/auth/host.pem
set interfaces openvpn vtun0 tls key-file /config/auth/host-decrypted.key
set interfaces openvpn vtun0 tls dh-file /config/auth/dh2048.pem
set interfaces openvpn vtun0 description «OpenVPN server»
set interfaces openvpn vtun0 encryption aes256
set interfaces openvpn vtun0 hash sha256
set interfaces openvpn vtun0 openvpn-option «- -port 1194»
set interfaces openvpn vtun0 openvpn-option – -tls-server
set interfaces openvpn vtun0 openvpn-option «- -comp-lzo yes»
set interfaces openvpn vtun0 openvpn-option – -persist-key
set interfaces openvpn vtun0 openvpn-option – -persist-tun
set interfaces openvpn vtun0 openvpn-option «- -keepalive 10 120»
set interfaces openvpn vtun0 openvpn-option «- -user nobody»
set interfaces openvpn vtun0 openvpn-option «- -group nogroup»
server subnet: subred en la que estará la VPN
server push-route: red a la que desea acceder de forma remota
server name-server: ip del router - Establecemos las siguientes reglas en el firewall:
Ahora vamos a establecer las siguientes reglas en el firewall:
set firewall name WAN_LOCAL rule 30 action accept
set firewall name WAN_LOCAL rule 30 description OpenVPN
set firewall name WAN_LOCAL rule 30 destination port 11
set firewall name WAN_LOCAL rule 30 protocol udp - Configuramos el servidor dns para que escuche las solicitudes en la interfaz de la vpn
Ahora vamos a configurar el servidor dns para que escuche las solicitudes que se produzcan en la interfaz de la vpn.
set service dns forwarding listen-on vtun0 - Copiamos los archivos de los clientes vpn a nuestro equipo
Ahora necesitamos copiar los archivos cacert.pem, client.pem y client-decrypted.key. Todos estos archivos estan en /config/auth/ . Puedes copiarlos usando scp. De todas formas unas lines más abajo te dejaré un pequeño Script que te ayudará a realizar la copia de manera sencilla.
- Generamos un archivo .ovpn para los clientes.
Para ello partimos de esta plantilla:
client
dev tun
proto udp
remote dominio\ip 1194
cipher AES-256-CBC
redirect-gateway def1
auth SHA256
resolv-retry infinite
nobind
comp-lzo yes
persist-key
persist-tun
user nobody
group nogroup
verb 3
<ca>
pegar contenido cacert.pem
</ca>
<cert>
pegar client.pem
</cert>
<key>
pegar client-decrypted.key
</key>
Ojo, si ponemos la opción redirect-gateway def1 dentro del fichero de configuración tal y como está en el código anterior salimos a internet a través de la conexión de internet del servidor (pues como valor de la puerta de enlace predeterminada toma la del servidor remoto), por lo que no conviene ponerla en la mayoría de casos.
Script que automatiza la copia de archivos del servidor
Como te mencione anteriormente te voy a pasar un Script escrito en Python. Ese script te copia los archivos generados por cada cliente OpenVpn.
El script es el siguiente:
#!/usr/bin/python3
import os
import shutil
import paramiko
import re
#Variable Router
router=input("Introduzca la dirección del router: ")
#Funcion que comprueba que la dirección ip introduccida tiene un formato correcto
def comprobacion(ip):
val_ip=bool(re.match("^(?:(?:\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.){3}(?:\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])$",ip))
return val_ip
comprobacion(router)
#Si la dirección ip no tiene un formato correcto la vuelve a pedir
while comprobacion(router)== False:
print("La Ip que has introduccido es erronea")
router=input("Introduzca la ip del router al que quieres acceder: ")
#Pasar datos por teclado(username,password,CAname,ServerName e ClientName)
username=input("Introduzca el Usuario: ")
password=input("Introduce la contraseña: ")
port=input("Introduce el puerto ")
cliente=input(" Introduce el nombre del cliente: ")
clientepem=cliente+".pem"
clientedecrypted=cliente+"-decrypted.key"
#Generar archivo apartir de plantilla
rutacert=cliente+".ovpn"
shutil.copy("plantillaovpn.txt", rutacert)
#Generador archivo .ovpn
fichero = open(rutacert,'r')
cadena = fichero.read()
cadena = cadena.replace("direccion",router)
cadena = cadena.replace("clientepem",clientepem)
cadena = cadena.replace("clientedecrypted",clientedecrypted)
fichero.close()
fichero = open(rutacert,'w')
fichero.write(cadena)
fichero.close()
#Copia SCP archivos necesarios para conectarse a la VPN
completo="scp -P "+ port +" "+ username +"@" + router +":/config/auth/cacert.pem"+" ."
os.system(completo)
completo="scp -P "+ port +" "+ username +"@" + router +":/config/auth/"+cliente+".pem"+" ."
os.system(completo)
completo="scp -P "+ port +" "+ username +"@" + router +":/config/auth/"+cliente+"-decrypted.key"+" ."
os.system(completo)
Como ves es un script muy sencillo. Te pide que le pases los siguientes cuatro parámetros por teclado:
- Dirección del Router: ip de tu EdgeRouter
- Usuario: usuario con que te conectaste al router por ssh
- Contraseña: contraseña del usuario
- Puerto: puerto ssh
- Cliente: nombre del cliente VPN que has creado.
Una vez ejecutado copiará los ficheros cacert.pem,client.pem y client-decrypted.key que necesitarás para generar el fichero .ovpn de los clientes.
¿Como conectar el cliente OpenVPN al servidor OpenVPN?
Para conectarse con el cliente es muy sencillo. Desde la web de OpenVPN puedes instalar el programa necesario para conectarte contra el servidor. Te dejo el enlace: clientes OpenVPN .
Yo personalmente no empleé ese cliente. El ordenador que utilizo es un Ubuntu así que directamente hice lo siguiente:
- Primero generé el archivo .ovpn del cliente con el que me quiero conectar. Lo generé siguiendo los pasos que te comente anteriormente.
- Ahora vamos a configuración de red y en VPN y pulso en el +.

- Ahora sellecionamos importar desde un archivo y seleccionamos el arhivo .ovpn del cliente.
Una vez hecho eso ya estariamos conectados. Como ves, nos llevó un tiempo realizar la configuración pero no tiene mucha complicación.
Te animo a que lo pruebes por ti mismo y si tienes algún problema contactes conmigo y miramos de solucionarlo.
Manuales de referencia
Te voy a dejar una serie de tutoriales que me sirvieron de mucha ayuda y creo que a ti también te pueden servir:
Hola mi nombre es Oscar quisiera saber como ver los usuarios que están conectados?
show openvpn status server