Configuración de OpenVPN 2.4.3 en openSUSE Linux 15.1

OpenVPN permite implementar túneles de comunicación encriptados y establecer VPN's a través de Internet, que dependiendo de la configuración puede ser entre una o varias redes empresariales u hogareñas, o bien también entre una red y hosts específicos.

En esta guía se abarcará básicamente la configuración necesaria para que un equipo cliente o varios de ellos (Roadwarriors) pueden conectarse mediante Internet a los equipos de una red ubicada detrás del servidor OpenVPN que hace de pasarela.


Servidor OpenVPN para Roadwarriors

La denominación RoadWarrior se refiere a aquellos equipos que siempre están en movimiento y se encuentran conectados al extremo de un túnel VPN normalmente desde una IP dinámica (véase en wikipedia). Esta configuración no contempla una VPN bajo el esquema red a red, sino solamente equipo/s a red como se muestra a modo de ejemplo en el siguiente gráfico:


Finalizando esta sección, quisiera comentarles que primero se abarcarán las configuraciones correspondientes al servidor OpenVPN y posteriormente los pasos para configurar los equipos clientes.


Paquetes requeridos

  1. Debemos verificar que los paquetes requeridos para OpenVPN se encuentren instalados, lo podemos hacer mediante el siguiente comando:
    testsrv:~ # zypper search -i openvpn easy-rsa telnet
  2. Si algunos paquetes no se encuentran instalados los instalamos de la siguiente manera:
    testsrv:~ # zypper install openvpn easy-rsa telnet
    Para openSUSE 15.1 el paquete openvpn que viene en el repositorio es la versión 2.4.3.


Generación de llaves y certificados para CA y servidor

  1. Autoridad de Certificación: En este punto vamos a comenzar a realizar algunos ajustes y configuraciones para preparar la base del servicio OpenVPN. En los siguientes pasos necesitamos generar una llave y un certificado para la Autoridad de Certificación (de ahora en más llamado CA) que en este caso será el mismo equipo en el que va a correr el servidor OpenVPN. Lo primero que debemos hacer es ubicarmos en el directorio /etc/openvpn, creamos el archivo vars a partir del archivo vars.example y lo editamos:
    testsrv:~ # cp /etc/easy-rsa/vars.example /etc/easy-rsa/vars
    testsrv:~ # vi /etc/easy-rsa/vars

    Una vez abierto el archivo vars podemos verificar y descomentar la directiva EASYRSA_KEY_SIZE, para configurar el tamaño de la clave que en esta versión ya se encuentra configurado por defecto en 2048.
    set_var EASYRSA_KEY_SIZE=2048
    Sin embargo, lo más importante que tenemos que configurar es la información relacionada al CA, para ello configuramos las siguientes variables con nuestra información.
    set_var EASYRSA_REQ_COUNTRY     "PY"
    set_var EASYRSA_REQ_PROVINCE "IT"
    set_var EASYRSA_REQ_CITY "nombre_ciudad"
    set_var EASYRSA_REQ_ORG "nombre_organizacion"
    set_var EASYRSA_REQ_EMAIL "admin@dominio"
    set_var EASYRSA_REQ_OU "unidad_de_la_empresa"

    Otras configuraciones importantes a revisar son las directivas EASYRSA_CA_EXPIRE y EASYRSA_CERT_EXPIRE, que permiten configurar la cantidad de días en que expiran automáticamente los certificados generados para la entidad certificadora (CA) y para los roadwarriors respectivamente. En este ejemplo se ha configurado en 100 años la expiración de la entidad certificadora y en 10 años para los roadwarriors, si algún certificado se llega a vencer.
    # In how many days should the root CA key expire?
    
    set_var EASYRSA_CA_EXPIRE       36500
    
    # In how many days should certificates expire?
    
    set_var EASYRSA_CERT_EXPIRE     3650
    
    Y finalmente verificamos que la configuración de la variable EASYRSA_REQ_CN esté debidamente comentada. Esta directiva se utiliza al crear una llave para un cliente, sin embargo, conviene que la misma sea configurada con el nombre del cliente para el cual se generar la llave y no con un nombre genérico, esto se verá más adelante donde mediante un script se seteará dicha directiva cada vez que generemos la llave para un cliente:
    # Default CN:
    # This is best left alone. Interactively you will set this manually, and BATCH
    # callers are expected to set this themselves.

    #set_var EASYRSA_REQ_CN "ChangeMe"

    Salimos del archivo guardando los cambios.

  2. A continuación nos trasladamos al directorio /etc/openvpn:
    testsrv:~ # cd /etc/openvpn
  3. Una vez ubicados en el directorio /etc/openvpn procedemos a ejecutar el comando pkitool para crear la llave y el certificado para la CA:
    testsrv:/etc/openvpn # easyrsa init-pki

    Note: using Easy-RSA configuration from: /etc/easy-rsa/vars

    init-pki complete; you may now create a CA or requests.
    Your newly created PKI dir is: /etc/openvpn/pki

    testsrv:/etc/openvpn #
  4. Generamos la configuración del certificado para la CA:
    testsrv:/etc/openvpn # easyrsa build-ca nopass

    Note: using Easy-RSA configuration from: /etc/easy-rsa/vars

    Using SSL: openssl OpenSSL 1.1.0i-fips 14 Aug 2018

    Enter New CA Key Passphrase:
    Re-Enter New CA Key Passphrase:
    Generating RSA private key, 2048 bit long modulus
    ..+++++
    .......................................+++++
    e is 65537 (0x010001)
    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.
    -----
    Common Name (eg: your user, host, or server name) [Easy-RSA CA]:testsrv

    CA creation complete and you may now import and sign cert requests.
    Your new CA certificate file for publishing is at:
    /etc/openvpn/pki/ca.crt

    testsrv:/etc/openvpn #
  5. Ahora procedemos a generar los parámetros Diffie Hellman, para lo cual ejecutamos la siguiente directiva:
    testsrv:/etc/openvpn # easyrsa gen-dh

    Note: using Easy-RSA configuration from: /etc/easy-rsa/vars

    Using SSL: openssl OpenSSL 1.1.0i-fips 14 Aug 2018
    Generating DH parameters, 2048 bit long safe prime, generator 2
    This is going to take a long time
    .............................................................................
    ................................................................+............
    ............................................+................................
    ................................................+............++*++*++*++*

    DH parameters of size 2048 created at /etc/openvpn/pki/dh.pem

    testsrv:/etc/openvpn #
  6. Generación de llave y certificado para el servidor: En los siguientes pasos vamos a generar la llave y el certificado para el servidor que ejecutará el servicio OpenVPN, para ello ejecutamos nuevamente el comando pkitool pero con los siguientes argumentos:
    testsrv:/etc/openvpn # easyrsa gen-req servidor nopass

    Note: using Easy-RSA configuration from: /etc/easy-rsa/vars

    Using SSL: openssl OpenSSL 1.1.0i-fips 14 Aug 2018
    Generating a 2048 bit RSA private key
    ...+++++
    .........+++++
    writing new private key to '/etc/openvpn/pki/private/servidor.key.fXdSTOSkoX'
    -----
    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.
    -----
    Common Name (eg: your user, host, or server name) [servidor]:testsrv

    Keypair and certificate request completed. Your files are:
    req: /etc/openvpn/pki/reqs/servidor.req
    key: /etc/openvpn/pki/private/servidor.key

    testsrv:/etc/openvpn #
    Una observación, para el tercer parámetro se ha utilizado la palabra servidor, que es el nombre con el cual se genera la petición de firma y el certificado, los archivos resultantes serán servidor.req y servidor.key respectivamente, y que más adelante serán utilizados en la configuración del servicio OpenVPN.

  7. A continuación, la llave servidor.key generada previamente tiene que ser firmada digitalmente por la entidad certificadora (CA):
    testsrv:/etc/openvpn # easyrsa sign-req server servidor

    Note: using Easy-RSA configuration from: /etc/easy-rsa/vars

    Using SSL: openssl OpenSSL 1.1.0i-fips 14 Aug 2018


    You are about to sign the following certificate.
    Please check over the details shown below for accuracy. Note that this request
    has not been cryptographically verified. Please be sure it came from a trusted
    source or that you have verified the request checksum with the sender.

    Request subject, to be signed as a server certificate for 1080 days:

    subject=
    commonName = testsrv


    Type the word 'yes' to continue, or any other input to abort.
    Confirm request details: yes
    Using configuration from /etc/easy-rsa/safessl-easyrsa.cnf
    Can't open /etc/openvpn/pki/index.txt.attr for reading, No such file or directory
    140072140343104:error:02001002:system library:fopen::crypto/bio/bss_file.c:74:fopen('/etc/openvpn/pki/index.txt.attr','r')
    140072140343104:error:2006D080:BIO routines:BIO_new_file:no such file:crypto/bio/bss_file.c:81:
    Check that the request matches the signature
    Signature ok
    The Subject's Distinguished Name is as follows
    commonName :ASN.1 12:'testsrv'
    Certificate is to be certified until Jun 11 17:09:29 2022 GMT (1080 days)

    Write out database with 1 new entries
    Data Base Updated

    Certificate created at: /etc/openvpn/pki/issued/servidor.crt

    testsrv:/etc/openvpn #
  8. Generación de firma HMAC tls-auth: Necesitamos generar una firma HMAC tls-auth que aumenta los niveles de seguridad en varios aspectos. Para ello estando en el directorio /etc/openvpn ejecutamos el siguiente comando:
    testsrv:/etc/openvpn # openvpn --genkey --secret ta.key
    Y con este paso concluimos esta sección.


Configuración del servidor

  1. El archivo server.conf que será utilizado por el servicio OpenVPN lo creamos a partir del archivo de mismo nombre ubicado en el directorio /usr/share/doc/packages/openvpn/sample-config-files como se muestra a continuación:
    testsrv:/etc/openvpn # cp /usr/share/doc/packages/openvpn/sample-config-files/server.conf /etc/openvpn
  2. Procedemos a editar el archivo server.conf:
    testsrv:/etc/openvpn # vi /etc/openvpn/server.conf
    Y configuramos las directivas correspondientes a la entidad CA, al certificado y llave para el servidor, el parámetro DH, la autenticación TLS y la configuración cipher. Es importante aclarar que debemos especificar la ruta completa a los archivos relacionados como se muestra a continuación:
    ca /etc/openvpn/pki/ca.crt
    cert /etc/openvpn/pki/issued/servidor.crt
    key /etc/openvpn/pki/private/servidor.key
    dh /etc/openvpn/pki/dh.pem
    tls-auth /etc/openvpn/ta.key 0
    cipher AES-256-GCM

    Descomentamos la configuración comp-lzo:
    comp-lzo
    Luego descomentamos la directiva client-config-dir ccd que permite definir el directorio en donde se colocarán todas las políticas personalizadas de acceso para cada uno de los clientes que generaremos más adelante.
    client-config-dir ccd
    También debemos descomentar la directiva log-append y debería quedar configurado como sigue:
    log-append /var/log/openvpn.log
    Nos vamos al final del archivo y especificamos la directiva crt-verify y le especificamos el archivo que contendrá los certificados que fueron revocados por el administrador del servicio OpenVPN (los pasos para revocar certificados será abordados más adelante):
    # -- SE AGREGA LA DIRECTIVA QUE ESPECIFICA EL ARCHIVO EN DONDE
    # SE ENCUENTRAN LOS CERTIFICADOS REVOCADOS.
    crl-verify /etc/openvpn/pki/crl.pem

    A continuación de la directiva anterior agregamos la directiva management para definir el host y el puerto desde los cuales se podrá acceder a la consola de administración de OpenVPN. Si bien se puede configurar la dirección IP de la interfaz de red activa para que la consola de administración se encuentre accesible remotamente, se recomienda que solo se habilite en el localhost ya que no solicita usuario ni contraseña al conectarnos a ella.
    # -- SE HABILITA LA CONSOLA DE ADMINISTRACION EN EL PUERTO 1195
    # DE LA INTERFAZ LOCALHOST (Recomendado, ya que al acceder a la
    # consola no pide usuario y contrasenia) DEL SERVIDOR
    management 127.0.0.1 1195

    También agregamos las siguientes configuraciones relacionadas con el MTU:
    # -- CONFIGURACION DEL MTU DE LA INTERFAZ TUN:
    tun-mtu 1500

    Con lo anterior hemos finalizado con la configuración de las directivas del archivo server.conf, guardamos los cambios realizados y salimos del archivo para continuar con el siguiente paso.

  3. Luego creamos los directorios keys para almacenar las llaves de los clientes y ccd (definido en la directiva client-config-dir del paso anterior) para almacenar los archivos de políticas de acceso para los distintos common name de los clientes.
    testsrv:/etc/openvpn # mkdir /etc/openvpn/keys
    testsrv:/etc/openvpn # mkdir /etc/openvpn/ccd

  4. Para evitar problemas durante el arranque necesitamos generar una lista para certificados revocados vacía denominada crl.pem en el directorio /etc/openvpn/pki, para lo cual primero procedemos a editar el archivo de configuración openssl-easyrsa.cnf del directorio /etc/openvpn/pki:
    testsrv:/etc/openvpn # vim /etc/openvpn/pki/openssl-easyrsa.cnf
    A fin de asignar el valor 3650 a las directivas default_days y default_crl_days para evitar expiraciones automáticas de llaves no deseadas como el caso comentado en éste foro.
    #default_days   = $ENV::EASYRSA_CERT_EXPIRE     # how long to certify for
    default_days = 3650 # how long to certify for
    #default_crl_days= $ENV::EASYRSA_CRL_DAYS # how long before next CRL
    default_crl_days= 3650 # how long before next CRL
    Una vez finalizado con lo anterior ya podemos proceder a generar el archivo crl.pem con el siguiente comando:
    testsrv:/etc/openvpn # easyrsa gen-crl

    Note: using Easy-RSA configuration from: /etc/easy-rsa/vars

    Using SSL: openssl OpenSSL 1.1.0i-fips 14 Aug 2018
    Using configuration from /etc/easy-rsa/safessl-easyrsa.cnf

    An updated CRL has been created.
    CRL file: /etc/openvpn/pki/crl.pem

    testsrv:/etc/openvpn #
  5. Activamos el servicio openvpn para que se inicie durante el arranque del sistema operativo y finalmente lo arrancamos con los siguientes comandos:
    testsrv:/etc/openvpn # systemctl enable openvpn@server
    testsrv:/etc/openvpn # systemctl start openvpn@server

    OBS: El @server hace referencia al archivo de configuración server.conf, ya que OpenVPN por defecto no viene con un script tradicional para gestionar el servicio.


Configuración del Firewall

  1. Antes de configurar las directivas del Firewall de OpenSUSE, debemos tener en cuenta que con la ejecución del servicio OpenVPN se generará una nueva interfaz de red lógica para el túnel ssh llamado normalmente por defecto tun0. Recomiendo que la interfaz tun0 se asigne a la zona desmilitarizada (DMZ) y la interfaz de red que utilizamos para nuestra LAN interna (eth0, eth1, etc. o el que hayan usado) a otra zona que utilizamos para ello (externa o interna), esto permite evitar que los servicios habilitados para la interfaz que se conecta a la LAN interna no se encuentren también publicados en la interfaz tun0. De esta forma los clientes (Roadwarriors) que se conecten al servicio OpenVPN (que lo pueden hacer únicamente a través de la interfaz tun0) solo podrán acceder a los servicios del servidor openvpn autorizados para esa zona.

  2. Hecha la aclaración anterior comenzamos a configurar primero la zona pública editando el archivo public.xml del directorio /etc/firewalld/zones, que por defecto suele estar asociada a la interfaz LAN interna (eth0, eth1, etc).
    testsrv:~ # vi /etc/firewalld/zones/public.xml
    Una vez abierto lo dejamos como sigue:
    <?xml version="1.0" encoding="utf-8"?>
    <zone>
    <short>Public</short>
    <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
    <service name="ssh"/>
    <service name="openvpn"/>
    <masquerade/>
    </zone>
    En lo anterior resalta que la zona Public tiene habilitada los servicios ssh y openvpn, y tiene activada la función de enmascaramiento de los paquetes mediante la directiva masquerade.

  3. A continuación creamos a partir del archivo public.xml el archivo dmz.xml para la zona DMZ, luego lo editamos:
    testsrv:~ # cp /etc/firewalld/zones/public.xml /etc/firewalld/zones/dmz.xml
    testsrv:~ # vi /etc/firewalld/zones/dmz.xml

    Y lo dejamos como sigue:
    <?xml version="1.0" encoding="utf-8"?>
    <zone>
    <short>DMZ</short>
    <description>For computers in your demilitarized zone that are publicly-accessible with limited access to your internal network. Only selected incoming connections are accepted.</description>
    <interface name="tun0"/>
    </zone>
    Como se puede observar más arriba, en el archivo dmz.xml se le indica que la interfaz tun0 se encuentra asociada a la zona DMZ, y como no se especifica ningún servicio (como por ejemplo ssh), el cliente remoto no estará autorizado para poder conectarse directamente al servidor OpenVPN a través de dicho protocolo, o lo que sería lo mismo, el firewall del servidor evita que los clientes Roadwarriors puedan conectarse al puerto ssh 22 o a cualquier otro puerto de algún servicio que pueda estar escuchando en la interfaz de red tun0 del servidor (que por defecto suele tener la IP 10.8.0.1/24). También se incluye la directiva masquerade para permitir que el firewall permita enmascarar paquetes de la red corporativa que van al equipo RoadWarrior mediante la interfaz tun0.

  4. El siguiente y último paso consiste en reiniciar el servicio del Firewall con el siguiente comando:
    testsrv:~ # systemctl restart firewalld



IP Forwarding

El siguiente paso que se debe realizar es activar el IP forwarding. Hay varias formas de hacerlo, pero en este caso la configuración se realiza mediante sysctl que no requiere el reinicio del sistema operativo. Los pasos son los siguientes:
  1. Editamos el archivo /etc/sysctl.conf.
    testsrv:~ # vi /etc/sysctl.conf
  2. Asignamos el valor 1 a la siguiente directiva (o la agregamos en el caso de que no exista):
    net.ipv4.ip_forward = 1
    Luego guardamos los cambios y salimos del archivo sysctl.conf.

  3. Para que los cambios tomen efecto en el sistema operativo sin reiniciarlo ejecutamos el siguiente comando:
    testsrv:~ # sysctl -p


Generación de llaves y certificados para roadwarriors

Para crear los certificados y las llaves que utilizarán los clientes vamos a crear un script que nos facilite la tarea de generación automatizando varios pasos que de otra forma deberían ser realizados manualmente. A este script solo será necesario pasarle el Common Name del cliente (el common name debe ser un nombre único para cada cliente) en forma de argumento para generar su correspondiente llave.
  1. Lo primero que vamos a hacer es crear un archivo llamado clientes_crear.sh en el directorio /etc/openvpn:
    testsrv:~ # cd /etc/openvpn
    testsrv:/etc/openvpn # touch clientes_crear.sh

  2. Luego editamos el archivo:
    testsrv:/etc/openvpn # vi clientes_crear.sh
    Y le agregamos el siguiente script bash:
    #!/bin/bash
    #
    # -- Definicion de variables globales

    CLIENT=""
    OPENVPN_DIR=/etc/openvpn
    PKI_DIR=$OPENVPN_DIR/pki
    KEY_DIR=$OPENVPN_DIR/keys

    CA_CRT=$PKI_DIR/ca.crt
    TA_KEY=$OPENVPN_DIR/ta.key
    DEFAULT_SERVER_IP="ip_o_dominio_del_servidor"
    DEFAULT_SERVER_PORT="1194"
    WIN_CFG_FILE=client.ovpn
    LIN_CFG_FILE=client.conf

    # -- Se verifica que se haya pasado el parámetro
    # correspondiente al cliente y que exista la
    # carpeta en donde se van a colocar la llave y
    # los certificados.

    if [ -z "$1" ]; then
    echo "Debe Especificar el nombre del cliente!"
    exit
    else
    CLIENT=$KEY_DIR/$1
    fi
    if ! [ -d "$CLIENT" ]; then
    mkdir -p $CLIENT
    fi

    # -- Se procede a crear la llave y el certificado para
    # el nuevo cliente, y luego firmarlo con la CA..

    export EASYRSA_BATCH=1
    export EASYRSA_REQ_CN=$1
    easyrsa gen-req $1 nopass
    easyrsa sign-req client $1
    mv -v $PKI_DIR/private/$1.* $CLIENT
    cp -v $PKI_DIR/issued/$1.* $CLIENT
    cp -v $CA_CRT $CLIENT
    cp -v $TA_KEY $CLIENT

    # -- Se crean los archivos de configuración para el nuevo
    # cliente, tanto para Windows como para Linux.

    echo "client" > $CLIENT/$WIN_CFG_FILE
    echo "dev tun" >> $CLIENT/$WIN_CFG_FILE
    echo "proto udp" >> $CLIENT/$WIN_CFG_FILE
    echo "resolv-retry infinite" >> $CLIENT/$WIN_CFG_FILE
    echo "nobind" >> $CLIENT/$WIN_CFG_FILE
    echo "persist-key" >> $CLIENT/$WIN_CFG_FILE
    echo "persist-tun" >> $CLIENT/$WIN_CFG_FILE
    echo "ns-cert-type server" >> $CLIENT/$WIN_CFG_FILE
    echo "comp-lzo" >> $CLIENT/$WIN_CFG_FILE
    echo "verb 3" >> $CLIENT/$WIN_CFG_FILE
    echo "ca ca.crt" >> $CLIENT/$WIN_CFG_FILE
    echo "tls-auth ta.key 1" >> $CLIENT/$WIN_CFG_FILE
    echo "tun-mtu 1500" >> $CLIENT/$WIN_CFG_FILE
    echo "cipher AES-256-GCM" >> $CLIENT/$WIN_CFG_FILE
    echo "cert $1.crt" >> $CLIENT/$WIN_CFG_FILE
    echo "key $1.key" >> $CLIENT/$WIN_CFG_FILE

    # -- Se arma la directiva para especificar el servidor y
    # el puerto del servidor openvpn para un cliente Windows.

    if ! [ -z "$2" ]; then
    # -- Se verifica si el puerto se recibió como argumento.
    if ! [ -z "$3" ]; then
    echo "remote $2 $3" >> $CLIENT/$WIN_CFG_FILE
    else
    echo "remote $2 $DEFAULT_SERVER_PORT" >> $CLIENT/$WIN_CFG_FILE
    fi
    else
    echo "remote $DEFAULT_SERVER_IP $DEFAULT_SERVER_PORT" >> $CLIENT/$WIN_CFG_FILE
    fi

    # -- Se crea el archivo de configuración para Linux a partir del
    # archivo de configuración de Windows generado anteriormente.

    cp $CLIENT/$WIN_CFG_FILE $CLIENT/$LIN_CFG_FILE
    echo "log-append /var/log/openvpn.log" >> $CLIENT/$LIN_CFG_FILE
    Lo que hace el script es cargar las variables de entorno para la generación de llaves y certificados OpenVPN, se definen una seria de variables globales para ubicar los archivos ca.crt y ta.key que se necesitaran incluir en el paquete para el nuevo cliente, luego se verifica que se haya pasado como primer argumento ($1) del script el Common Name que se utiliza para nombrar a los archivos certificado (.crt) y llave (.key) del cliente. El siguiente paso automatizado consiste en definir la ruta en donde se colocarán los archivos a ser generados y se crea la carpeta en el caso de que no exista. Posteriormente se generan los archivos para el cliente y se los reubican en el directorio definido, copiándose en el mismo también los archivos ca.crt y ta.key. Por último se crea un archivo de configuración con las directivas necesarias para el cliente y que con la inclusión de los argumentos dos y tres ($2 y $3) en la ejecución del script se puede configurar dinámicamente la dirección IP o nombre de dominio del servidor OpenVPN y el puerto UDP en el cual se ejecuta el servicio respectivamente. El archivo resultante se coloca en el mismo directorio en donde fueron colocados la llave y el certificado del cliente.

    Guardamos los cambios y salimos del archivo.

  3. El siguiente paso consiste en asignarle al archivo clientes_crear.sh los permisos de ejecución correspondientes:
    testsrv:/etc/openvpn # chmod 700 clientes_crear.sh
  4. Ahora ya podemos ejecutar el script, como ejemplo básico podemos crear los archivos para un cliente llamado empresaX:
    testsrv:/etc/openvpn # ./clientes_crear.sh empresaX
    Generating a 2048 bit RSA private key
    ..........................+++++
    ...........................................................+++++
    writing new private key to '/etc/openvpn/pki/private/empresaX.key.MnvO5YHgV8'
    -----
    Using configuration from /etc/easy-rsa/safessl-easyrsa.cnf
    Check that the request matches the signature
    Signature ok
    The Subject's Distinguished Name is as follows
    commonName :ASN.1 12:'empresaX'
    Certificate is to be certified until Aug 27 02:41:17 2022 GMT (1080 days)

    Write out database with 1 new entries
    Data Base Updated
    renamed '/etc/openvpn/pki/private/empresaX.key' -> '/etc/openvpn/keys/empresaX/empresaX.key'
    '/etc/openvpn/pki/issued/empresaX.crt' -> '/etc/openvpn/keys/empresaX/empresaX.crt'
    '/etc/openvpn/pki/ca.crt' -> '/etc/openvpn/keys/empresaX/ca.crt'
    '/etc/openvpn/ta.key' -> '/etc/openvpn/keys/empresaX/ta.key'
    testsrv:/etc/openvpn #
    Otro ejemplo podría ser crear los archivos para un cliente llamado empresaX y que la configuración del servidor remoto tenga como IP y puerto lo siguiente:
    testsrv:/etc/openvpn # ./clientes_crear.sh empresaX 192.168.1.3 1194
  5. Finalizado la ejecución del script se generará una carpeta con el common name empresaX (en base a los ejemplos del paso anterior) en el directorio /etc/openvpn/keys con los archivos que deberán ser entregados al cliente, la lista de archivos es la siguiente:
    • ca.crt
    • ta.key
    • empresaX.crt
    • empresaX.key
    • client.ovpn
    • client.conf

  6. Aun nos faltan definir los hosts o nuestras redes corporativas a las cuales deseamos dar acceso a nuestro cliente, esto es algo que se puede definir fácilmente en nuestro servidor OpenVPN. Para lograr lo mencionado anteriormente debemos acceder al directorio /etc/openvpn/ccd y crear un archivo de configuración para el cliente con el CommonName utilizado para el mismo, en este caso utilizaremos como ejemplo nuevemente empresaX:
    testsrv:~ # cd /etc/openvpn/ccd/
    testsrv:/etc/openvpn/ccd # touch empresaX

    Accedemos al archivo empresaX,
    testsrv:/etc/openvpn/ccd # vi empresaX
    y le asignamos las políticas que nos parezcan, por ejemplo, podemos autorizar al cliente empresaX para que pueda acceder a una red interna con el rango 192.168.1.0/24, la directiva quedaría como sigue:
    push "route 192.168.1.0 255.255.255.0"
    También podríamos otorgar al cliente el acceso a una sola estación de trabajo que se encuentra dentro de la red interna 192.168.1.0/24 mencionada anteriormente.
    push "route 192.168.1.2 255.255.255.255"
  7. Con el paso anterior culminamos con esta sección ya pudiendo generar los archivos necesarios para nuestros clientes.


Revocar certificados

Revocar un certificado consiste en invalidar uno que habíamos creado previamente y que por alguna razón necesitamos que deje de ser útil. Al revocar un certificado el cliente afectado ya no podrá conectarse al servicio OpenVPN, ya que este último rechazará todas aquellas conexiones que utilicen el certificado en cuestión.

Podemos automatizar las cosas creando un script que simplifique la tarea de revocar los certificados de los clientes, los pasos a seguir se exponen a continuación.
  1. Nos dirigimos al directorio /etc/openvpn y creamos un nuevo archivo de texto plano llamado clientes_revocar.sh:
    testsrv:~ # cd /etc/openvpn
    testsrv:/etc/openvpn # touch clientes_revocar.sh

  2. Luego editamos el archivo clientes_revocar.sh:
    testsrv:/etc/openvpn # vi clientes_revocar.sh
    y le agregamos el siguiente contenido:
    #!/bin/bash
    #
    # SCRIPT PARA REVOCAR LLAVES DE CLIENTES.
    #
    # -- Se verifica que se haya pasado el common name
    # del cliente como argumento.

    if [ -z "$1" ]; then
    echo "Debe Especificar el nombre del cliente!"
    exit
    fi

    # -- Se procede a revocar la llave del cliente.
    export EASYRSA_BATCH=1
    export EASYRSA_REQ_CN=$1
    easyrsa revoke $1
    easyrsa gen-crl
    Guardamos los cambios del archivo y salimos del mismo.

  3. Le otorgamos los permisos de ejecución necesarios:
    testsrv:/etc/openvpn # chmod 700 clientes_revocar.sh
  4. Y con eso ya está, ya podemos revocar los certificados ejecutando el script clientes_revocar.sh de la siguiente forma:
    testsrv:/etc/openvpn # ./clientes_revocar.sh empresaX
    Using configuration from /etc/easy-rsa/safessl-easyrsa.cnf
    Revoking Certificate 59C71CFB43E54378656640E37504EFDF.
    Data Base Updated
    Using configuration from /etc/easy-rsa/safessl-easyrsa.cnf
    testsrv:/etc/openvpn #
    Según manual, si hemos revocado un cliente mientras este se encuentre conectado, su conexión seguirá funcionando hasta tanto intente renegociar su conexión que en OpenVPN se encuentra configurado por defecto en una (1) hora. Esta configuración se puede modificar declarando la directiva reneg-sec n en el archivo /etc/openvpn/server.conf, donde n es la cantidad de segundos que se desea esperar entre cada renegociación de conexión y que por defecto está configurado de forma implícita en 3600 segundos, o lo que es lo mismo, la 1 hora que había mencionado al principio.

    Sin embargo, en el entorno de pruebas que configuré, la renegociación de la conexión de un cliente revocado no evitó que el tunel dejara de funcionar, tiraba un montón de errores de conexión en el log del servidor, pero el túnel seguía funcionando en ambas direcciones sin problemas. Para forzar que el servidor y el cliente se den cuenta de que el certificado se encuentra revocado, el único procedimiento que me funcionó fue reiniciar el servicio openvpn, con todo lo que ello implica para las demás conexiones activas y vigentes:
    testsrv:/etc/openvpn # systemctl restart openvpn@server


Consola de administración de OpenVPN

Anteriormente, cuando configuramos el servicio OpenVPN mediante el archivo de configuración server.conf agregamos la directiva management cuya funcionalidad era la de activar la consola de administración del servicio, como en ese momento no se especificó la forma de acceder a dicha herramienta nos encargaremos de eso en esta sección.
  1. Para acceder a la consola de administración del servico OpenVPN hacemos uso del protocolo telnet especificando el host y el puerto como se muestra con el siguiente comando:
    testsrv:~ # telnet 127.0.0.1 1195
  2. El comando anterior desplegará una interfaz que nos permitirá introducir comandos para gestionar el servicio, a modo de ejemplo les dejo con la salida de la ejecución del comando state, pero si desean conocer la lista completa de opciones pueden ejecutar el comando help:
    testsrv:~ # telnet 127.0.0.1 1195
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.
    >INFO:OpenVPN Management Interface Version 1 -- type 'help' for more info
    state
    1295529194,CONNECTED,SUCCESS,10.8.0.1,
    END
    exit
    Connection closed by foreign host.
    testsrv:~ #


Clientes OpenVPN en Windows

A continuación se verán los pasos necesarios para configurar el cliente OpenVPN en Windows. Es importante tener en cuenta que en los equipos clientes la red de su interfaz debe ser distinta a las redes autorizadas en el servidor OpenVPN (en el archivo /etc/openvpn/ccd/empresaX), ya que en caso contrario se generará un conflicto en el ruteo de las redes. El equipo cliente no podrá identificar correctamente su propia red local con la red remota a la cual puede acceder a través del túnel de la VPN.
  1. Si bien se recomienda descargar la última versión del programa OpenVPN para Windows desde su sitio oficial en Internet, para estas pruebas se usó la versión 2.4.7 que ha funcionado correctamente con la versión 2.4.3 del servidor Linux.
    URL: https://openvpn.net/community-downloads/
  2. En el directorio C:\Archivos de programa\OpenVPN\config le copiamos los archivos generados en el servidor para nuestro cliente, en esta guía el cliente de ejemplo será "empresaX", los archivos que deben estar en ese directorio son los siguientes:
    • ca.crt
    • ta.key
    • empresaX.crt
    • empresaX.key
    • client.ovpn
    • client.conf (No requerido para Windows)

    OPCIONAL: Si no disponemos de un archivo de configuración .ovpn generado por el script clientes_crear.sh mencionado en el apartado Generación de llave y certificado para el cliente de esta guía, podemos crear ese archivo de configuración a partir de un archivo de ejemplo que viene junto con la instalación, para ello creamos una copia del archivo C:\Archivos de programa\OpenVPN\sample-config\client.ovpn en el directorio C:\Archivos de programa\OpenVPN\config, luego editamos el archivo con nuestro editor preferido y le seteamos las siguientes directivas:
    remote ip_o_dominio_de_servidor 1194
    ca ca.crt
    cert empresaX.crt
    key empresaX.key
    tls-auth ta.key 1

    Guardamos los cambios del archivo.

  3. Luego debemos configurar la ejecución del cliente openvpn como un servicio, para ello nos dirigimos a Panel de Control -> Herramientas Administrativas -> Servicios, en la ventana de la aplicación servicios buscamos la opción openvpn y la configuramos para que arranque de forma automática durante el inicio del sistema operativo. Esta opción funciona muy bien y es la recomendada, ya que mientras no haya conexión a Internet el servicio se mantendrá inactivo, cuando se restablece la conexión a Internet el servicio openvpn automáticamente también se iniciará estableciendo la conexión sin contratiempos y sin intervención del usuario.

    Si no queremos utilizar el servicio podemos ejecutar la aplicación OpenVPN GUI como administrador, cuyo icono se ubicará en el área de notificaciones y sobre el cual tenemos que hacer un clic con el botón derecho del mouse para seleccionar la opción Connect. Esta opción no es tan recomendada porque cuando no se ejecuta con permisos de administrador el programa puede no tener los permisos necesarios para establecer el túnel y crear las rutas, sin contemplar que el operador puede cerrar la aplicación o cambiar alguna configuración por error.

  4. Para finalizar podemos controlar las rutas que fueron agregadas a la tabla de ruteo del sistema operativo luego de que el túnel se haya establecido de forma exitosa:
    C:\>route print

Vencimiento de Certificados

Dejo una pequeña nota al final del artículo para recordar que si no hemos configurado apropiadamente las directivas EASYRSA_CA_EXPIRE y EASYRSA_CERT_EXPIRE en el archivo /etc/easy-rsa/vars, es posible que nuestros certificados expiren automáticamente en el momento menos previsto.

Si les llega a expirar automáticamente un certificado de un roadwarrior, lo único que tenemos que hacer es volver a generar un nuevo certificado con el script clientes_crear.sh, usando el mismo nombre de cliente, y enviarle los nuevos archivos al equipo cliente para reemplazar los antiguos.

Ahora bien, si el certificado de la Entidad Certificadora llega a expirar el problema será mucho mayor, ya que es posible que se tenga que volver a generar el certificado para la CA y luego volver a generar de nuevo todos los certificados para los equipos clientes, ya que al cambiar el certificado del CA todos los demás certificados ya quedarán obsoletos.

Comentarios

  1. Hola buenas, felicidades por el excelente manual que ofreces. Tuve un problema y quiero saber si sabes la solución. Agradezco cualquier orientación. Saludos

    localhost:/etc/openvpn # easyrsa gen-crl

    Note: using Easy-RSA configuration from: /etc/easy-rsa/vars

    Using SSL: openssl OpenSSL 1.1.1d 10 Sep 2019
    Using configuration from /etc/easy-rsa/safessl-easyrsa.cnf
    ca: Error on line 141 of config file "/etc/easy-rsa/safessl-easyrsa.cnf"
    140669627835008:error:0E079065:configuration file routines:def_load_bio:missing equal sign:crypto/conf/conf_def.c:391:line 141
    140669627835008:error:0E079065:configuration file routines:def_load_bio:missing equal sign:crypto/conf/conf_def.c:391:line 141

    Easy-RSA error:

    CRL Generation failed.

    Mi correo para contacto es politikon1@gmail.com
    GRACIAS

    ResponderEliminar
    Respuestas
    1. Hola, la verdad que no sabría decirte, al parecer hay algún error con la configuración del archivo "safessl-easyrsa.cnf":

      Error on line 141 of config file "/etc/easy-rsa/safessl-easyrsa.cnf"

      No se si llegaste a modificar algo de ese archivo, o es un problema de la versión en particular que instalaste.

      Eliminar

Publicar un comentario