Configurar Servidor y cliente OpenVPN en un EdgeRouter

openvpn

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

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

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

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

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

  5. Firmamos certificado del servidor

    Ejecutamos el siguiente comando para firmar el certificado que acabamos de generar:
    ./CA.sh -sign

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

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

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

  9. Firmamos el certificado del cliente:

    Vamos a firmar el certificado del cliente, para ello tenemos que ejecutar el siguiente comando:
    ./CA.sh -sign

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

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

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

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

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

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

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

  17. 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:

  1. Dirección del Router: ip de tu EdgeRouter
  2. Usuario: usuario con que te conectaste al router por ssh
  3. Contraseña: contraseña del usuario
  4. Puerto: puerto ssh
  5. 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: